service layer에서@transactional 쓰는 이유

kihoo_ni·2024년 6월 20일

북스토어프로젝트

목록 보기
5/14

1. 비즈니스 로직을 관리하는 Service layer에 @Transactional을 사용하는 이유

왜 service layer에 @Transactional을 쓰는지 간략하게 설명하자면 다음과 같음.
1. web의 layer마다 역할이 다다름. 그 중 service layer에서 비즈니스 로직을 관리하기때문에 @Transactional을 사용함.
2. @Transactional service layer의 메소드마다 적용시켜서 각각의 로직에 트랜잭션 처리를 함.
3. springboot는 @Transactional을 클래스에 적용하여 spring aop를 통해 구현함.
4. @Transactional을 메소드에 나 클래스에 설정할때 범위를 잘 지정해주면 준영속 상태의 엔티티에서 지연로딩할 때 발생하는 LazyInitializationException와 같은 exception을 예방할 수 있음.

2. 단순 read 기능 메소드에 대해 @Transactional(readOnly=true)을 사용하는 이유

첫번째 이유

  1. readOnly = true를 설정하게 되면 스프링 프레임워크는 JPA의 세션 플러시 모드를 MANUAL로 설정함.
  2. MANUAL 모드는 트랜잭션 내에서 사용자가 수동으로 flush를 호출하지 않으면 flush가 자동으로 수행되지 않는 모드임.
  3. 트랜잭션 내에서 강제로 flush()를 호출하지 않는 한, 수정 내역에 대해 DB에 적용되지 않음.
  4. 이로 인해 트랜잭션 Commit 시 영속성 컨텍스트가 자동으로 flush 되지 않으므로 조회용으로 가져온 Entity의 예상치 못한 수정을 방지할 수 있음.

두번째 이유

  1. readOnly = true를 설정하게 되면 JPA는 해당 트랜잭션 내에서 조회하는 Entity는 조회용임을 인식하고 변경 감지를 위한 Snapshot을 따로 보관하지 않으므로 메모리가 절약되는 성능상 이점 역시 존재함.

@Service
@Transactional
public class CouponPolicyServiceImpl implements CouponPolicyService {
현재는 crud 전체에 @Transactional 설정한 상태이고
read의 경우만 @Transactional(readOnly = true)을 설정해둠.

출처 https://velog.io/@minskim2/Spring-JPA-%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9%EA%B3%BC-Transactional

출처 https://hungseong.tistory.com/74

0개의 댓글