-
JdbcTemplateBackEnd/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으로 대부분 제거되었습니다.
[참고 정보]
반응형'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