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

새로운 값 타입을 직접 정의해서 사용할 수 있다.(임베디드 타입)

직접 정의한 임베디드 타입도 int, String처럼 값 타입이다.

@Entitypublic 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;}
회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.

이런 설명은 단순히 정보를 풀어둔 것뿐이다.

또한 근무 시작일과 우편번호는 서로 아무 관련이 없다.

회원 엔티티는 이름, 근무기간, 집 주소를 가진다.

회원이 상세한 데이터를 그대로 가지고 있는 것은 객체지향적이지 않으며 응집력을 떨어뜨린다.

대신 근무 기간, 주소 같은 타입이 있다면 코드가 더 명확해질 것이다.

//값 타입 적용 회원 엔티티@Entitypublic class Member{    @Id @GeneratedValue    private Long id;    private String name;    @Embedded Period workPeriod;   //근무 기간    @Embedded Address homeAddress; //집 주소}
//기간 임베디드 타입@Embeddablepublic class Period{    @Temporal(TemporalType.DATE)    java.util.Date startDate;    @Temporal(TemporalType.DATE)    java.util.Date endDate;    public boolean isWork(Date date){        // 값 타입을 위한 메소드를 정의할 수 있다.    }}
//주소 임베디드 타입@Embeddablepublic class Address{    @Column(name = "city") //매핑할 컬럼 정의 가능    private String city;    private String street;    private String zipcode;    //...}

회원 엔티티가 의미 있고 응집력 있게 변했다.

새로 정의한 값 타입들은 재사용할 수 있고 응집도도 높다.