이전에 트랜잭션을 적용하면서 서비스 계층이 복잡해지는 문제가 있었다.
먼저 애플리케이션 구조를 단순하게 나눠서 살펴보면
프레젠테이션 계층
UI와 관련된 처리 담당
웹 요청과 응답
사용자 요청을 검증
주 사용 기술: 서블릿과 HTTP 같은 웹 기술, 스프링 MVC
서비스 계층
비즈니스 로직 담당
주 사용 기술: 가급적 특정기술에 의존하지 않고, 순수 자바 코드로 작성
데이터 접근 계층
실제 데이터베이스에 접근하는 코드
주 사용 기술: JDBC, JPA, File, Mongo ...
서비스 계층을 순수하게 개발해야하는 이유
비즈니스 로직은 최대한 변경없이 유지되어야 한다..
계층을 나눈 이유도 서비스 계층을 최대한 순수하게 유지하기 위한 목적이 크다. 기술에 종속적인 부분은 프레젠테이션 계층, 데이터 접근 계층에서 가지고 간다.
서비스 계층은 가급적 비즈니스 로직만 구현하고 특정 구현 기술에 직접 의존해서는 안된다. 이렇게 하면 향후 구현 기술이 변경될 때 변경의 영향 범위를 최소화 할 수 있다.
트랜잭션을 비즈니스 로직이 있는 서비스 계층에서 시작한 경우
트랜잭션을 사용하기 위해서 javax.sql.DataSource , java.sql.Connection , java.sql.SQLException 같은 JDBC 기술에 의존해야 한다.
향후 JDBC에서 JPA 같은 다른 기술로 바꾸어 사용하게 되면 서비스 코드도 모두 함께 변경해야 한다.
위 코드에는 3가지 문제가 있다.
- 트랜잭션 문제
- 예외 누수 문제
- JDBC 반복 문제
트랜잭션 문제
JDBC 구현 기술이 서비스 계층에 누수되는 문제
- 트랜잭션을 적용하기 위해 JDBC 구현 기술이 서비스 계층에 누수되었다.
트랜잭션 동기화 문제
- 같은 트랜잭션을 유지하기 위해 커넥션을 파라미터로 넘겨야 한다.
- 이때 파생되는 문제들도 있다. 똑같은 기능도 트랜잭션용 기능과 트랜잭션을 유지하지 않아도 되는 기능으로 분리해야 한다.
- 예를 들어서 findById기능을 트랜잭션용 기능과 트랜잭션 미적용 기능을 만들기 위해서 똑같은 기능을 2개로 분리해야한다. (findById(con, id), findById(id))
트랜잭션 적용 반복 문제
- 트랜잭션 적용 코드를 보면 반복이 많다. try , catch , finally ...
예외 누수
데이터 접근 계층의 JDBC 구현 기술 예외가 서비스 계층으로 전파된다
SQLException 은 체크 예외이기 때문에 데이터 접근 계층을 호출한 서비스 계층에서 해당 예외를 잡아서 처리하거나 명시적으로 throws 를 통해서 다시 밖으로 던져야한다.
JDBC 반복 문제
지금까지 작성한 MemberRepository 코드는 순수한 JDBC를 사용했다
이 코드들은 유사한 코드의 반복이 너무 많다.( try , catch , finally ...)
스프링으로 위 문제들을 해결해보자
트랜잭션 문제 해결
트랜잭션 사용 코드가 특정 기술에 의존하지 않도록 트랜잭션 추상화 하기
트랜잭션 추상화
트랜잭션 추상화 현재 서비스 계층은 트랜잭션을 사용하기 위해서 JDBC 기술에 의존하고 있다. 향후 JDBC에서 JPA 같은 다른 데이터 접근 기술로 변경하면, 서비스 계층의 트랜잭션 관련 코드도 모
mystudylog.tistory.com
JDBC 구현 기술이 서비스 계층에 누수되는 문제 해결2
트랜잭션 동기화
스프링이 제공하는 트랜잭션 매니저는 2가지 역할을 한다. 트랜잭션 추상화 리소스 동기화 리소스 동기화 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유
mystudylog.tistory.com
트랜잭션 템플릿
트랜잭션을 사용하는 로직을 살펴보면 위 사진과 같은 패턴이 반복된다. 트랜잭션을 시작하고, 비즈니스 로직 실행하고, 성공하면 커밋, 예외가 발생해서 실패하면 롤백 다른 서비스에서 트랜
mystudylog.tistory.com
'Spring > Spring DB' 카테고리의 다른 글
트랜잭션 추상화 (0) | 2023.10.03 |
---|---|
트랜잭션 동기화 (0) | 2023.10.03 |
트랜잭션 (1) | 2023.10.02 |
커넥션 풀과 데이터소스 이해 (0) | 2023.09.29 |
JDBC 개발 - 등록, 수정, 조회, 삭제 (0) | 2023.09.24 |