JPA

임베디드 타입(@Embeddable, @Embedded)

쿠카이든 2022. 6. 13. 12:53
728x90
  • 임베디드 타입
    • 새로운 값 타입을 직접 정의할 수 있음
    • JPA는 임베디드 타입이라고 함.
    • 주로 기본 값 타입을 모아서 복합값 타입이라고도 함.
    • int, String과 같은 값 타입
    • 재사용이 가능하며 높은 응집도
    • Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
    • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 Entity에 생명주기를 의존함 

 

Member

@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    // 기간
    @Embedded // Period의 @Embeddable 둘 중 하나만 사용해도 무관
    private Period workPeriod;

    // 주소
    @Embedded
    private Address homeAddress;
}

 

 

Period

@Embeddable
public class Period {

    private LocalDateTime startDate;
    private LocalDateTime endDate;

    public Period() {
    }
}

 

Address

@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;
    }
}

 

 

실행결과

Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(new Address("city","street","10"));
member.setWorkPeriod(new Period());

em.persist(member);


// 실행결과
Hibernate: 
	create table member (
	   member_id bigint not null,
	    city varchar(255),
	    street varchar(255),
	    zipcode varchar(255),
	    username varchar(255),
	    end_date timestamp,
	    start_date timestamp,
	    primary key (member_id)
	)

Hibernate: 
    insert 
    into
        member
        (city, street, zipcode, username, end_date, start_date, member_id) 
    values
        (?, ?, ?, ?, ?, ?, ?)

결과

임베디드 타입 실습 결과

반복적으로 사용되는 것을 따로 분리했기 때문에 좀 더 객체지향으로 설계가 가능하다.

 

출처 : Java 표준 ORM JPA 프로그래밍 (저자 김영한)

728x90