작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
589
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를 사용하는것이 좋은지 여쭤봅니다.
답변 2
0
안녕하세요. Dev_ch님
결론부터 말씀드리면 이것은 상황에 따라서 다릅니다.
항상 그런 것은 아니지면 보통 자주 발생하는 상황으로 설명드리겠습니다.
성능 관점에서는 fetch join이나 join + DTO 방식이 네트워크 통신 횟수를 줄이기 때문에 보통 더 나은 성능을 제공합니다. 단점으로는 이 방식의 결과물은 주로 특정 상황에서만 사용이 가능합니다.
반면에 지연로딩을 사용하는 방식은 성능이 좀 떨어질 수 있으나 코드를 다른 곳에서도 재사용할 가능성이 높아집니다.
물론 이것은 환경에 따라서 결과가 달라질 수 있습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
단건조회시 fetch를 이용했을 때 쿼리 개수와 성능 관련하여 질문하셨는데, 실제 쿼리 개수와 성능은 해당 코드에서 사용하는 DB와 해당 서비스의 구현 방식 등에 따라 다를 수 있습니다.
하지만, 대체로 성능이 느리다면 JPQL을 통해 DTO를 직접 접근하는 방식보다는 관계형 데이터베이스의 지연 로딩 개념을 이용한 방식이 효율적일 수 있습니다. 이는 fetchJoin이나 join+DTO 방식을 사용하는 경우에 해당됩니다.
또한, DBMS에 따라 다른 경향성이 있으므로 해당 DBMS에서 가장 효율적인 방식을 찾아 사용하는 것이 중요합니다.
따라서 본인의 DBMS, 구현 방식 등을 고려하여 최적의 방식을 선택해야 할 것입니다.
감사합니다.
AI가 조금 더 업그레이드 되어야겠네요 ㅎㅎ