JPA 기초) 06 @Embeddable

meteorfish·2022년 11월 28일

JPA&SpringJPA기초

목록 보기
6/18
post-thumbnail

본 강의는 JPA & Spring Data JPA 기초 강의 공부용 정리입니다.


지금까지 테이블의 칼럼과 클래스의 속성을 1:1로 매핑했다.

그러나, 실제 모델에선 여러 개의 속성을 모아서 하나의 값으로 표현한다.

이처럼 여러 속성을 하나의 타입으로 지정할 때, @Embeddable 을 사용한다.

@Embeddable

엔티티가 아닌 타입을 한 개 이상의 필드와 매핑할 때 사용.

사용법

@Embeddable
public class Address {
	@Column(name = "addr1")
    private String address1;
    @Column(name = "addr2")
    private String address2;
    @Column(name = "zipcode")
    private String zipcode;
    
    protected Address() {}
    
    ... 생성자, getter 생략
  • 묶어서 사용할 클래스의 각 타입에 애노테이션 붙인다.
@Entity
@Table(name = "hotel_info")
public class Hotel {
	@Id
    @Column(name = "hotel_id")
    private String id;
    ...
    @Embedded
    private Address address;
  • 위 클래스를 사용할 경우, 그 위에 @Embedded를 붙인다.

저장

-> java

tx.begin();
Address address = new Address("주소1", "주소2", "12345");
Hotel hotel = new Hotel("H00", "HN", 2022, Grade.S7, address);
em.persist(hotel);
tx.commit();
  • Address 객체를 만들고, Hotel 객체의 파라미터로 전달.

-> sql

insert into hotel_info
	(addr1, addr2, zipcode, created, grade, modified, nm, year, hotel_id)
values (?,?,?,?,?,?,?,?,?);
  • 쿼리를 실행 하면 정상적으로 값이 들어간다.

조회

-> java

Hotel hotel = em.find(Hotel.class, "H00");
logger.info("주소: {}", hotel.getAddress());

-> sql

select
  h1_0.hotel_id, h1_0.addr1, h1_0.addr2, h1_0.zipcode, h1_0.created, h1_0.grade, h1_0.modified, h1_0.nm, h1_0.year
from
  hotel_info h1_0
where
  h1_0.hotel_id=?
  • find로 받은 객체를 hotel 객체에 넣게 되면 정상적으로 조회가 된다.

null을 넣으면?

tx.begin();
//Address address = new Address("주소1", "주소2", "12345");
//Address address = null;
Hotel hotel = new Hotel("H00", "HN", 2022, Grade.S7, address);
em.persist(hotel);
tx.commit();

  • Address에 포함된 필드값만 null로 저장이된다.

같은 @Embeddable 타입 필드가 두 개면?

@Entity
public class Employee {
	@Id
    private String id;
    @Embedded private Address homeAddress;
    @Embedded private Address workAddress;
  • 서로 같은 칼럼에 매핑되므로 에러가 발생!

이럴때 @AttributeOverride로 설정 재정의가 가능

@AttributeOverride

  • name : 임베더블에 정의한 필드 중 사용할 필드를 선택
  • column : 매핑할 컬럼을 설정

-> sql

insert into Employee (addr1, addr2, zipcode, waddr1, waddr2, wzipcode, id)
values (?, ?, ?, ?, ?, ?);

@Embeddable을 왜 사용할까?

  • 모델을 더 잘 표현할 수 있다.
  • 개별 속성을 모아서 이해해서 타입으로 더 쉽게 이해가 가능하다.

0개의 댓글