inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

단건조회시 fetch를 이용했을때 쿼리개수와 성능이 궁금합니다.

675

작성자 없음

작성한 질문수 0

0

long startTime = System.currentTimeMillis();
BoardResponse.Detail response = boardService.findBoard(board.getId());
long endTime = System.currentTimeMillis();

// then 
System.out.println(endTime - startTime);

해당 코드에서 findBoard Service는 게시글의 힌트, 태그, 정답, 공감을 가져와 DTO의 변환을 거쳐 하나의 게시글을 단건조회하는 서비스입니다.

다만 여러 케이스로 테스트했는데

단순히 findById로 로직을 테스트를 하게되면 해당 findBoard는 60~90ms의 실행속도와 쿼리가 지연로딩으로 인해 5개가 나가지만

JPQL을 통해 DTO를 직접 접근하는 식으로 바꿨을땐, 쿼리를 1개로 나가지만 실행속도가 250~290ms가 나오게 되는데 단건조회의 경우 fetchJoin이나 join+DTO 방식을 쓰는것보다 지연로딩이 있더라도 일반적인 findById를 사용하는것이 좋은지 여쭤봅니다.

java jpa springdatajpa querydsl

답변 2

0

김영한

안녕하세요. Dev_ch님

결론부터 말씀드리면 이것은 상황에 따라서 다릅니다.

항상 그런 것은 아니지면 보통 자주 발생하는 상황으로 설명드리겠습니다.

성능 관점에서는 fetch join이나 join + DTO 방식이 네트워크 통신 횟수를 줄이기 때문에 보통 더 나은 성능을 제공합니다. 단점으로는 이 방식의 결과물은 주로 특정 상황에서만 사용이 가능합니다.

반면에 지연로딩을 사용하는 방식은 성능이 좀 떨어질 수 있으나 코드를 다른 곳에서도 재사용할 가능성이 높아집니다.

물론 이것은 환경에 따라서 결과가 달라질 수 있습니다.

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

단건조회시 fetch를 이용했을 때 쿼리 개수와 성능 관련하여 질문하셨는데, 실제 쿼리 개수와 성능은 해당 코드에서 사용하는 DB와 해당 서비스의 구현 방식 등에 따라 다를 수 있습니다.

하지만, 대체로 성능이 느리다면 JPQL을 통해 DTO를 직접 접근하는 방식보다는 관계형 데이터베이스의 지연 로딩 개념을 이용한 방식이 효율적일 수 있습니다. 이는 fetchJoin이나 join+DTO 방식을 사용하는 경우에 해당됩니다.

또한, DBMS에 따라 다른 경향성이 있으므로 해당 DBMS에서 가장 효율적인 방식을 찾아 사용하는 것이 중요합니다.

따라서 본인의 DBMS, 구현 방식 등을 고려하여 최적의 방식을 선택해야 할 것입니다.

감사합니다.

2

김영한

AI가 조금 더 업그레이드 되어야겠네요 ㅎㅎ

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

27

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

46

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

93

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

115

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1