스프링 Spring - @Embedded @Embeddable @Elementcollection 차이

김진욱·2022년 2월 18일
0

study

목록 보기
3/6

1. @Embedded @Embeddable

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
    private int age;



    private String zipcode;
    private String address;
    private String subAddress;
}

간단한 Member 엔티티를 만들어 보았다. 여기서 아래의 3개 필드는 멤버의 주소이다.

이렇게 구현할 때의 문제점은 필드가 추가될 때 지저분해지며 가독성이 떨어지게 된다.

3개의 주소 필드를 Address 라는 클래스 하나로 묶어준다면 어떨까

@Embeddable
public class Address {
    private String zipcode;
    private String address;
    private String subAddress;
}

Address 클래스에 @Embeddable 어노테이션을 달아준다

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
    private int age;



//    private String zipcode;
//    private String address;
//    private String subAddress;
    @Embedded
    private Address address;
}

기존 엔티티 객체로 묶을 필드에 @Embedded 어노테이션을 달아준다

2.@AttributeOverride

@Embedded 로 클래스를 컬럼으로 받을 때 여러번 받고 싶을 수도 있다.

하지만 컬럼이름이 중복이 될것이다. 이럴 때 @AttributeOverride 로 컬럼네임을 커스텀 할 수 있다.

// 중복 테스트
@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
    private int age;


    @Embedded
    private Address address;
    
    @Embedded
    private Address parentAddress;
}
동일한 임베디드 선언으로 중복 컬럼 에러 발생
// 컬럼 네임 커스텀 
@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
    private int age;


    @Embedded
    @AttributeOverride(name = "zipCode", column = @Column(name = "MY_ZIP_CODE"))
    @AttributeOverride(name = "address", column = @Column(name = "MY_ADDRESS"))
    @AttributeOverride(name = "subAddress", column = @Column(name = "MY_SUB_ADDRESS"))
    private Address address;

    @Embedded
    @AttributeOverride(name = "zipCode", column = @Column(name = "PARENT_ZIP_CODE"))
    @AttributeOverride(name = "address", column = @Column(name = "PARENT_ADDRESS"))
    @AttributeOverride(name = "subAddress", column = @Column(name = "PARENT_SUB_ADDRESS"))
    private Address parentAddress;
}

3. @ElementCollection

만약 @Embbeded 한 컬럼이 콜렉션이면 어떻게 해야할까?

임베디드 타입은 컨테이너가 되어선 안된다고 나온다.

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String username;
    private int age;


    @ElementCollection
    private List<Address> addresses;

}

@ElementCollection 만 붙혀주면 매핑이 된다. Member 테이블에 Collection 컬럼이 추가 되는 것이 아니라

새로운 테이블이 생성이 된다.

profile
2021.12~ 공부의 기록

0개의 댓글