진짜 개발자
본문 바로가기

FrameWork/Spring JPA

JPA - Entity의 가독성을 높이자(@Embedded, @Embeddable, @AttributeOverride 사용법)

728x90
@Embedded, @AttributeOverride

JPA에서는 Entity안의 값을 조금 더 의미있는 값으로 표현하기 위해 응집된 하나의 객체로 데이터를 표현합니다. 이번 포스팅에서는 이 처럼 JPA의 Entity를 조금 더 확실한 의미로 표현하는 방법과, 그에 따라 발생하는 중복 column에러를 해결하는 방법을 알아보겠습니다.

 

 

1. @Embedded , @Embeddable

 

1.1 시나리오

일반적인 회원가입의 경우에 회원을 표현하는 간단한 방법을 알아보고, 이를 좀더 의미있는 객체로 표현하는 방법을 알아보겠습니다.

 

예를들어 어떤 사이트에 회원가입을 하는 사용자가 존재한다고 보겠습니다. 이를 보통 JPA에서는 위와 같은 코드로 Entity를 생성하게 됩니다. 위의 데이터중 zipCode, address1, address2 들은 모두 각각, 주소를 표현하는 필드입니다.

 

하지만 위와 같이 표현하는 경우, 주소로 인식하기에 약간의 어려움이 있습니다. 필드가 더 많아진다면 더더욱 지저분하게 될 것입니다. 그렇다면 어떻게하면 조금 더 읽기 쉬운 코드로 만들 수 있을까요?

 

바로 Address 라는 하나의 객체로 위의 3개의 데이터를 묶는다면 조금 더 주소라는 의미를 확실하게 표현할 수 있을 것입니다.

 

 

1.2 @Embedded, @Embeddable 사용법

앞서 주소를 표현하는 3개의 데이터를 1개의 주소라는 의미의 객체로 표현한다면 훨씬더 가독성이 좋은 코드로 만들 수 있다고 말씀드렸습니다. 위의 코드를 한번 보시죠. 어떠신가요? 네 누가 보더라도 훨씬 가독성이 높아졌다고 할 수 있을만큼 훨씬 간단해졌습니다.

 

위 처럼 JPA Entity안의 Column을 하나의 객체로써 사용을 하고 싶다면 @Embedded, @Embeddable 어노테이션을 사용해야 합니다.


우선 하나로 표현하고자 하는 개념에 해당하는 클래스를 생성한 뒤 필드를 생성합니다. 그 후, 클래스 상단에 @Embeddable을 입력합니다. (@Embeddable은 사실 생략도 가능합니다.)

 

마지막으로 Entity 클래스에서 앞서 생성한 객체 필드를 생성하고, 필드바로위에 @Embedded어노테이션을 부여하면 끝입니다.

 

 

2.3 결과

3개의 필드가 생성되어있는 것을 확인할 수 있습니다.

 

 

 

3. @AttributeOverride

@Embedded를 이용해 객체로 Entity의 Column을 표현한다면, Column 이름이 중복되는 문제가 발생하기도 합니다. 예를 들어 앞서 생성한 주소(Address) 객체 필드를 여러개를 생성한다면 말입니다.

 

 

3.1 시나리오

앞서 생성한 User에서 회원가입시 집 주소와, 회사 주소를 필요로 한다고 가정하고, Entity를 위와 같이 변경해보겠습니다.

 

위의 코드를 실행하면 위 그림과 같은 에러가 발생합니다. 이유는, @Embedded를 사용하는 경우에 객체의 이름이 아닌 해당 객체안에 작성된, 필드의 이름을 Column으로 사용하기 때문입니다.

 

jpa에서 필드의 이름이 아닌 개발자가 지정한 이름으로 column을 생성하기 위해서는 위와 같이, @Column(name = "필드이름")을 사용하면 됩니다. 하지만, 이는 상식적으로 생각해보았을때 해결방법이 되지 못합니다.

 

바로 같은 객체를 사용하기 때문입니다. 따라서 객체안의 컬럼을 재정의하는 방법이 필요한데 그것이 바로 @AttributeOverride입니다.

 

 

 

3.2 사용법

사용법은 위의 코드만 보더라도 충분히 이해하실 수 있을거라고 생각합니다.

 

 

 

3.3 결과