일전에 JPA에서 사용하는 어노테이션을 다루는 글에서 소개한 적이 있는 @Transactional 어노테이션에 대해서 다루다가 궁금한 점이 생겼었고, 그 의문점을 해결하여 기록합니다.
우선 그 전에, @Transactional이 무엇인지 알아보자. @Transactional은 기본적으로 선언된 메서드 내에서, 오류가 발생했을 경우 진행했던 변경 기록들을 DB에 커밋하지 않고 롤백하는 기능을 한다. 그래서 우리는 어떤 메서드를 동작시킬 때, DB에서 read를 제외한 CUD를 수행하고자 한다면, 필수적으로 이 어노테이션을 사용해야했다.
Q. 왜 Repository에 선언하지 않고, Repository를 사용하는 메서드에서 @Transactional을 사용하나요?
보통 많은 서비스에서 하나의 트랜잭션(데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 가장 작은 작업의 단위)에 @Transactional 어노테이션을 사용합니다. 그래서 우리는 MemberService나 ItemService와 같은 클래스 내에서 join이나 어떤 메서드에 이 어노테이션을 명시하는 것이 국룰입니다.
그런데 우리는 그럼 왜 굳이 이 많은 메서드에 어노테이션을 붙여야할까요?? 단지 DB에 직접 접근하는 @Repository에 명시해두면 귀찮은 일들이 더 줄어들텐데, 왜 Repository에 명시하지 않는걸까요??
A.
보통 많은 비즈니스 로직에서 Repository의 메서드를 호출합니다. 만약에 이러한 로직에 문제가 발생했을 경우에 이 로직의 전체를 롤백해야하기 때문입니다.
아!! 명쾌한 해답.. 잘 기억해야겠다.
'JPA' 카테고리의 다른 글
[JPA] @Id의 마법(feat. @GenerateValue) (0) | 2023.08.18 |
---|---|
[JPA] 복합키 등록하기 (0) | 2023.08.18 |
DTO, DAO란? (DAO와 Repository의 차이) (0) | 2023.08.10 |
임베디드 타입(Embedded Type)이란? (0) | 2023.08.08 |
JPA에서 Enum 타입 사용하기 (0) | 2023.08.04 |