home

Jpa @embedded 토막 상식

JPA에서 @Embedded 어노테이션은 엔티티 클래스 내에 다른 값 타입을 포함시키는 데 사용됩니다. 이는 객체지향적 설계를 데이터베이스 모델링에 적용할 수 있게 해주는 중요한 기능입니다.

@Embedded 어노테이션 개념

@Embedded는 값 타입을 엔티티에 내장하는 것을 의미합니다. 관련된 필드들을 하나의 클래스로 그룹화하여 재사용하고 코드의 가독성과 유지보수성을 높일 수 있습니다.

사용 방법

  • 먼저 임베디드 타입을 정의합니다.
@Embeddable
public class Address {
    private String street;
    private String city;
    private String zipCode;

    // 게터, 세터, 생성자 등
}

  • 엔티티 클래스에서 임베디드 타입을 사용합니다.
@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Embedded
    private Address address;

    // 게터, 세터, 생성자 등
}

데이터베이스 매핑

임베디드 타입을 사용하면 데이터베이스 테이블에서는 해당 필드들이 엔티티 테이블에 직접 포함됩니다. 위 예제에서 USER 테이블은 다음과 같은 컬럼을 갖게 됩니다.

  • ID
  • NAME
  • STREET
  • CITY
  • ZIPCODE

컬럼명 커스터마이징

@AttributeOverride를 사용하여 임베디드 타입의 컬럼명을 재정의할 수 있습니다.

@Entity
public class Company {
    @Id
    @GeneratedValue
    private Long id;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "street", column = @Column(name = "company_street")),
        @AttributeOverride(name = "city", column = @Column(name = "company_city")),
        @AttributeOverride(name = "zipCode", column = @Column(name = "company_zipcode"))
    })
    private Address address;
}

여러 임베디드 타입 사용

동일한 임베디드 타입을 여러 번 사용할 수도 있습니다

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @Embedded
    private Address homeAddress;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "street", column = @Column(name = "work_street")),
        @AttributeOverride(name = "city", column = @Column(name = "work_city")),
        @AttributeOverride(name = "zipCode", column = @Column(name = "work_zipcode"))
    })
    private Address workAddress;
}