JPA

값 타입 정리

쭈녁 2022. 12. 21. 22:47

JPA의 테이터 타입분류 (최상위)


엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자로 지속해서 추적 가능
  • 회원 엔티티의 정보가 변경되도 ID로 인식 가능

값 타입

  • int Integer String 처럼 단순한 값으로 사용하는 자바 기본타입인 객체
  • 식별자가 없고 값만 있음으로 변경시 추적 불가

 

값 타입 분류

기본값 타입 :

  •  생명주기를 엔티티에 의존(Entity 삭제시 필드도 삭제)
  •  값 타입은 공유하면 안됨(서로 다른 객체가 동시 변경되거나 생성되면 안됨)

기본값 종류

  • 자바 기본 타입: int, duble
    • 기본타입은 절대 공유되지 않음
    • 기본 타입은 항상 값을 복사함
  • 래퍼클래스 : Integer, Long
    • 래퍼 타입은 특수 클래스를 공유(참조)가능하지만 변경 할 수 없음
  • String


임베디드 타입(embedded type, 복값 값 타입)

예를 들어 주소지에 도시 도로명 번지수 zipCode와 같이 하나로 묶을 수 있는 값을 복합값 타입이라 일컷는다.

 

사용법

  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수
@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;

    public Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}
@Entity
public class Member extends BaseEntity {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    //주소
    @Embedded
    private Address address;
    
    @AttributeOverrides({
    	@AttributeOverride(name = "city", column = @Column(name = "WORK CITY")),
			@AttributeOverride(name = "street", column = @Column(name = "WORK STREET")),
            	@AttributeOverride(name = "zipcode", column = @Column(name = "WORK ZIPCODE"))
    })
    private Address workAddress;

 

  • 장점 : 재사용 가능/ 높은 응집도
  • 임베디드 타입을 포함한 모든 값타입은 값타입을 소유한 엔티티와 생명주리를 공유한다.
  • 인베디드 타입은 엔티티의 값일 뿐이고 사용하더라도 매핑하는 테이블은 같다
  • 객체와 테이블을 아주 세밀하게 매핑할 수 있다.
  • 임베디트 타입은 Entity도 가질 수 있다.
  • 동일한 임베디드 타입을 2번 이상 사용하고자 할 때 @AttribueOverrides를 사용하면 재정의 가능하다.(에노테이션 안에서 각 컬럼이 중복되지 않게 테이블과 새로 매핑해 주어야한다.)
  • 임베디드 타입은 같은 값타입을 여러 엔티티에서 공유하면 위험함 (여러 엔티티의 값이 같이 바뀌는 side effect 발생)
    • 동일한 객체의 값이 변경되어 해당 임베디드 타입을 여러 객체가 참조할 수 있기 때문
  • 값타입은 불변 객체로 설정해야함.(Setter를 만들지 않는다)
  • 생성자로 새로운 객체를 만들어 다시 set하는 형식으로 변경을 구현해야한다.

컬렉션 값 타입(collection value type)

  • 값 타입을 하나이상 저장할 때 사용
  • @ElementCollection, @CollectionTable 사용
  • 데이터베이스는 컬렉션을 같은 테이블에 저장할 수없다.
  • 컬렉션을 저장하기 위한 별도 테이블이 필요함
  • 지연로딩이 기본 세팅임

 

값 타입 컬렉션의 제약사항

  • 값 타입은 엔티티와 다르게 식별자 개념이 없다.
  • 값은 변경하면 추적이 어렵다.
  • 값 타입 컬렉션에 변경사항이 발생하면, 식별자가 없음으로 추적이 불가하여 주인엔티티와 연관된 모든 데이터를 삭제하고 현재값을 모두 다시 저장한다
  • 값타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어 기본키를 구성해야한다
  • 일대다 관계(영속성 전의+고아 객체 재거)로 엔티티를 만들어 컬렉션처럼 사용하는것을 권장한다.(매우 중요)

 


엔티티 타입의 특징

  • 식별자가 존재한다.
  • 생명 주기 관리가 용이하다.
  • 공유가 가능하다.

 


값 타입의 특징

  • 식별자가 없다
  • 생명 주기를 엔티티에 의존
  • 공유하지 않는 것이 안전(복사해서 사용)
  • 불변 객체로 만드는 것이 안전

값 타입은 단순한 값으로 사용 가능하고 공유 하지 않으며 불변 객체로 세팅 가능하다 판단될 때만 사용
엔티티와 값 타입을 혼동해서 엔티티를 값 타입으로 만들면 안됨
식별자가 필요하고, 지속해서 값을 추적, 변경해야 한다면 엔티티로 생성하는 것이 옳다

'JPA' 카테고리의 다른 글

JPQL 문법 1  (1) 2022.12.22
JPA 쿼리 언어 종류  (1) 2022.12.22
프록시와 연관관계 (즉시로딩/지연로딩)  (0) 2022.12.21
@MappedSuperclass  (0) 2022.12.20
상속관계 매핑  (0) 2022.12.20