ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JdbcTemplate
    BackEnd/Spring DB 2023. 1. 28. 10:00
    반응형

      지금까지 서비스 계층의 순수함을 유지하는 방법에 대해 알아보았습니다. 이번 포스팅에서는 리포지토리에서 JDBC를 사용하기 때문에 발생하는 반복문제를 해결합니다.

     

    JDBC 반복 문제

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

     

      리포지토리의 각각의 메서드를 살펴보면 상당히 많은 부분이 반복됩니다. 이런 반복을 효과적으로 처리하는 방법이 템플릿 콜백 패턴입니다. 스프링은 JDBC의 반복 문제를 해결하기 위해 JdbcTemplate이라는 템플릿을 제공합니다.

     

      JdbcTemplate은 JDBC로 개발할 때 발생하는 반복을 대부분 해결해줍니다. 그 뿐만 아니라 지금까지 학습했던 트랜잭션을 위한 커넥션 동기화는 물론이고, 예외 발생 시 스프링 예외 변환기도 자동으로 실행해줍니다. 다음은 JdbcTemplate 적용 코드입니다.

    package hello.jdbc.repository;
    
    import hello.jdbc.domain.Member;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    
    import javax.sql.DataSource;
    
    /**
     * JdbcTemplate 사용
     */
    @Slf4j
    public class MemberRepositoryV5 implements MemberRepository {
    
        private final JdbcTemplate template;
    
        public MemberRepositoryV5(DataSource dataSource) {
            this.template = new JdbcTemplate(dataSource);
        }
    
        @Override
        public Member save(Member member) {
            String sql = "insert into member(member_id, money) values (?, ?)";
            template.update(sql, member.getMemberId(), member.getMoney());
            return member;
        }
    
        @Override
        public Member findById(String memberId) {
            String sql = "select * from member where member_id = ?";
            return template.queryForObject(sql, memberRowMapper(), memberId);
        }
    
        @Override
        public void update(String memberId, int money) {
            String sql = "update member set money=? where member_id=?";
            template.update(sql, money, memberId);
        }
    
        @Override
        public void delete(String memberId) {
            String sql = "delete from member where member_id=?";
            template.update(sql, 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;
            };
        }
    
    }

     

    완성된 코드

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

     

    [참고 정보]

    스프링 DB 1편 - 데이터 접근 핵심 원리

    전체 소스코드

    반응형

    'BackEnd > Spring DB' 카테고리의 다른 글

    데이터 접근 기술- 스프링 JdbcTemplate  (0) 2023.02.01
    데이터 접근 기술- Memory  (0) 2023.01.31
    예외(Exception) (2)  (0) 2023.01.28
    예외(Exception) (1)  (0) 2023.01.28
    트랜잭션(Transaction)  (0) 2023.01.27

    댓글

Designed by Tistory.