본문 바로가기
학습/DB

@Embedded, @Embedabble

코동이 2021. 9. 30.
@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
    private String city; //시
    private String district; //구
    private String detail; //상세주소
    private String zipCode; //우편번호
}

 

public class User {
...
    @Embedded
    private Address address;
....
}

 

Address를 @Embedded로 정의하고, @Embeddable로 사용한 경우, 칼럼에는 Address가 들어가는 것이 아니라, 해당 클래스가 가지고 있는변수들로 테이블 칼럼을 구성한다.

 

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city", column=@Column(name = "home_city")),
            @AttributeOverride(name = "district", column=@Column(name = "home_district")),
            @AttributeOverride(name = "detail", column=@Column(name = "home_detail")),
            @AttributeOverride(name = "zipCode", column=@Column(name = "home_zip_code"))
    })
    private Address homeAddress;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city", column=@Column(name = "company_city")),
            @AttributeOverride(name = "district", column=@Column(name = "company_district")),
            @AttributeOverride(name = "detail", column=@Column(name = "company_detail")),
            @AttributeOverride(name = "zipCode", column=@Column(name = "company_zip_code"))
    })
    private Address companyAddress;

같은 임베디드 타입을 2개 이상 사용하고 싶다면, @AttributeOverrides를 이용한다. 칼럼 각각은 @AttributeOverride로 재정의 할 수 있다. name은 애플리케이션의 칼럼명이고 @Column의 name은 실제 db 테이블에서 사용하는 칼럼명이다.

 

Address 임베디드 타입 칼럼 4개가 2번 생성되어 총 8개의 칼럼이 추가되며, @Column에서 name으로 지정했던 값이 실제 DB 테이블의 칼럼명으로 생성되었다.

 

   @Test
    void embedTest() {
        User user = new User();
        user.setName("steve");
        user.setHomeAddress(new Address("서울시", "강남구", "강남대로 마왕빌딩", "06241"));
        user.setCompanyAddress(new Address("수원시", "장안구", "화성행궁", "281464"));

        userRepository.save(user);

        userRepository.findAll().forEach(System.out::println);
    }

집주소를 homeAddress, 회사주소를 companyAddress로 설정했기 떄문에 각각 setHomeAddress와 setCompanyAddress로 주소를 설정할 수 있다.

 

@Embedded Javadoc을 확인하면, 어느 경우에 임베디드 타입을 사용하면 좋은지 예시가 나와있다.

참고로 , Example3 처럼, @Embeddable로 선언한 곳 안에서 @Embedded 사용이 가능하다.

반응형

'학습 > DB' 카테고리의 다른 글

영속성 컨텍스트로 발생하는 이슈  (0) 2021.10.01
Converter 사용하기  (0) 2021.09.30
Native Query  (0) 2021.09.30
@Transactional  (0) 2021.09.26
고아제거 속성 알아보기  (0) 2021.09.26