JPA/JPA Basic 28

[JPA] OSIV ( Open Session In View )

Spring은 3계층으로 나뉜다. JPA는 ORM 프레임워크로 트랜잭션이 시작되는 서비스계층과 데이터 엑세스 계층을 위해 존재한다. 그러나 엔티티(Entity)는 DB로부터 CRUD 데이터를 전달하기 위해, 프레젠테이션 계층에도 존재할 수 있다. 이를 위해, 트랜잭션과 영속성 컨텍스트의 생존범위를 달리 할 필요가 있다. 데이터 엑세스 계층에서 엔티티A를 로드했는데, 프레젠테이션 계층에서 엔티티A를 DTO로 변환하는 과정에서 엔티티A와 연관된 엔티티B가 필요하여 LAZY 전략으로 로딩할 수가 있다. 그러므로 엔티티 로딩을 담당하는 영속성 컨텍스트는 트랜잭션이 끝나도 프레젠테이션 계층(View)의 호출이 종료될 때까지 살아있어야 한다. DB는 단순조회의 경우, 트랜잭션 없이도 조회가 가능하기 때문이다. 이와..

JPA/JPA Basic 2023.06.30

[JPA] 조회API 성능최적화하기( XToMany ) (3) - DTO 직접조회

[JPA] 조회 API 성능 최적화하기 ( XToMany ) (1) [JPA] 조회 API 성능 최적화하기 ( XToOne ) JPA에서 조회(SELECT)는 성능최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있기에 엔티티를 조회하는 과정에서 예상치 못한 lordofkangs.tistory.com [JPA] 조회 API 성능 최적화하기( XToMany ) (2) - default_batch_fetch_size [JPA] 조회 API 성능 최적화하기 ( XToMany ) (1) [JPA] 조회 API 성능 최적화하기 ( XToOne ) JPA에서 조회(SELECT)는 성능최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있기에 lordofkangs.tist..

JPA/JPA Basic 2023.06.29

[JPA] 조회API 성능최적화하기( XToMany ) (2) - default_batch_fetch_size

[JPA] 조회 API 성능 최적화하기 ( XToMany ) (1) [JPA] 조회 API 성능 최적화하기 ( XToOne ) JPA에서 조회(SELECT)는 성능최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있기에 엔티티를 조회하는 과정에서 예상치 못한 lordofkangs.tistory.com 지난 포스팅에서는 JOIN FETCH로 조회API 성능최적화를 해보았다. JOIN FETCH의 문제는 일대다 관계에서 컬렉션을 페이징하지 못함에 있다. 페이징이 필요없다면 상관없지만 페이징이 필요하다면 다른 방법이 필요하다. 4. default_batch_fetch_size로 최적화하기 JOIN FETCH로 일대다 연관관계의 페이징이 안되면 깔끔히 포기하자. 대신 Lazy 페치전략을 ..

JPA/JPA Basic 2023.06.29

[JPA] 조회API 성능최적화하기 ( XToMany ) (1) - DTO, JOIN FETCH

