Spring

[스프링/JDBC Template] 스프링-디비1편 6-2. JDBC Template

ydin 2024. 2. 2. 15:42

서비스 계층의 순수함을 유지하기 위한 과정을 지나왔다. 서비스 계층은 어느정도 순수함을 유지하게 되었으니, 이제는 리포지토리에서 JDBC에서 발생하는 코드 반복 문제를 해결해보자.

 

JDBC 코드 반복 문제

반복되는 JDBC 코드는 다음과 같다.

  • 커넥션 관련 - 조회, 동기화
  • PreparedStatement 생성 및 파라미터 바인딩
  • 쿼리 실행
  • 결과 바인딩
  • 예외 발생시 스프링 예외 변환기 실행
  • 리소스 종료

 

템플릿 콜백 패턴

이토록 같은 처리 과정이 중복되는 것을 확인할 수 있다. 이런 반복을 효과적으로 처리할 수 있는 방법이 바로 템플릿 콜백 패턴이다.

스프링은 JDBC의 반복 문제를 해결하기 위해 JDBCTemplate 이라는 템플릿을 제공한다. JDBCTemplate을 사용하면 다음과 같이 코드가 많이 줄어드는 것을 확인할 수 있다.

 

  • 회원 저장 함수
@Override
public Member save(Member member) {
    String sql = "insert into member(member_id, money) values(?, ?)";
    template.update(sql, member.getMemberId(), member.getMoney());
    return member;
}

원래는 커넥션 관련, 구문, 쿼리 실행, 결과 바인딩 등 몇 십줄의 코드가 있었는데 JDBCTemplate을 적용하니 template.update()처럼 JDBCTemplate 인스턴스에 함수 하나마 호출하면 위 과정을 한번에 처리할 수 있다.

 

  • 회원 정보 조회 함수
    • 조회 로직도 저장 로직과 비슷한데 RowMapper라는 게 달라서 기록한다.
    • 쿼리 결과를 바인딩할 때 사용하는 것 같다.
@Override
public void update(String memberId, int money) {
    String sql = "update member set money=? where member_id=?";
    template.update(sql, money, memberId);
}

private RowMapper<Member> memberRowMapper() {
    return (rs, rowNum) -> {
        Member member = new Member();
        member.setMemberId(rs.getString("member_id"));
        member.setMoney(rs.getInt("money"));

        return member;
    }; 
}

 

정리

JDBCTemplate을 활용해 JDBC로 개발시 발생하는 반복 문제를 대부분 해결해준다. 뿐만 아니라 트랜잭션을 위한 동기화, 예외 발생시 스프링 예외 변환기도 자동으로 실행해준다. 참 편리해졌다!

 

최종 정리

  • 서비스 계층의 순수성
    • 트랜잭션 추상화 + 트랜잭션 AOP 덕분에 서비스 계층의 순수성을 최대한 유지하면서 서비스 계층에서 트랜잭션을 사용할 수 있다.
    • 스프링이 제공하는 예외 추상화와 예외 변환기 덕분에, 데이터 접근 기술이 변경되어도 서비스 계층의 순수성을 유지하면서 예외도 사용할 수 있다.
    • 서비스 계층이 리포지토리 인터페이스에 의존한 덕분에 향후 리포지토리가 다른 구현 기술로 변경되어도 서비스 계층을 순수하게 유지할 수 있다.
  • 리포지토리에서 JDBC를 사용하는 반복 코드가 JdbcTemplate 으로 대부분 제거되었다.

데이터 소스, 트랜잭션, 자바 예외, 스프링 예외 등 나름 알고 있다고 생각했었는데, 이 강의를 들으면서 내 기본기가 많이 약하다는 것을 알게 되었다.

기본기부터 찬찬히 원리를 이해하며 공부할 수 있어서 유익했다!

 

 

Reference

인프런 김영한 - '스프링 DB 1 - 데이터 접근 핵심 원리'