본문 바로가기
JPA

서비스 계층에서 @Transactional 이 없는데 디비 저장이 가능했던 이유

by onejunu 2022. 3. 29.

강의를 보다가 문득 다음과 같은 코드를 발견했습니다.

 

 

보통 서비스 계층에서 @Transactional 을 통해서 감싸주는게 일반적이였습니다.

 

Repository 도 역시 아무것도 없습니다.

 

어떻게 저 save 문이 잘 동작했던 것일까?

결론부터 이야기 하면 @Transactional이 없는데 디비저장이 된다는것이 아닙니다.

즉, @Transactional이 있습니다..

 

어디에 있는지는 디버깅을 천천히 해보면서 따라가보겠습니다.

처음에 UserRepository에 어떤 구현체가 주입되는지 살펴보면

 

 

SimpleJpaRepository 를 주입받습니다.

 

그래서 SimpleJpaRepository 의 save를 살펴보면

 

네 존재합니다. 마찬가지로 @Repository 어노테이션도 SimpleJpaRepository에 존재하기 때문에 안해도 되었습니다. 

JpaRepository를 구현해서 쓰기만 했지 들여다볼 생각을 안했던게 위와 같은 문제를 만나면 고민하게 만들었던거 같습니다.

답이 간단해서 일단 기분은 좋지만 간단한데도 모르고 있었다는 것이 또 반성하게 됩니다.

 


번외로 디버깅을 따라가다보면 JdkDynamicAopProxy 의 invoke를 호출하면서 

엔티티가 디비에 저장이되고 고유의 아이디가 할당되는 것을 확인했습니다. 이 과정이 AOP와 리플렉션등 되게 멋진 기술들로 이루어지는데 해당 기술에 대해 공부해서 또 업로드 하겠습니다...

댓글