[JPA] 임베디드 타입

DevHwan·2022년 11월 30일
0

Embedded Type

새로운 값 타입을 직접 정의해서 사용할 수 있다. Java에서 기본적으로 제공하는 기능 중 하나이다. 임베디드 타입은 다음과 같이 사용될 수 있다.

회원이라는 엔티티가 주소에 대한 정보를 갖고 있다고 생각해보자. 주소에는 도시, 번지 등 많은 정보가 포함되는 데 이를 하나하나 회원 엔티티에 추가하게 되면 회원 엔티티가 가지고 있는 필드가 불필요하게 늘어나게 된다.

이를 임베디트 타입으로 선언하면 필드를 최소한으로 줄이는 방향으로 설계할 수 있다.

@Embeddable
@Getter
public class Address {
    private String city;
    private String street;
    private String zipcode;

    protected Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}

주소라는 클래스에 @Embeddable 어노테이션을 추가하여 임베디드 타입으로 선언한다. 이제 이 임베디드 타입을 회원이라는 엔티티에서 사용할 수 있게 된다.

// 임베디드 타입 사용하지 않았을 때
@Entity
@Getter
public class Member {

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

  @NotEmpty
  private String name;

  // 주소 표현
  private String city;
  private String street;
  private String zipcode;
}

이 코드를 임베디드 타입을 선언한 클래스를 이용해서 개선해보도록 하자.

@Entity
@Getter
public class Member {

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

    @NotEmpty
    private String name;

    @Embedded
    private Address address;
}

임베디드 타입을 사용할 때는 @Embedded 어노테이션을 추가로 사용하면 된다.

임베디드 타입의 장점

  • 재사용이 가능하다. → 회원이라는 엔티티가 아니더라도 다른 엔티티에서 주소 값이 필요하다면 이를 불러와서 사용이 가능하다.
  • 높은 응집도를 가진다.
  • 해당 임베디드 타입만 사용하는 메소드를 만들 수 있다. → 객체지향 설계가 가능하다.
  • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티 티에 생명주기를 의존한다.

만약 하나의 엔티티에 같은 임베디드 타입을 사용하고 싶을 때에는?

@AttributeOverride를 사용해서 추가가 가능합니다.

profile
달리기 시작한 치타

0개의 댓글