Spring & Spring Boot

[ Spring-Boot ] JPA Embedded 타입 사용하기

사과씨앗 2021. 5. 23. 16:59
728x90
반응형

안녕하세요 이번 글에서는 JPA에서 Embedded 타입을 사용하여 보겠습니다.

 

먼저 임베디드 타입이 어떤 것 인지 간략하게 알아보겠습니다.

 

- Entity 타입 : @Entity가 선언되어 있는 객체를 뜻한다.

 

- 값 타입 : int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체

 

- 임베디드 타입 : 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 말한다. 

 

이제 코드로 알아보겠습니다. 

 

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name="member_id")
    private Long id;

    @NotEmpty
    private String name;

    @Column(name = "city")
    private String city;
    
    @Column(name = "street")
    private String street;

    @Column(name = "zipcode")
    private String zipcode;
    
    @JsonIgnore
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

}

 

위처럼 Entitry의 필드의 구성중 주소와 관련된 부분을 좀 더 편리하게 관리하기 위하여 임베디드 타입으로 만들어

보겠습니다.

 

@Embeddable //임베디드 타입을 사용할 경우 선언하여 준다 
@Getter
public class Address {

    private String city;
    private String street;
    private String zipcode;

    protected Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }


}

Address 클래스를 생성하여 준다음 @Embeddable 선언하여 줍니다. 그다음 Memeber 클래스의 필드에 주소와 관련된 필드들을 생성하여 줍시다.

 

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name="member_id")
    private Long id;

    @NotEmpty
    private String name;

    @Embedded //임베디드 타입 사용시 선언
    private Address address;

    @JsonIgnore
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();


}

 

기존에 있던 주소 필드 값들을 지워준 다음 생성한 Address 클래스를 필드에 넣어준 다음 @Embedded를 선언하여 사용하여 줍니다.

 

위처럼 임베디드 타입은 엔티티의 값일 뿐이며, 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같습니다.

 

  [ 임베디드 타입 사용 시 장점 ]

 

재사용

 

- 높은 응집도

 

- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티 티에 생명주기를 의존함

 

감사합니다 ^^ 

728x90
반응형