강의를 보다가 문득 다음과 같은 코드를 발견했습니다.
보통 서비스 계층에서 @Transactional 을 통해서 감싸주는게 일반적이였습니다.
Repository 도 역시 아무것도 없습니다.
어떻게 저 save 문이 잘 동작했던 것일까?
결론부터 이야기 하면 @Transactional이 없는데 디비저장이 된다는것이 아닙니다.
즉, @Transactional이 있습니다..
어디에 있는지는 디버깅을 천천히 해보면서 따라가보겠습니다.
처음에 UserRepository에 어떤 구현체가 주입되는지 살펴보면
SimpleJpaRepository 를 주입받습니다.
그래서 SimpleJpaRepository 의 save를 살펴보면
네 존재합니다. 마찬가지로 @Repository 어노테이션도 SimpleJpaRepository에 존재하기 때문에 안해도 되었습니다.
JpaRepository를 구현해서 쓰기만 했지 들여다볼 생각을 안했던게 위와 같은 문제를 만나면 고민하게 만들었던거 같습니다.
답이 간단해서 일단 기분은 좋지만 간단한데도 모르고 있었다는 것이 또 반성하게 됩니다.
번외로 디버깅을 따라가다보면 JdkDynamicAopProxy 의 invoke를 호출하면서
엔티티가 디비에 저장이되고 고유의 아이디가 할당되는 것을 확인했습니다. 이 과정이 AOP와 리플렉션등 되게 멋진 기술들로 이루어지는데 해당 기술에 대해 공부해서 또 업로드 하겠습니다...
'JPA' 카테고리의 다른 글
[JPA/WARN] firstResult/maxResult ... collection fetch : applying in memory! (0) | 2020.08.08 |
---|---|
[JPA/ERROR] fetch join & DTO (0) | 2020.08.08 |
[JPA] 페이징 API 와 일대다 페치조인 (0) | 2020.08.06 |
[JPA] 벌크연산 주의점 (0) | 2020.08.06 |
[JPA] 일대다 조인할때 영속성 컨텍스트 내부 모습 & distinct (0) | 2020.08.06 |
댓글