JPA에서는 Entity안의 값을 조금 더 의미있는 값으로 표현하기 위해 응집된 하나의 객체로 데이터를 표현합니다. 이번 포스팅에서는 이 처럼 JPA의 Entity를 조금 더 확실한 의미로 표현하는 방법과, 그에 따라 발생하는 중복 column에러를 해결하는 방법을 알아보겠습니다.
1. @Embedded , @Embeddable
1.1 시나리오
일반적인 회원가입의 경우에 회원을 표현하는 간단한 방법을 알아보고, 이를 좀더 의미있는 객체로 표현하는 방법을 알아보겠습니다.
name = "user") (
public class User {
strategy = GenerationType.AUTO) (
private Long uid;
private String name;
private String phoneNum;
private String zipCode;
private String address1;
private String address2;
}
예를들어 어떤 사이트에 회원가입을 하는 사용자가 존재한다고 보겠습니다. 이를 보통 JPA에서는 위와 같은 코드로 Entity를 생성하게 됩니다. 위의 데이터중 zipCode, address1, address2
들은 모두 각각, 주소
를 표현하는 필드입니다.
하지만 위와 같이 표현하는 경우, 주소로 인식하기에 약간의 어려움이 있습니다. 필드가 더 많아진다면 더더욱 지저분하게 될 것입니다. 그렇다면 어떻게하면 조금 더 읽기 쉬운 코드로 만들 수 있을까요?
바로 Address 라는 하나의 객체로 위의 3개의 데이터를 묶는다면 조금 더 주소라는 의미를 확실하게 표현할 수 있을 것입니다.
1.2 @Embedded, @Embeddable 사용법
xxxxxxxxxx
name = "user") (
public class User {
strategy = GenerationType.AUTO) (
private Long uid;
private String name;
private String phoneNum;
private Address address;
}
앞서 주소를 표현하는 3개의 데이터를 1개의 주소라는 의미의 객체로
표현한다면 훨씬더 가독성이 좋은 코드로 만들 수 있다고 말씀드렸습니다. 위의 코드를 한번 보시죠. 어떠신가요? 네 누가 보더라도 훨씬 가독성이 높아졌다고 할 수 있을만큼 훨씬 간단해졌습니다.
위 처럼 JPA Entity안의 Column을 하나의 객체로써 사용을 하고 싶다면 @Embedded, @Embeddable
어노테이션을 사용해야 합니다.
x
public class Address {
private String zipCode;
private String address1;
private String address2;
}
우선 하나로 표현하고자 하는 개념에 해당하는 클래스를 생성한 뒤 필드를 생성합니다. 그 후, 클래스 상단에 @Embeddable
을 입력합니다. (@Embeddable은 사실 생략도 가능합니다.)
name = "user") (
public class User {
strategy = GenerationType.AUTO) (
private Long uid;
private String name;
private String phoneNum;
private Address address;
}
마지막으로 Entity 클래스에서 앞서 생성한 객체 필드를 생성하고, 필드바로위에 @Embedded
어노테이션을 부여하면 끝입니다.
2.3 결과
3개의 필드가 생성되어있는 것을 확인할 수 있습니다.
3. @AttributeOverride
@Embedded
를 이용해 객체로 Entity의 Column을 표현한다면, Column 이름이 중복되는 문제가 발생하기도 합니다. 예를 들어 앞서 생성한 주소(Address) 객체 필드를 여러개를 생성한다면 말입니다.
3.1 시나리오
name = "user") (
public class User {
strategy = GenerationType.AUTO) (
private Long uid;
private String name;
private String phoneNum;
private Address homeAddress;
private Address companyAddress;
}
앞서 생성한 User에서 회원가입시 집 주소
와, 회사 주소
를 필요로 한다고 가정하고, Entity를 위와 같이 변경해보겠습니다.
위의 코드를 실행하면 위 그림과 같은 에러가 발생합니다. 이유는, @Embedded
를 사용하는 경우에 객체의 이름이 아닌 해당 객체안에 작성된, 필드의 이름을 Column으로 사용하기 때문입니다.
public class Address {
name = "home_zipcode") (
private String zipCode;
name = "home_address1") (
private String address1;
name = "home_address2") (
private String address2;
}
jpa에서 필드의 이름이 아닌 개발자가 지정한 이름으로 column을 생성하기 위해서는 위와 같이, @Column(name = "필드이름")
을 사용하면 됩니다. 하지만, 이는 상식적으로 생각해보았을때 해결방법이 되지 못합니다.
private Address homeAddress;
private Address companyAddress;
바로 같은 객체를 사용하기 때문입니다. 따라서 객체안의 컬럼을 재정의하는 방법이 필요한데 그것이 바로 @AttributeOverride
입니다.
3.2 사용법
name = "zipCode", column = (name = "home_zipCode")) (
name = "address1", column = (name = "home_address1")) (
name = "address2", column = (name = "home_address2")) (
private Address homeAddress;
name = "zipCode", column = (name = "company_zipCode")) (
name = "address1", column = (name = "company_address1")) (
name = "address2", column = (name = "company_address2")) (
private Address companyAddress;
사용법은 위의 코드만 보더라도 충분히 이해하실 수 있을거라고 생각합니다.
3.3 결과
'FrameWork > Spring JPA' 카테고리의 다른 글
JPA - jpa hibernate의 ddl 자동생성 옵션과 초기화 전략 그리고 Error executing DDL "alter table user drop foreign key 해결방법 (0) | 2019.08.05 |
---|---|
JPA - Entity의 가독성을 높이자 - 2 (Embedded Id 사용법) (0) | 2019.08.05 |
JPA - Enum을 이용해 Column 저장하기 (1) | 2019.06.30 |
JPA - JPA 설정 (H2 설정) (0) | 2019.05.09 |
JPA - JPA 다중 Database 사용법 (2) | 2019.02.04 |