[JPA] 임베디드 타입이란? (@Embeddable)

임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다.

임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고 공통 타입을 다양한 엔티티에서 재사용할 수 있다.

 

이해하기 쉽게 예시를 통해 알아보자.

 

임베디드 타입을 사용하는 예시

User 엔티티에 다음과 같은 정보가 있다고 가정해보자.

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
    private String city;
    private String street;
    private String zipcode;
	...
}

여기서 city, street, zipcode는 주소에 해당된다.

이 필드를 Address라는 클래스로 만들어 임베디드 타입으로 선언하여 사용할 수 있다.

 

임베디드 타입으로 변경
@Embeddable
public class Address {

    private String city;
    private String street;
    private String zipcode;
    
    public Address() {}
    ...
}
@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String username;
    
    @Embedded
    private Address address;
    ...
}

임베디드 타입인 클래스에 @Embeddable을 붙여주고 사용하는 엔티티에 @Embedded를 붙여주면 된다.

 

이제 User 테이블이 어떤식으로 만들어졌는지 확인해자.

Address에 있는 필드 값이 User에 모두 들어가 있는 것을 확인할 수 있다.

 

위의 예시 처럼 사용자 정보를 입력할 때는 주소, 연락처 등 여러 가지 정보를 입력야 하는데, 이 중에서 주소는 도시, 도로명주소, 우편번호 등으로 구성된다.

이때 Embeddable 타입으로 Address 클래스를 선언해서 중복 코드를 줄일 수 있게 되었다.

 

임베디드 타입 주의사항
  • 기본 생성자가 필수이다.
  • 엔티티에서 공유하여 사용하면 부작용이 발생한다.
  • 불변적이어야 한다.  ( 생성자로만 값을 설정하고 Setter 사용 X )
  • 생명주기가 사용된 엔티티에 의존한다.