[JPA] 값 타입

maxxyoung·2022년 10월 14일
0

JPA의 데이터 타입

  • 엔티티 타입(@Entity로 정의된 객체)
  • 값 타입

값 타입은 3가지로 나눌 수 있음

  • 기본값 타입
    • 자바 기본 타입(ex. int, double)
    • 래퍼 클래스(ex. Integer)
    • String
  • 임베디드 타입
  • 컬렉션 값 타입

임베디드 타입(복합 값 타입)

  • 새로운 값을 직접 정의해서 사용할 때 사용
  • 임베디드 타입도 int, String처럼 값 타입
  • @Embaddable : 값 타입을 정의하는 곳에 표시
  • @Embadded : 값 타입을 사용하는 곳에 표시
@Entity
public class Member {

	@Id @GeneratedValue
	private Long id;
	private String name;
    
    //근무기간
    @Temporal(TemporalType.DATE) java.util.Date.startDate;
    @Temporal(TemporalType.DATE) java.util.Date.endDate;
    
    //집 주소 표현
    private String city;
    private String street;
    private String zipcode;
}

이 코드를 임베디드 타입을 이용하여 객체지향적으로 나타낼 수 있음

@Entity
public class Member {
	@Id @GeneratedValue
    private Long Id;
    private String name;
    
    @Embedded Period workPeriod; //근무 기간
    @Embedded Address homeAddress; //집 주소
}

@Embeddable
public class Period {

	@Temporal(TemporalType.DATE) java.util.Date.startDate;
    @Temporal(TemporalType.DATE) java.util.Date.endDate;
    
    public boolean isWork(Date date) {
    	//.. 값 타입을 위한 메소드를 정의할 수 있음
    }
}

@Embeddable
public class Address {

	@Column(name="city") //매핑할 컬럼 정의 가능
    private String city;
    private String street;
    private String zipcode;
}
  • 임베디드 타입은 엔티티의 값일 뿐, 따라서 값이 속한 엔티티의 테이블에 매핑함. 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같음
  • AttributeOverride 속성을 통해 임베디드 타입에서 정의된 매핑 정보를 재정의 할 수 있음(ex. homeAddress, companyAddress)
  • 임베디드 타입이 null이면 매핑한 컬럼 값도 모두 null이 됨

값 타입과 불변 객체

  • 값 타입 공유 참조

    • 임베디드 타입은 같은 값 타입을 여러 엔티티에서 공유하면 위험함
    • 회원1과 회원2가 같은 임베디드 타입을 공유하게 될 경우, 임베디드 타입의 값이 변경 되었을 경우 영속성 컨텍스트는 회원1과 회원2의 값 둘 다 변경을 감지하여 업데이트하게 됨
  • 불변 객체

    • 객체를 불변하게 만들어 부작용을 원천차단할 수 있음
    • 객체 공유 참조를 피하는 가장 단순한 방법은 생성자로만 값을 세팅하고 setter를 모두 제거

값 타입의 비교

  • 동일성(identify) 비교 : 인스턴스의 참조 값을 비교, == 사용
  • 동등성(equality) 비교 : 인스턴스의 값을 비교, equals() 사용
  • 동등성 비교로 값 타입을 비교해야하고 이를 위해 equals(), hashCode() 오버라이드 해야함

값 타입 컬렉션

참고
자바 ORM 표준 JPA 프로그래밍

profile
오직 나만을 위한 글. 틀린 부분 말씀해 주시면 감사드립니다.

0개의 댓글