[SPRING] JPA - Embedded / Embeddable

RuiN·2022년 8월 6일
0

Spring

목록 보기
6/8
post-thumbnail

우리가 만약에 사용자의 주소를 저장해야 한다고 생각해 봅시다.
물론 Enum 으로 제공할 수 도 있습니다.
하지만 Embedded Type 으로 객체를 만들어서 사용한다면???


Embeddable

@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {

    private String city;

    private String district;

    private String detail;

    private String zipCode;

}

위와 같은 Address 라는 클래스를 생성해 줍니다.

  • @Embeddable 은 Embedded 가 가능하게 한다는 의미.

Embedded

    @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_address_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_address_detail")),
            @AttributeOverride(name = "zipCode",column = @Column(name = "company_zip_code")),
    }
    )
    private Address companyAddress;
  • User의 HomeAddress 와 CompanyAddress를 나타내고 싶습니다

우리가 @Embedded 어노테이션을 사용해서 Address 클래스를 Embedded 해올수 있으며,
@AttributeOverrides로 컬럼들의 컬럼명을 설정해줄수 있습니다.
( Ex - Address 클래스에 존재하는 city라는 컬럼을 HomeAddress 컬럼에서는 home_city로 컬럼명을 받겠다 )


Test 1

   @DisplayName("1. embedTest")
    @Test
    void test_1(){

        User user = new User();
        user.setName("steve");
        user.setHomeAddress(new Address("서울시", "강서구", "코딩아파트", "763487"));
        user.setCompanyAddress(new Address("서울시", "마곡동", "자바아파트", "347894"));

        userRepository.save(user);

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

    }

user 를 생성한후 , user의 HomeAddress와 CompanyAddress 를 생성자로 받아서 입력하여
UserRespository에 저장해주고 출력해줍니다.

 homeAddress=Address(city=서울시, district=강서구, detail=코딩아파트, zipCode=763487), 
 companyAddress=Address(city=서울시, district=마곡동, detail=자바아파트, zipCode=347894))

출력결과는 다음과 같이 나오게 됩니다.


Test 2

  @DisplayName("1. embedTest")
    @Test
    void test_1(){
        User user1 = new User();
        user1.setName("joshua");
        user1.setHomeAddress(null);
        user1.setCompanyAddress(null);
        userRepository.save(user1);

        User user2 = new User();
        user2.setName("jordan");
        user2.setHomeAddress(new Address());
        user2.setCompanyAddress(new Address());
        userRepository.save(user2);


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

    }

그렇다면 Address의 값들을 null로 생성한다면
1) Address Set을 Null 값 입력
2) Address 인자없는 생성자를 Set

Result --

	homeAddress=null, companyAddress=null // 1
    
	homeAddress=Address(city=null, district=null, detail=null, zipCode=null),
	companyAddress=Address(city=null, district=null, detail=null, zipCode=null //2

위와 같이 다른 결과값을 도출하게 됩니다.


So What?

과연 정보를 담을때 Null 값을 어떻게 처리해야할지?

Address 와 같이 Home 과 Company를 구분지어 생성할수 있지만
@AttributeOverride 를 통해 재정의 한다고는 하지만 코드가 지저분하지는 않은지?

위와 같은 고민들을 생각해가며 로직을 짜가야 하는것이 맞다고 생각합니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글