본문 바로가기

Spring/JPA

(48)
[Spring Data JPA] Method name query 이번 장에서는 메소드 이름 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. SoccerPlayer가 가지는 속성은 아래와 같다. @Entity @Getter @Setter @ToString(of = {"id", "name", "height", "weight"}) @NoArgsConstructor(access = PROTECTED) public class SoccerPlayer { @Id @GeneratedValue @Column(name = "soccer_player_id") private Long id; private String name; private int height; priv..
[Spring Data JPA] Structure 이번 장에서는 Spring Data API 개요 (링크)에 이어 Spring Data JPA가 어떠한 방식으로 작동하는지 알아보도록 한다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 우리는 이전 장에서 아래처럼 리포지토리 인터페이스를 만드는 것 만으로 기본적인 CRUD가 작동하는 것을 확인하였다. SoccerPlayerDataRepository public interface SoccerPlayerDataRepository extends JpaRepository {} TeamDataRepository public interface TeamDataRepository extends JpaRepository {} 당연히 인터페이스만으로 동작하는 서비..
[Spring Data JPA] Intro 이번 장에서는 Spring Data JPA의 기능을 살펴보기 전에 무엇인지 간략하게 알아보도록 한다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 스프링 부트와 일반 JPA를 사용하면서 개발 생산성을 많이 높여왔다. 하지만 여기에 스프링 데이터 JPA까지 사용하게 되면 더욱 개발 생산성이 높아진다. 이번 장에서는 축구선수(SoccerPlayer)와 선수들이 속해있는 팀(Team)을 가지고 예를 들어본다. SoccerPlayer @Entity @Getter @Setter @ToString(of = {"id", "name", "age"}) @NoArgsConstructor(access = PROTECTED) public class SoccerPla..
[JPA] OSIV 이번 장에서는 JPA의 OSIV에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. OSIV는 하이버네이트의 Open Session In View의 줄임말이다. 같은 의미를 가지는 JPA의 Open EntityManager In View라는 표현이 있지만 일반적으로 OSIV라고 불리며 Spring에서는 둘을 모두 포괄하는 의미에서 Open In View라고 한다. OSIV 활성화 OSIV는 기본적으로 활성화 되어있다. 이러한 이유로 Spring 프로젝트를 실행할 때 아래의 이미지와 같이 open-in-view is enabled by default라는 WARN 메시지가 뜨게된다. Spring에서 INFO 메시지가 아닌 WARN 메시..
[JPA] Optimizing xToMany Relation - 2 이번 장에서는 xToMany 성능 최적화 1 (링크)에 이어 xToMany 연관관계의 최적화에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Step 5: DTO를 직접 조회하는 방법 (1 + N 쿼리 발생) 이번에는 Root Entity와 함께 xToMany를 제외한 관계의 데이터를 한 번에 조회하고 조회된 결과를 가지고 xToMany 관계의 데이터를 따로 조회하여 set 시키는 방식으로 진행한다. 이렇게 진행하는 경우 1 + N...(몇 번의 쿼리가 발생할지 모르는 상황)에서 1 + N으로 쿼리의 수를 줄일 수 있다. 또한 컬렉션 조인이 아니기 때문에 페이징 처리도 가능하다. OrderCollectionAPIControlle..
[JPA] Optimizing xToMany Relation - 1 이번 장에서는 xToOne 성능 최적화 (링크)에 이어 xToMany 연관관계의 최적화에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Step 1: Response에 Entity를 사용하는 경우 Entity를 그대로 Response의 값으로 사용하는 방법이다. OrderCollectionAPIController @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/orders") public class OrderCollectionAPIController { private final OrderRepository orderRepository; @GetMapp..
[JPA] Optimizing xToOne Relation 이번 장에서는 Entity 생성 및 갱신 최적화 (링크)에 이어 XToOne 연관관계의 최적화에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Step 1: Response에 Entity를 사용하는 경우 OrderAPIController @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/order") public class OrderAPIController { private final OrderRepository orderRepository; @GetMapping(value = "", headers = "X-API-VERSION=1") public Li..
[JPA] Optimizing Insert & Update 이번 장에서는 Entity 생성 및 갱신 최적화에 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. Step 1 (Insert): Request Body에 Member Entity가 사용되는 경우 MemberController @RestController @RequiredArgsConstructor @RequestMapping(value = "/api/member") public class MemberAPIController { private final MemberService memberService; @PostMapping(value = "", headers = "X-API-VERSION=1") public Member.Response..