인프런 커뮤니티 질문&답변

한상우님의 프로필 이미지
한상우

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V5: JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화

안녕하세요 강사님 JPA join에 관련해서 질문이 있습니다.

작성

·

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편을 참고해주세요.

https://ykh6242.tistory.com/102#:~:text=OSIV(Open%20Session%20In%20View)%EB%8A%94%20%EC%98%81%EC%86%8D%EC%84%B1%20%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EB%B7%B0,%EB%A1%9C%EB%94%A9%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%EA%B0%80%20%EC%9E%88%EB%8B%A4.
.
감사합니다.

한상우님의 프로필 이미지
한상우

작성한 질문수

질문하기