본문 바로가기

전체 글38

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.
Git Submodule 현재 팀에는 application-security.yaml이라는 민감정보 파일이 있습니다. OAuth와 Jwt 에 대한 키값과 여러 민감정보들이 포함되어 있습니다. 프로젝트 기간동안 저희는 이 파일을 복사 붙여넣기 하고 .gitignore로 리모트에 푸쉬되지 않도록 설정하고 CI시에 젠킨스에서 ec2서버에 올라와있는 해당 파일을 복붙한 다음 빌드하도록 설정하였습니다. 이런 경우 문제가 파일이 변경되었을 때 항상 ec2서버에 접속하여 변경해줘야 한다는 문제점이 있으며 팀원간에 공유도 해야한다는 점이 문제입니다. 만약 서버가 여러대를 운영한다면 하나하나씩 바꿔줘야할겁니다 이를 해결하기 위해 git submodule를 사용해보았습니다. git submodule를 활용하면 private한 Githuib 저장소에.. 2022. 8. 18.
Docker + Redis localhost 연결 문제 Redis로 바꾸고 배포해보니…. 토큰의 저장소를 Redis로 바꾸게 되면서 EC2 인스턴스에 Redis를 설정,설치하고 다음과 같이 dev 프로파일에 저장하고 머지를 시켰다. spring: redis: host: localhost password: port: 6379 로컬에서 dev 프로파일로 잘 동작하는 것을 확인했으니 아무 문제가 없겠지 하고 테스트해본 결과 500 에러가 떨어졌다. 😂 황급하게 로그를 확인하니 Redis에 접속을 못하고 있었던 것… 왜일까 생각하다가 스프링을 도커로 띄운다는 사실을 알게되었다. 스프링이 띄워져있는 도커의 IP를 확인해보니 localhost(127.0.0.1)와 전혀다른 IP가 떨어진다는 것을 확인할 수 있다. 이 문제로 미루어봤을 때 도커 컨테이너는 네트워크 IP를.. 2022. 8. 6.
ObjectMapper 제너릭 타입 현재 프로젝트에서 MockMvc를 통해 테스트를 작성하고 있다. 그렇기 때문에 body에 json타입을 넣으려면 ObjectMapper를 통해 기입해줘야한다. (writeValueAsString) 여기까지는 문제가 없지만 검증할 때 문제가 생기게 된다. 나는 mockMvc.andReturn().getResponse()를 통해 MockHttpServletResponse를 가져와서 검증하는 것을 선호한다. 이렇게 하면 좀 더 검증부분가 행동부분이 구분이 가서 더 깔끔해지기 때문이다. 하지만 현재 프로젝트는 ApiResponse라는 제너릭 객체를 통해 결과값을 반환해주고 있다. @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ApiR.. 2022. 7. 29.
Git commit 관련 팁 팀원들과 프로젝트를 진행하던 도중 이것저것 해보다가 깃 커밋이 완전 사라지는 현상이 있었다. 다른 브랜치를 찾아봐도 없어져서 완전 멘붕 상황이였는 데 서칭을 해보니 해결법이 있어서 기록차원으로 포스팅하게 되었다! 커밋 내역 사라졌을 때 해결 팁 git reflog 되돌리기 원하는 커밋 주소를 복사 후 git reset —hard 커밋주소 명령어를 입력하면 현재 브랜치에서 reset 되게 된다! 머지 잘못했을 때 되돌리는 법 git reset --merge ORIG_HEAD 머지된 커밋들을 클린하게 없애준다! 2022. 7. 19.