JPA 18

QueryDSL

build.gradle dependencies { ... // QueryDSL JPA 라이브러리 implementation 'com.querydsl:querydsl-jpa' // QueryDSL 관련된 쿼리 타입(QClass)을 생성할 때 필요한 라이브러리로, annotationProcessor을 사용하여 추가 annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 시 추가 annotationProcessor 'jakarta.persistence:..

JVM/JPA 2023.06.28

영속성 전이, 고아 객체

CascadeType.ALL + orphanRemoval = true를 동시에 사용하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다. 영속성 전이: cascade 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 옵션이다. 부모 엔티티와 함께 자식 엔티티도 저장하거나 삭제할 수 있다. 종류 CascadeType.ALL 모두 Cascade를 적용한다. CascadeType.PERSIST Save, Persist 시 함께 영속화한다.. CascadeType.MERGE 업데이트 시 함께 업데이트한다. CascadeType.REMOVE 삭제 시 함께 삭제된다 CascadeType.REFRESH 새로고침 시 함께 새로고침 한다. CascadeType.DET..

JVM/JPA 2023.06.23

즉시 로딩, 지연 로딩, 프록시

JPA 기본 페치 전략 연관된 엔티티가 하나면 즉시 로딩을, 컬렉션이면 지연 로딩을 사용한다. 모든 연관관계에 지연 로딩을 사용하고 개발 완료단계에 꼭 필요한 곳에만 즉시 로딩을 사용하는 것을 권장한다. 즉시 로딩 JPA는 선택적 관계면 외부 조인을 사용하고 필수 관계면 내부 조인을 사용한다. 외부 조인보다 내부 조인이 성능가 최적화에서 더 유리하므로 NULL을 허용하지 않는다면 JPA에게 확실히 알려주는 게 좋다. 컬렉션 즉시 로딩은 항상 외부 조인을 사용한다. @JoinColumn(nullable = false) 혹은 @ManyToOne(optional = false) 프록시 프록시는 엔티티가 생성되어 있지 않으면 영속성 컨텍스트에 엔티티 생성을 요청하는데 이것을 초기화라 한다. EntityManag..

JVM/JPA 2023.06.23

@JoinTable

조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용한다. 그렇지만 일대일, 일대다, 다대일 관계에서도 사용한다. 속성 기능 name 연결 테이블의 이름 joinColumns 현재 엔티티를 참조하는 외래키 inverserJoinColumns 반대 방향 엔티티를 참조하는 외래 키 일대일 조인 테이블 만일 이런 구조를 고민하고 있다면 Child를 연관관계의 주인으로 만들자. @Entity public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; private String name; @OneToOne @JoinTable(name = "PARENT_CHILD", joinColumns = @J..

JVM/JPA 2023.06.19

@MapsId

일대일 식별 관계에서 부모의 PK를 자식의 PK로 사용할 때 사용된다. @MapsId 는 FK와 매핑한 연관관계를 PK 에도 매핑하겠다는 뜻이다. 예제 코드 @Entity public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @OneToOne(mappedBy = "board") private BoardDetail boardDetail; } @Entity public class BoardDetail { @Id private Long boardId; @MapsId // BoardDetail.boardId 매핑 @OneToOne @JoinColumn(name = "BOARD..

JVM/JPA 2023.06.18

상속 관계 매핑 (슈퍼-서브 타입 모델링)

사용되는 어노테이션 어노테이션 설명 @Inheritance 상속 매핑은 부모 클래스에 @Inheritance를 사용해야 한다. @DiscriminatorColumn 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다. 기본값은 DTYPE이다. @DiscriminatorValue 엔티티를 저장할 때 구분 컬럼에 입력할 값을 지정한다. 만약 영화 엔티티를 저장하면 구분 컬럼인 DTYPE에 값 M이 저장된다. 지정하지 않으면 엔티티 이름을 사용한다. @PrimaryKeyJoinColumn 기본값으로 자식 테이블은 부모의 PK 컬럼명을 사용한다. 자식 테이블의 PK 컬럼명을 변경하고 싶을때 사용한다. 조인 전략 각각을 모두 테이블로 만들고 조회할 때 조인을 사용한다. 장점 단..

JVM/JPA 2023.06.17

@ManyToMany

다대다 관계를 나타내는 데 사용한다. RDBMS 에서는 다대다 관계를 풀어내기 위해 @JoinTable 을 사용한다. 속성 기능 기본값 mappedBy 엔티티의 PK가 FK로 사용되고 있는 테이블의 필드명을 지정한다. 연관관계의 주인이 아니라는 설정이기도 하다.. cascade 영속성 전이 기능을 사용한다. 전파하지 않는다. fetch 글로벌 페치 전략을 설정한다. targetEntity 연관된 엔티티의 타입 정보를 설정한다. 다대다 단방 예제 코드 @Entity public class Member { @Id @Column(name = "MEMBER_ID") private String id; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @..

JVM/JPA 2023.06.16

@OneToOne

일대일 관계를 나타내는 데 사용한다. 속성 기능 기본값 mappedBy 엔티티의 PK가 FK로 사용되고 있는 테이블의 필드명을 지정한다. 연관관계의 주인이 아니라는 설정이기도 하다.. 양방향 예제 코드 @Entity public class Member { @Id @GeneratedValue() @Column(name = "MEMBER_ID") private String id; @OneToOne(mappedBy = "member") private Locker locker; } @Entity class Locker { @Id @GeneratedValue() @Column(name = "LOCKER_ID") private String id; @OneToOne @JoinColumn(name = "MEMBER_I..

JVM/JPA 2023.06.16

@OneToMany

일대다 관계를 나타내는데 사용다. 데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래 키를 가진다. JPA에서는 외래키를 가지고 있는 엔티티가 연관관계의 주인이라고 하며 외래키를 관리한다. 주인이 아닌 반대편은 읽기만 가능하고 외래키를 변경하지는 못한다. 속성 기능 기본값 mappedBy 엔티티의 PK가 FK로 사용되고 있는 테이블의 필드명을 지정한다. 연관관계의 주인이 아니라는 설정이기도 하다. 양방향 매핑이 아닌 일대다 단방향 매핑일 경우 필드 위에 @JoinColumn을 명시해야한다. 그렇지 않으면 JPA는 조인 테이블 전략을 기본으로 사용해서 매핑한다. 일대다 단방향 매핑은 객체가 관리하는 외래 키가 다른 테이블에 있기 때문에 성능 문제와 관리의 부담이 있다. 일대다 단방향 매핑 ..

JVM/JPA 2023.06.12

@ManyToOne, @JoinColumn

@ManyToOne 다대일 관계를 나타내는데 사용한다. 속성 기능 기본값 optional false로 설정하면 연관된 엔티티가 항상 있어야 한다. true fetch 글로벌 페치 전략을 설정한다. FetchType.EAGER cascade 영속성 전이 기능을 사용한다. targeEntity 연관된 엔티티의 타입 정보를 설정한다. 제네릭으로 타입 정보를 알 수 있다면 생략해도 된다. FetchType.EAGER 전략 단건 조회시 join 하지만 다건 조회시 N+1 이 발생한다. BatchSize를 조절하거나 JPGL에 fetch join을 사용하자 @JoinColumn 외래 키를 매핑할 때 사용한다. 다대일 관계에서는 생략하여도 조인테이블 전략을 사용하지 않는다. 속성 기능 기본값 name 매핑할 외래 키..

JVM/JPA 2023.06.12