아래 후술할 여러 내용중 임베디드 타입(복합 값 타입)과, 값 타입 컬렉션에 대한 내용이 특히 중요하다고 한다.
Entity Type(엔티티 타입)
Value Type(값 타입)
이제 조금 더 알아보자면, 아래와 같다.
기본적으로 기본값 타입은 생명주기는 Entity에 의존한다. 예를 들어, 회원이라는 객체를 하나 삭제하면, 그에 딸린 나이, 이름 필드도 같이 삭제가 된다.
public class Test{
public static void main(String[] args){
int a = 10;
int b = a; //b에 a의 값이 "복사"됨.
a = 20; // a의 값을 20으로 바꿔도
System.out.println("a = " + a); //얘는 20이지만
System.out.println("b = " + b); //얘는 10 그대로 있다. 같이 안바뀐다.
}
}
아래 임베디드 타입과 컬렉션 값 타입을 사용하기 위해서는 JPA에서 따로 정의를 해주고 사용할 수 있다.
예를 들어, x,y 좌표값과 같은 것을을 관리하기 위해 Position이라는 클래스를 정의했다고 하자. 이 Position 자체를 위의 Integer, double, String 과 같이 특정 값 으로써 사용하고 싶을 때 사용하는것이 바로 임베디드 타입이라고 한다.
예시로, 만약 아래와 같은 회원 엔티티가 있다고 하자.
여기서 근무 시작일~ 종료일을 근무기간으로 묶고, 도시, 번지, 우편번호 또한 간단히 클래스로 묶어 집 주소 이렇게 묶을 수 있을것이다.
이렇게 묶어주고 나면 아래 사진과 같이 쥰내 간단한 회원 엔티티가 될 수 있을 것이다.
이렇게 몇가지 기본 타입들을 묶어내서 그 자체를 하나의 타입을 쓰는게 임베디드 타입이다.
@Entity
public class Member extends BaseEntity {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USER_NAME")
private String username;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipCode;
}
위와 같은 회원 엔티티에서 startDate, endDate를 묶어 Period로, city, street, zipCode를 묶어 Address라는 클래스로 따로 정의를 했다. 그 후, 아래 두 클래스는 임베디드 타입이다! 라는 명시를 JPA에게 전달해야 하기 때문에 @Embeddable 어노테이션을 붙여주고, 이를 사용하는 Member 클래스에 해당 객체들을 선언하며, 여기엔 나 임베디드 타입 쓸거다! 라는 명시를 위해 @Embedded 를 붙였다.
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period(){}
// ... 이하 getter settet 등
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipCode;
public Address(){}
// ... 이하 getter settet 등
}
@Entity
public class Member extends BaseEntity {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USER_NAME")
private String username;
@Embedded
private Period period;
@Embedded
private Address address;
}