작성
·
205
0
안녕하세요.
질문은 2가지 정도가 있는데 다음과 같습니다
1. DTO를 반환하는 형태의 JPQL를 작성할 때 join문을 사용해서 쿼리를 작성해주셨습니다.
문득 로그를 보다가 든 생각이 DTO가 아니라 entity를 조회하기 위해 JPQL을 작성할 때, join을 사용하면 즉시로딩이나 지연로딩 관계없이 연관객체에 대해서 N+1문제가 발생하는 걸로 알고 있습니다.
근데 DTO를 반환하는 형태로 JPQL를 작성할 때는 join문을 사용해도 쿼리 한번에 연관객체들의 정보를 가져오더라구요 (강의에서 Order의 Member나 Delivery)
이러한 차이의 이유가 JPQL이 실행 될 때 JPA에서 관리를 하냐 안하냐의 차이로 볼 수 있을까요?
2. JPA는 트랙잭션 안에서만 동작한다고 알고 있습니다.
그런데 강의를 보다보면 Controller에서 Repository를 바로 의존성 주입받아서 사용하시더라구요. @Transaction은 서비스에만 붙어있고 Repository에는 선언되어 있지 않은데 정상적으로 동작하는 것은 조회는 트랙잭션 관계없이 JPA에서 사용이 가능한것인가요?
그 서비스 코드를 작성할 때 조회 메서드는 readOnly속성을 true로 주면서 작성했던 걸 보면 조회할 때도 @Transaction이 선언되어야 동작하는것이 아닌가 하는 생각이 들어서 질문 남겨드립니다.
항상 명강의 해주셔서 감사합니다.
ps. MSA와 관련한 강의는 계획이 없으신가요? ㅎㅎ
답변 1
0
안녕하세요. 한상우님, 공식 서포터즈 David입니다.
.
1. 연관된 엔티티 정보를 같이 가져올 때는 join fetch를 사용합니다. JPQL에서 join fetch와 join은 서로 다르게 동작합니다. 주문조회V4편 2분쯤 Order의 Member와 Delivery를 가져올 때 join fetch를 사용하고 있음을 볼 수 있습니다.
2. Controller에서 Repository에 바로 접근하여 조회할 수 있는 것에 대해서는 아래 글 참고 부탁드립니다. 아울러 강의 OSIV편을 참고해주세요.