티스토리 뷰
[3-tier 서버 DB 연결 구현]
서버와 DB는 서버의 Database Connection Pool에서 미리 생성되어있던 커넥션 객체를 가져오고 그 후 DB는 서버 내부에 세션이라는 것을 만들고 커넥션과 연결되어 커넥션을 통해 사용자에게 요청받은 SQL 요청을 처리한다.
[JPA를 사용한 트랜잭션 구현]
EntityManagerFactory -> Entity Manager -> EntityTransaction
1. 사용 방식: 커넥션 객체를 정의 할 필요 없이 EntityManager가 EntityTransaction을 가져옴
2. 한계: 트랜잭션을 직접 관리해야 하고 service 코드에 비즈니스 로직 외의 코드 추가로 가독성 떨어짐
[Spring 트랜잭션 핵심 기술]
1. 트랜잭션 동기화: 트랜잭션을 시작하기 위한 Connection 객체를 특별 저장소인 트랜잭션 동기화 매니저에 저장하고 필요할 때마다 꺼내 쓸 수 있도록 하는 기술. 트랜잭션 동기화 매니저는 작업 스레드마다 Connection 객체를 독립적으로 관리하여 멀티 스레드 환경에서도 충돌이 발생하지 않음
- 장점: 커넥션을 가져오고 종료하는 방식과 insert문에 Connection 객체를 전달하지 않음
- 한계: 트랜잭션을 사용하는 코드는 데이터 접근 기술마다 다르므로 데이터 접근 기술(DB가 바뀌면)이 바뀌면 서비스 계층 코드도 바꾸어야 한다. => 그렇다면 구현 방식에 상관없이 동일한 작업을 할 수 있도록 추상화를 해보자!
2. 트랜잭션 추상화: 트랜잭션 매니저 기능을 인터페이스로 정의하고 JPA의 데이터 접근 기술에 따라 구현체만 바꿔서 사용한다.
PlatformTransactionManager를 사용해서 JpaTransactionManager를 가져온다. 추상 클래스의 상속 받은 클래스들을 사용해 데이터 접근 기술에 상관없이 TSM을 가져온다.
- 장점: DB 접근 기술에 맞게 구현체를 연결해 DB 기술간의 의존성을 제거한다.

- 한계: 비즈니스 로직 외의 다른 작업을 추가로 서비스 로직 내에 구현해야 하고 일련의 트랜잭션 작업을 서비스 로직에서 구현하므로 코드가 길어져 가독성이 떨어진다.
3. 선언적 트랜잭션
트랜잭션의 생성-종료 내용을 비즈니스 로직과 분리. AOP로 프록시 객체를 만들고 해당 객체에서 트랜잭션 관련 로직 처리.
해당 로직이 문제 발생 시 rollback, 문제 없으면 commit 후 트랜잭션 종료하는 것을 프록시 객체에서 모두 처리.
@Transactional은 트랜잭션 처리를 위해 '프록시 패턴'을 이용한다.
프록시는 클라이언트 요청을 타겟 클래스의 메소드로 위임하고 경우에 따라 추가 작업.
@Transactional 메서드 로직 처리 시 Controller가 Service를 호출하면 실제 Service 객체가 아닌 AOP 프록시 객체(CGLIB)로 접근. AOP 프록시 객체는 자동으로 트랜잭션을 시작하고 내부 try catch로 commit과 rollback 로직을 처리한다. 로직이 다 끝나면 트랜잭션을 자동 종료하고 응답값을 클라이언트에게 전달한다.
- 특징: 메서드, 클래스, 인터페이스에 적용 가능. DB에 여러 번 접근하는 하나의 작업을 수행하는 Service 계층에 주로 사용한다.
출처: https://swmobenz.tistory.com/34
@Transactional 잘 모르고 쓰면 오히려 독이 될 수 있다.
Spring으로 서버를 개발하는 개발자라면, @Transactional 어노테이션은 많이 익숙할 것이라고 생각합니다. 서비스 로직을 작성할때 대부분 한번에 DB접근으로 끝나는 것이 아닌 여러번의 DB접근을 할
swmobenz.tistory.com
'SPRING' 카테고리의 다른 글
| @Value, @RequestParam (0) | 2023.07.06 |
|---|---|
| @ExceptionHandler, @ControllerAdvice, AOP (0) | 2023.06.29 |
| ResponseEntity, custom Exception, (0) | 2023.06.29 |
| Logback, profile, Springutils, Stringutils, CollectionsUtils (0) | 2023.06.29 |
| [프로젝트 구조] entity,dto,controller,service,repository (0) | 2023.06.29 |