[Spring Boot] 임베디드 타입

최현석·2022년 12월 12일
0

Spring_Boot

목록 보기
25/31

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

  • 내장 타입
  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA는 임베디드 타입(embedded type)이라고 함
  • 주로 기본값 타입을 모아 만들어서 복합값 타입이라고도 함
  • int, String 과 같은 값 타입

@Embeddable //값 타입이 정의되는 곳에 @Embeddable 사용
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
		public Period() { }
}

@Embeddable //값 타입이 정의되는 곳에 @Embeddable 사용
public class Address {
    private String city;
    private String street;
    private String zipcode;
		public Address() { }
}

@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    @Column(name = "USERNAME")
    private String name;
		/*
		//임베디드 타입을 사용하지 않으면 주석 내의 기존 형태로 값 타입으로 선언해줘야 한다.
		//Period
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    //Address
    private String city;
    private String street;
    private String zipcode;
		*/

    @Embedded //값 타입이 사용되는 곳에 @Embedded 사용
    private Period workPeriod;

    @Embedded //값 타입이 사용되는 곳에 @Embedded 사용
    private Address homeAddress;
}

JPA에서 임베디드 타입 사용법

  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

임베디드 타입의 장점

  • 재사용
  • 높은 응집도
  • 객체지향적인 설계 가능하다
    • 임베디드 타입을 통해 객체를 분리하더라도 테이블은 하나만 매핑된다

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

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 잘 설계된 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

@AttributeOverride : 속성 재정의

  • 한 엔티티에서 같은 값 타입을 사용하면 -> 컬럼명이 중복됨
  • @Attributeoverrides, @AttributeOverride를 사용해서 컬렁 명 속성을 재정의

Member안에 동일한 임베디드 타입이 있다면 어떻게 될까?

@Entity
public class Member {
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    @Column(name = "USERNAME")
    private String name;
    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;

		//workAddress라는 동일한 homeAddress와 동일한 타입이 추가된다면 어떻게 될까.
		@Embedded
    private Address workAddress;
		//error MappingException: Repeated column in mapping for entity
	
}
  • @AttributeOverride 를 사용해서 컬러 명 속성을 재정의 해준다.
@Embedded
		@AttributeOverrides({
            @AttributeOverride(name="city", column = @Column(name="WORK_CITY")),
            @AttributeOverride(name="street", column = @Column(name="WORK_STREET")),
            @AttributeOverride(name="zipcode", column = @Column(name="WORK_STREET"))
    })
    private Address workAddress;

불변객체

  • 객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단
  • 값 타입은 불변 객체로 설계해야함
  • 생성 시점 이후 절대 값을 변경할 수 없는 객체
  • 생성자로만 값을 설정하고 수정자(setter)를 만들지 않으면 됨

0개의 댓글