본문 바로가기

Back-End/Spring3

JPA Fetch Join MultipleBagFetchException 이번 글에서는 프로젝트 중 발생한 MultipleBagFetchException에 대해 정리해보고자 한다. MultipleBagFetchException 프로젝트에서는 게시글이 위와 같은 모습으로 관계를 가지고 있다. 이에 게시글을 조회 시 post_image와 post_tag를 모두 fetch join하여 가져오면 한 방 쿼리가 되겠지~? 라며 fetch join을 한 후 테스트를 돌려보았는 데 MultipleBagFetchException 에러가 발생하였다. 왜 이러한 문제가 생겼나 찾아보니 fetch join하는 대상에 있었다. 먼저 여기서 말하는 Bag이란 무엇일까? A is an unordered collection, which can contain duplicated elements. That.. 2022. 8. 20.
JPA exists 쿼리 성능 개선 boolean existsByName(String name); Spring Data Jpa 에선 메서드로 쿼리를 만들어서 사용한다. 하지만 조금이라도 복잡해진다면 메서드로 표현이 힘들때가 있다. 예약하고 싶은 기간에 이미 숙소가 예약중인지 확인하는 쿼리 메서드로만 표현하기엔 너무 길어지고 복잡하다. 이런 경우 @Query 를 사용하지만 JPQL에선 select의 exists 를 지원하지 않는다. 하지만 where절에서는 가능하기에 count쿼리로 우회하여 사용한다. 하지만 이 방식은 성능상 문제가 있다. count VS exists exists의 경우 첫번째 결과에서 바로 true를 리턴하여 빠르다. 하지만 count의 경우 결국 총 몇건인지 확인해야하기 때문에 전체를 확인할 수 밖에 없어 exists보.. 2022. 8. 20.
ObjectMapper 제너릭 타입 현재 프로젝트에서 MockMvc를 통해 테스트를 작성하고 있다. 그렇기 때문에 body에 json타입을 넣으려면 ObjectMapper를 통해 기입해줘야한다. (writeValueAsString) 여기까지는 문제가 없지만 검증할 때 문제가 생기게 된다. 나는 mockMvc.andReturn().getResponse()를 통해 MockHttpServletResponse를 가져와서 검증하는 것을 선호한다. 이렇게 하면 좀 더 검증부분가 행동부분이 구분이 가서 더 깔끔해지기 때문이다. 하지만 현재 프로젝트는 ApiResponse라는 제너릭 객체를 통해 결과값을 반환해주고 있다. @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ApiR.. 2022. 7. 29.