[JPA] 조회 API 성능 최적화하기 ( XToOne ) JPA에서 조회(SELECT)는 성능최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있기에 엔티티를 조회하는 과정에서 예상치 못한 쿼리가 다량으로 발생할 수 있다.( N+1 문 lordofkangs.tistory.com 조회(SELECT)는 성능 최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있어, 엔티티를 메모리에 로딩하는 과정에서 연관된 엔티티 로딩하는 전략을 생각해야 한다. 지난 포스팅에서는 일대일,다대일 관계(XToOne)에서 조회 API를 성능최적화를 해보았다. 이번 포스팅에서는 컬렉션 개념이 등장하는 일대다, 다대다 관계( XToMany )에서 조회 API의 성능을 최적화 해보겠다. ..

JPA/JPA Basic 2023.06.29

[JPA] 조회 API 성능 최적화하기 ( XToOne )

JPA에서 조회(SELECT)는 성능최적화가 반드시 고려되어야 한다. 엔티티는 다른 엔티티와 연관관계를 맺고 있기에 엔티티를 조회하는 과정에서 예상치 못한 쿼리가 다량으로 발생할 수 있다.( N+1 문제 ) 이번 포스팅에서는 일대일,대대일 관계(XToOne)에서의 조회API 코드를 단계별로 최적화해보겠다. 일대다관계( XToMany )는 컬렉션 개념이 추가되므로 다음 포스팅에서 다루어 보겠다. 1. 엔티티가 외부로 노출되는 코드 @GetMapping("api/v1/simple-orders") public List orderV1(){ List all = orderRepository.findAll(new OrderSearch()); return all; // 엔티티를 외부로 반환 } 위 Controller ..

JPA/JPA Basic 2023.06.28

[JPA] DTO의 필요성

스프링은 3계층으로 나뉜다. 프레젠테이션 계층은 Client(화면)과 네트워크 통신을 하며 화면구현을 담당한다. 서비스 계층은 데이터를 처리하는 비즈니스 로직을 가지고 있다. 데이터 엑세스 계층은 DB와 통신하여 데이터를 CRUD하는 역할을 담당한다. JPA의 엔티티(Entity)는 관계형DB의 테이블과 매핑되는 개념으로 데이터 엑세스 계층에서 사용하는 기본단위이다. 엔티티는 테이블 정보가 담긴 클래스로 매우 민감한 정보를 가지고 있다. 그러므로 엔티티가 외부로 노출되는 위험은 없어야 한다. 엔티티의 외부노출을 막기 위해 엔티티를 정제한 클래스를 하나 생성하는데, 그것이 DTO(Data Transfer Object)이다. DTO(Data Transfer Object) DTO는 프레젠테이션 계층에서 화면과..

JPA/JPA Basic 2023.06.28

[JPA] 준영속 엔티티 수정 ( merge, DirtyChecking )

준영속 엔티티를 수정하는 방법은 두 가지가 있다. 1. merge ( 병합 ) 2. DirtyChecking ( 변경감지 ) 준영속 엔티티 수정은 merge보다는 DirtyChecking이 권고된다. 왜 그럴까? 준영속 엔티티란? 준영속엔티티란 영속성 엔티티의 관리를 받고 있지 않은 엔티티를 의미한다. 예를들어, DB에서 조회한 Book 엔티티 리스트를 추출하여 만든 화면이다. '조회' 작업이 끝나면 트랜잭션이 종료되어 영속성컨텍스트도 종료된다. 여기서 수정 버튼을 클릭해보자. 데이터를 수정하고 Submit 버튼을 누르면, 새로운 Book 엔티티가 생성된다. 근데 다른 점이 하나 있다. 동일한 식별자가 이미 DB에 있다. '생성(create)'이 아닌 '수정(update)'은 식별자가 가리키는 레코드를 ..

JPA/JPA Basic 2023.06.23

[JPA] 값타입 컬렉션 ( @ElementCollection, @CollectionTable )

[JPA] 임베디드 타입 ( @Embedded, @Embeddable ) @Id 어노테이션이 붙은 필드는 식별자를 의미한다. JPA는 식별자로 엔티티를 구분한다. @ManyToOne 등은 연관관계를 의미한다. JPA는 어노테이션으로 다른 엔티티와 연관관계를 정의한다. 이렇듯 개 lordofkangs.tistory.com 지난 포스팅에서 값타입의 개념과 임베디드타입을 다루어보았다. 테이블 컬럼에 삽입 될 데이터는 정합성을 가져야 한다. 컬럼과 매핑되는 엔티티는 정합성을 지킨 데이터를 가져야 한다. 원시타입은 JAVA에서 값복사를 지원하기에 정합성을 가지지만 참조타입은 참조복사를 하기에 다른 객체에서 데이터를 조작할 가능성이 있다. 그러므로 객체(컬렉션)는 참조복사가 아닌 값복사가 지원되어야 한다. 값타입이..

JPA/JPA Basic 2023.06.12

[JPA] 임베디드 타입 ( @Embedded, @Embeddable )

@Id 어노테이션이 붙은 필드는 식별자를 의미한다. JPA는 식별자로 엔티티를 구분한다. @ManyToOne 등은 연관관계를 의미한다. JPA는 어노테이션으로 다른 엔티티와 연관관계를 정의한다. 이렇듯 개발자는 JPA가 엔티티를 목적에 맞게 사용하도록 여러 어노테이션으로 '표시'를 남긴다. ( 엔티티 매핑, 연관관계 매핑, 상속관계 매핑, 영속성 전이 등등 ) 이와같은 엔티티 관련 필드는 제외하고, 단순히 컬럼에 값을 저장하기 위한 필드를 '값타입'이라 부른다. Student 엔티티 @Entity @Data public class Student { @Id @GeneratedValue @Column(name = "STUDENT_ID") private Long id; private String name; /..

JPA/JPA Basic 2023.06.09

[JPA] 영속성 전이와 고아객체

영속성 전이란, 부모가 자식의 영속성을 관리하는 기술이다. 영속성 전이는 주로 '합성관계'에서 사용되어야 한다. 합성관계는 부모가 자식을 제어하는 관계이다. 예를들어, MacBook은 일체형 노트북이다. MacBook노트북과 M1칩은 생명주기가 같다. 반면 조립형 컴퓨터는 다르다. 생산시기도 다른 부품들로 컴퓨터가 구성된다. 부모가 존재하기에 자식도 존재하는 관계가 합성관계이다. 이런 경우, 자식의 제어권은 부모에게 있기에 영속성도 부모의 제어권에 있도록 하는게 관리에 편하다. MacBook 엔티티 @Entity @Data public class MacBook { @Id @GeneratedValue private Long id; private String name; @OneToOne(cascade = C..

JPA/JPA Basic 2023.06.08