JPA 기초 - @Embeddable

2024. 1. 17. 17:30·JPA
본 내용은 유튜브 최범균님의 강의 내용을 정리한 내용입니다.
JPA 기초 06 @Embeddable

@Embeddable

  • 엔티티가 아닌 타입을 한 개 이상의 필드와 매핑할 때 사용합니다. (예: Address, Money 등 매핑)
  • 엔티티의 한 속성으로 @Embeddable 적용 타입을 사용합니다.

사용방법

  • 매핑할 필드의 값 타입에 @Embeddable 어노테이션을 붙여줍니다.
package com.example.jpa.entity;

...

@Data
@AllArgsConstructor
@Embeddable
public class Address {
    @Column(name = "addr1")
    private String address1;
    @Column(name = "addr2")
    private String address2;
    @Column(name = "zipcode")
    private String zipcode;

    protected Address() {

    }
}
  • @Embeddable을 사용할 엔티티 객체의 필드에 @Embedded 어노테이션을 붙여줍니다.
package com.example.jpa.entity;

...

@Data
@NoArgsConstructor
@Entity
@Table(name = "hotel_info")
public class Hotel {
    @Id
    @Column(name = "hotel_id")
    private String id;
    ...

    @Embedded
    private Address address;

    public Hotel(String id, String name, int year, Address address) {
        this.id = id;
        this.name = name;
        this.year = year;
        this.created = LocalDateTime.now();
        this.modified = LocalDateTime.now();
        this.address = address;
    }
}
// 등록 및 검색
...
        transaction.begin();

        try {
            // Hotel 등록
            Address address = new Address("주소1", "주소2", "12345");
            Hotel hotel = new Hotel("H00", "HN", 2022, address);
            entityManager.persist(hotel);

            entityManager.flush();
            entityManager.clear();

            // Hotel 검색
            Hotel foundHotel = entityManager.find(Hotel.class, "H00");
            System.out.println(foundHotel.getAddress());

            transaction.commit();
        }
...
  • @Embeddable 사용하면 데이터베이스에 저장할 때는 하나의 테이블에 저장이 됩니다.
  • 데이터 조회하는 경우에는 Address 객체에 주소 정보를 담아서 Hotel 엔티티 객체에 담아줍니다.

INSERT 쿼리 실행
SELECT 쿼리 실행
h2database에 저장된 데이터 조회

  • Hotel 정보 저장 시 Address가 null인 경우에는 해당 컬럼에 null 값이 저장됩니다.

Address 객체가 null인 경우 INSERT 결과

같은 @Embeddable 타입 필드가 두 개인 경우

// Address 타입 필드가 두개인 경우

@Entity
public class Employee {
    @Id
    private String id;
    @Embedded private Address homeAddress;
    @Embedded private Address workAddress;
}
  • 같은 @Embeddable 타입 필드가 존재하는 경우 같은 컬럼이 매핑되어 에러가 발생합니다. (Repeated column in mapping for entity: ...)
  • 그래서 @AttributeOverride 어노테이션을 설정해주어 다른 컬럼을 매핑할 수 있도록 해줍니다.
// @AttributeOverride 어노테이션으로 설정 재정의

@Entity
public class Employee {
    @Id
    private String id;
    @Embedded
    private Address homeAddress;
    
    // workAddress가 다른 컬럼에 매핑되도록 설정
    @AttributeOverrides({
    	@AttributeOverride(name = "address1", column = @Column(name = "waddr1")),
        @AttributeOverride(name = "address2", column = @Column(name = "waddr2")),
        @AttributeOverride(name = "zipcode", column = @Column(name = "wzipcode")),
    })
    @Embedded
    private Address workAddress;
}
// Employee 저장 INSERT 쿼리 생성
insert into Employee (addr1, addr2, zipcode, waddr1, waddr2, wzipcode, id) values (?, ?, ?, ?, ?, ?, ?)

결론

  • @Embeddable을 사용하면 모델을 더 잘 표현할 수 있습니다.
  • 개별 속성을 모아서 타입으로 좀 더 쉽게 이해할 수 있습니다.
  • 예를 들면, addr1, addr2, zipcode -> 주소(Address)

'JPA' 카테고리의 다른 글

JPA 기초 - 값 컬렉션 Set 매핑  (0) 2024.01.18
JPA 기초 - @Embeddable을 사용하여 다른 테이블 매핑하기  (0) 2024.01.17
JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)  (0) 2024.01.16
JPA 기초 - 연관 관계의 이해  (0) 2024.01.16
JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent)  (0) 2024.01.15
'JPA' 카테고리의 다른 글
  • JPA 기초 - 값 컬렉션 Set 매핑
  • JPA 기초 - @Embeddable을 사용하여 다른 테이블 매핑하기
  • JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)
  • JPA 기초 - 연관 관계의 이해
PortLee
PortLee
  • PortLee
    프로그래밍 공부
    PortLee
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C++
      • JAVA
      • JPA
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Entity
    @AttributeOverride
    식별자공유
    @CollectionTable
    JoinColumn
    @Embeddable
    1-1연관관계
    필드와 컬럼 매핑
    JPA
    MemberEntity
    @Access
    set
    entity mapping
    list
    @Basic
    컬랙션 매핑
    Translent
    allocationSize
    @Table
    MemberService
    Table 기본키 생성 전략
    다른 테이블 매핑
    Entity 연관관계
    1-N
    map
    MemberRepository
    기본키 매핑
    SQL Mapping
    persistence.xml
    컬렉션 매핑
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
PortLee
JPA 기초 - @Embeddable
상단으로

티스토리툴바