프로그래밍/Spring

[ JPA ] 임베디드 타입

Yanoo 2022. 1. 26. 22:52
728x90
반응형
@Entity
public class Member {

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

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

    private LocalDateTime startDate;
    private LocalDateTime endDate;

    private String city;
    private String street;
    private String zipcode;
}

보면

startDate와 endDate

city와 street와 zipcode 

이 두 그룹은 연관이 있어 묶어서 관리하면 관리도 쉽고 변경할 일이 있을 때 쉽게 바꿀 수 있을 것이다.

이 때 사용하는 것이 임베디드 타입이다.

 

 

바꾼 모습을 보면

  • Member
    @Entity
    public class Member {
    
        @Id @GeneratedValue
        @Column(name = "MEMBER_ID")
        private Long id;
    
        @Column(name = "USERNAME")
        private String username;
    
        //기간 Period
        @Embedded
        private Period workPeriod;
    
        //주소
        @Embedded
        private Address homeAddress;
    }​
  • Period
    @Embeddable
    public class Period {
    
        private LocalDateTime startDate;
        private LocalDateTime endDate;
    
        public Period() {
        }
    
        public Period(LocalDateTime startDate, LocalDateTime endDate) {
            this.startDate = startDate;
            this.endDate = endDate;
        }
    }
  • 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;
        }
    }

이렇게 바꾸면 된다.

여기서 @Embeddable과 @Embedded는 둘 중에서 하나만 사용하면 되지만 둘다 사용하는 것을 권장한다고 한다.

그리고 기본 생성자는 필수라고 한다.

 

🎈 임베디드 타입과 테이블 매핑

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
728x90
반응형