우리가 만약에 사용자의 주소를 저장해야 한다고 생각해 봅시다.
물론 Enum 으로 제공할 수 도 있습니다.
하지만 Embedded Type 으로 객체를 만들어서 사용한다면???
@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String city;
private String district;
private String detail;
private String zipCode;
}
위와 같은 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_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;
우리가 @Embedded 어노테이션을 사용해서 Address 클래스를 Embedded 해올수 있으며,
@AttributeOverrides로 컬럼들의 컬럼명을 설정해줄수 있습니다.
( Ex - Address 클래스에 존재하는 city라는 컬럼을 HomeAddress 컬럼에서는 home_city로 컬럼명을 받겠다 )
@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))
출력결과는 다음과 같이 나오게 됩니다.
@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
위와 같이 다른 결과값을 도출하게 됩니다.
과연 정보를 담을때 Null 값을 어떻게 처리해야할지?
Address 와 같이 Home 과 Company를 구분지어 생성할수 있지만
@AttributeOverride 를 통해 재정의 한다고는 하지만 코드가 지저분하지는 않은지?
위와 같은 고민들을 생각해가며 로직을 짜가야 하는것이 맞다고 생각합니다.