inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

270

꿀꿀호도

작성한 질문수 3

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와 관련한 강의는 계획이 없으신가요? ㅎㅎ

 

 

jpa java spring-boot spring JPA

답변 1

0

David

안녕하세요. 한상우님, 공식 서포터즈 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.
.
감사합니다.

@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.

0

32

2

강의 관련 외 질문입니다.

0

91

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

113

1

BeanCreationException

0

104

3

Update 후 UpdateMemberResponse 매핑할 때

0

66

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

109

2

페이징 + 검색조건 관련해서 질문드립니다.

0

77

1

Query Dsl Q파일 질문입니다.

0

92

1

루트 쿼리라는것은

0

68

1

메서드를 분리하는 기준

0

76

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

123

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

97

2

fetch join과 영속화와 OSIV의 관계

0

101

2

Distinct 사용 전 결과에 대한 의문

0

124

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

65

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

82

2

dto 필드 속 엔티티 여부

0

67

1

뷰템플릿 사용 시

0

86

2

Result 클래스 관련 질문

0

59

1

@PostConstruct 프록시 관련 질문드립니다

0

91

1

DTO 대신 Form 사용은 안되나요?

0

142

1

OSIV ON 상태일 때

0

102

1

fetch join VS fetch join 페이징 궁금증

0

192

2

양방향 연관관계 알아보는 법?

0

113

1