서비스 계층의 순수함을 유지하기 위한 과정을 지나왔다. 서비스 계층은 어느정도 순수함을 유지하게 되었으니, 이제는 리포지토리에서 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편 - 데이터 접근 핵심 원리'
'Spring' 카테고리의 다른 글
[스프링/예외] 스프링-디비1 6-1. 스프링과 문제 해결 - 예외 처리, 반복 (0) | 2024.02.02 |
---|---|
[스프링/@Transactional] 4-2. 트랜잭션 AOP 이해 (0) | 2024.02.01 |
[스프링/트랜잭션] 4-1. 스프링의 트랜잭션 (0) | 2024.02.01 |
[스프링/DataSource] 스프링-DB 1편 2. ConnectionPool, DataSource의 이해 (0) | 2024.01.30 |
[Spring] @PostConstruct에 관해서 몇가지 정리 (0) | 2022.03.18 |