JPA(24)
-
준영속상태의 엔티티를 변경할 때 변경감지와 merge()
준영속 상태의 엔티티를 업데이트할때, 두 가지 방법이 존재한다. 여기서 준영속 상태의 엔티티란 예전에 영속성 상태가 되었고 DB에 저장되었던 식별자가 존재하는 엔티티이지만 현재 영속성 상태가 아닌 상태를 말한다. 변경감지 변경감지는 flush 시점에 영속성 컨텍스트가 관리하는 엔티티의 변경 내용을 체크하여 알아서 SQL 쿼리 생성 및 DB에 전달하는 기능이다. 변경감지 프로세스에 대해 정리를 해보면.. 엔티티가 영속 상태가 된다.(persist나 find하여 DB에서 가져오는 경우) 영속성 컨텍스트는 스냅샷을 찍어 초기 상태를 저장해둔다. 엔티티의 필드에 값이 변경된다. 그리고 flush()가 호출된다.(커밋 시점이나 강제 flush) 영속성 컨텍스트는 스냅샷의 상태와 현재 상태가 다른(변경된) 데이터를..
2021.01.29 -
임베디드 타입, @Embeddable, @Embedded
임베디드 타입 새로운 값 타입을 직접 정의해서 만든 값타입. 여러가지 값타입을 모아서 만들 수 있음. 임베디드 타입을 사용하기 전과 후에 매핑되는 테이블은 변하는게 없다. 임베디드 타입 사용법 @Embeddable: 값 타입을 정의하는 곳에 표시 @Embedded: 값 타입을 사용하는 곳에 표시 기본 생성자 필수 한 엔티티에서 같은 값 타입을 사용할 경우 컬럼명이 중복되는것을 피하기 위해 @AttributeOverrides, @AttributeOverride를 사용해서 컬러 명 속성을 재정의 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null 임베디드 타입은 객체 타입이기 때문에 = 연산자를 사용할 경우 공유 참조가 된다. 따라서 불변 객체로 설계하여 사용해야한다. (생성자로만 값을 세팅하..
2021.01.21 -
cascade, orphanRemoval
영속성 전이 cascade 특정 엔티티를 영속 상태로 만들거나 삭제 상태로 만들때, 그와 관련된 엔티티도 함께 영속 상태나 삭제 상태로 만들고 싶을때 사용. 연관관계의 주인이 누구인지와는 상관없이 사용. 참조하는 곳이 한곳일때, 특정 엔티티가 개인 소유할 때 사용. @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) CascadeType의 종류 ALL: 모두 적용 PERSIST: 영속 REMOVE: 삭제 MERGE: 병합 REFRESH: REFRESH DETACH: DETACH 고아 객체 삭제 orphanRemoval @OneToMany(mappedBy="parent", orphanRemoval=true) 부모 컬렉션에서 자식 엔티티 삭제하면 DELE..
2021.01.20 -
지연로딩과 즉시로딩
지연로딩(fetch = FetchType.LAZY) A엔티티가 B엔티티를 참조하고 있다고 하자 지연로딩은 A엔티티를 조회할때 A엔티티 정보만 SELECT하고 B엔티티 정보는 SELECT하지 않다가 B엔티티 정보를 참조할때 B엔티티 정보를 SELECT하는 것. A엔티티를 조회할 시점에 B타입의 프록시를 생성하여 대체. 프록시는 B타입을 상속받아 구현. B엔티티 정보를 조회해야할때 프록시는 영속성 컨텍스트에 초기화 요청을 하면 영속성 컨텍스트가 B엔티티 정보를 DB에 요청하여 받아서 B엔티티를 생성해주고 프록시는 생성된 B엔티티 객체를 참조하여 데이터를 읽어온다. 즉시로딩(fetch = FetchType.EAGER) 즉시로딩은 A엔티티를 조회할때 B엔티티 정보도 같이 조인하여 전부 가져오는 것. 즉시로딩의 ..
2021.01.20 -
상속관계 매핑
상속관계 매핑 관계형 데이터베이스는 상속관계를 기술적으로 지원하지 않는다. 하지만 슈퍼타입과 서브타입이라는 모델링 기법으로 상속관계를 설계할 수 있다. 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략 이렇게 3가지 전략이 있다. @Inheritance(strategy=InheritanceType.XXX) 부모 클래스에 설정한다. 부모 클래스는 상황에 맞게 Abstract 추상 클래스로 만들어 사용. InheritanceType.JOINED 조인 전략 부모 클래스에 맞는 슈퍼타입 테이블이 생성되고 자식 클래스에 맞는 서브타입 테이블이 생성된다. 장점 테이블 정규화 외래키 참조 무결성 제약조건 활용가능 저장공간 효율화 단점 조회시 조인을 많이 사용 데이터 저장시 INSERT SQL 2번 호출 I..
2021.01.19 -
연관관계 매핑
다중성 일대일: @OneToOne 일대다: @OneToMany 다대일: @ManyToOne 다대다: @ManyToMany -> 실무에서 사용안함. 관계형 데이터베이스는 다대다 관계를 표현할 수 없으며 일대다, 다대일 관계로 풀어내야하고, 엔티티도 이에 맞게 설계되야한다. 방향 단방향: Member 엔티티에서 Team 엔티티로만 참조할 수 있는 구조 외래키(TEAM_ID)가 있는 엔티티(Member)에 @ManyToOne 어노테이션을 적용하고 @JoinColumn( name = "TEAM_ID")를 적용하면 단방향 연관관계 매핑이 끝난다. 연관관계 매핑이 되면, 데이터 등록, 삭제시 JPA가 연관관계에 따라 데이터를 바인딩해준다. @Entity public class Member { @Id @Generat..
2021.01.19