JPA Data Types
이 글에서는 JPA의 엔티티 타입과 값 타입(기본 값 타입, 임베디드 타입, 컬렉션 값 타입)에 대해 자세히 알아보고, 값 타입 비교 시 주의할 점을 설명합니다.
* JPA 의 데이터 타입 분류
1. Entity 타입
- @Entity 로 정의
- 데이터가 변해도 ID 값을 통해 추적 가능
2. 값 타입 (Value)
- int, Integer, String 처럼 자바의 기본적인 타입
- 식별자가 없으므로, 변경시 추적할 수 없다.
* 값 타입의 분류
2.1. 기본 값 타입
-자바 기본 타입 (int, double)
-래퍼 클래스 (Integer, Long)
-String
2.2 임베디드 타입 **
-직접 타입을 선언해서 사용할 수 있다.
-기본 값 타입을 모아서 만들기 때문에, 복합 값 타입이라고 부른다.
(ex : 주소 객체, 근무 기간 객체를 따로 만들어서 사용한다.)

Member.java
@Entity
@Table(name = "Member")
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    @Column(name = "USERNAME")
    private String userName;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    // @Embedded 어노테이션을 사용해야 한다.
    @Embedded
    private Period period;
    @Embedded
    private Address homeAddress;
}
Period.java
package hellojpa.entity;
import javax.persistence.Embeddable;
import java.time.LocalDateTime;
// @Embaddable 어노테이션을 표시해 주어야 JPA 가 정확히 이해한다.
@Embeddable
/*
 * Embedded Data Type 을 공유할 경우, 
 * 원하지 않게 다른 Row 들의 값들도 변경되는 Side Effect 들이 발생할 수 있다.
 * 이러한 경우를 막기 위해, 불변 객체를 만들어야 한다.
 * (생성자로만 값을 생성할 수 있고, Setter 메소드를 제공하지 않으면 된다.)
 */
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    public LocalDateTime getStartDate() {
        return startDate;
    }
    public LocalDateTime getEndDate() {
        return endDate;
    }
}
Main Class
            Member member = new Member();
            member.setUserName("heejae");
            member.setHomeAddress(new Address());
            member.setPeriod(new Period());
            em.persist(member);
2.3 컬렉션 값 타입
-Java Collection 에 타입을 부여해서 사용할 수 있다.
값 타입의 비교
일반적인 자바 객체와 같이, 값 타입 안에 들어있는 Value 들이 같으면 같은 값으로 인식되어야 한다. (Override equals Method) hashcode() 메소드도 같이 구현해놓자. equals 에서 true 로 반환되는 두 객체는 같은 hashcode 를 지녀야 한다.
이것도 읽어보세요