개요 이번 글에서는 Request시에 @Vaild를 사용하여 @RequestBody와 @ModelAttribute로 DTO 또는 객체를 검증할 때 커스텀 예외처리를 적용하는 방법에 대해 이야기해 보려고 합니다. 1. @Valid 사용시에 @RequestBody에 대한 검증 예외가 발생하는 케이스 위 경우에는 POST 요청시에 총 3가지 예외 케이스가 발생하는 것을 확인할 수 있었습니다. MethodArgumentNotValidException(400 Bad Request) HttpMessageNotReadableException(400 Bad Request) HttpMediaTypeNotSupportedException(415 Unsupported Media Type) 첫번째 MethodArgumentN..
개요 이번 글에서는 Spring Data JPA에서 @ManyToOne 관계를 가지는 엔티티를 조회할 때 발생하는 N + 1 문제를 해결하는 방법에 대해 이야기해 보려고 합니다. 배경 최근에 사내에 ORM을 사용하는 프로젝트가 많아지면서 @ManyToOne 관계를 가지는 엔티티를 조회할 때 N + 1 문제에 대해 고려하지 않고 개발되어 조회 쿼리가 추가적으로 발생되는 이슈가 있어 N + 1 문제가 무엇인지 알아보고 어떻게 해결하는지에 대해 설명해 보겠습니다. N + 1 문제란? 연관 관계가 설정된 Entity를 조회할 경우에 조회된 데이터 개수(N) 만큼 연관관계의 조회 쿼리가 추가로 발생하는 문제이다. N + 1 문제 예시 - Lazy Loading @Entity @Getter public class ..
개요 이번 글에서는 JPA NativeQuery 사용시 @Param으로 객체를 사용하는 방법에 대해 이야기해보려고 한다. @Param으로 객체를 넘기면 좋은 점? 일반적으로 @Param 사용 시 아래 코드와 같이 일일이 파라미터를 매개변수로 넣어줘야 한다. @Modifying @Query(value = "INSERT INTO member (user_id, user_pw) VALUES (:userId, :userPw)", nativeQuery = true) @Transactional void saveMemberInfo(@Param("userId") String userId, @Param("userPw") String userPw); 또한 쿼리에 필요한 파라미터가 많으면 많아질수록 넣어줘야 하는 매개변수의 ..
개요 이번 글에서는 JPA에서 findBy 매서드를 매개변수 없이 사용하는 방법에 대해 이야기해보려고 한다. 매개변수 없이 사용하면 좋은 점? 예를 들어 위와 같은 데이터가 있고 "삭제되지 않은" 데이터들을 불러올 때 우리는 다음과 같이 코드를 작성할 수 있다. List findAllByDeleteYn(boolean active); 이때 서비스 로직에서 active라는 매개변수값을 false로 넘겨주며 원하는 결과를 얻을 수 있을 것이다. 위와 같은 매서드는 삭제된 게시물만 조회하는 기능이 있는 운영툴과 같은 환경에선 확장성 있는 구조로 쓰일 수 있겠지만 사용자들이 직접 이용하는 환경에서는 삭제된 게시물이 노출되는 불상사가 발생할 수 있다. 우리는 "삭제되지 않은" 데이터들만 보여주길 원하는데 activ..