진짜 개발자
본문 바로가기

FrameWork/Spring JPA

JPA - Entity의 가독성을 높이자 - 2 (Embedded Id 사용법)

728x90
DDD 를 진행하며 Entity의 가독성에 대한 고민을 많이 하기 시작했습니다

DDD 를 진행하며 Entity의 가독성에 대한 고민을 많이 하기 시작했습니다. 각각의 앱들은 자신들만의 도메인 제약사항을 가지고 있으며, 그에 따라 키값도 특별하게 설정되는 경우가 있었습니다.

 

예를들어 보통의 경우에는 RDBMS의 Auto_Increment를 설정을 이용하며, Long타입으로 Entity의 Id를 설정했지만, 이번에 진행하는 App에서는 조금 특별한 ID를 설정해야하는 경우가 있었습니다. 조금 더 자세히 설명드리자면, UserEntity의 경우에는 Google Oauth2를 통해 발급된 AccessToken을 Id로 사용하며, WorkPlaceEntity라는 이름의 엔티티의 경우에는 사업자 번호를 ID로 사용해야하는 경우가 있었습니다.

 

이때 Database를 읽을때에는 어떤 값이 key값인지 빨리 파악하기 위해서 key 값을 보통 *id 로 설정을 했었습니다. 하지만 이처럼 특별한 의미를 가지는 경우의 Id의 이름을 작명할때에는 불가피하게도 어떠한 값이 저장되는지를 확실하게 표현하기 위해서 `String acceessToken', 'String businessNum' 이런식으로 지정을 해야했습니다.

 

이런 경우에 양쪽 모두 가독성을 증가시키기 위해서 jpa의 'EmbeddedId' 어노테이션을 이용하여 효과를 본것을 정리하고자 합니다.

 

 

 

 

UserEntity의 ID를 AccessToken으로 사용할때의 가독성

맨 처음의 설계였습니다. accessToken을 UserEntity의 id로 사용을 하기위해서, accessToken 필드를 UserEntity에 추가했습니다. 그런데, 문제점은 UserEntity를 보고 어떤 값이 ID인지 파악이 어렵다는 점입니다.

 

 

물론 JAVA코드상에서는 @Id 어노테이션을 확인한다면, 금방 ID를 찾아낼 수 있습니다. 하지만 문제는 DATABASE입니다. 위의 그림은 H2 DB의 웹콘솔에서 UserEntity의 스키마를 확인하는 그림입니다. 현재 예제의 경우에는 데이터가 아주 소량이고, NAME이 ID일리는 매우 적기 때문에 ACCESS_TOKEN ID일거라는 추측은 가능합니다. 하지만 데이터가 많아질 경우 파악하기 위해서는 스키마를 확인해야할 것입니다.

 

 

 

 

@Column(name = "user_id") 을 이용해 DB 가독성 향상

DB의 가독성을 높이기 위한 방법으로, @Column(name = "")을 사용하는 방법도 있습니다.

 

user_id로 컬럼이름이 변경되어 훨씬 가독성이 높아졌습니다. 하지만 여전히 JAVA에서는 어떤 필드가 ID인지 파악하기가 조금 어렵습니다.

 

 

 

 

 

@EmbeddedId 와 @Column을 이용한 가독성 높이기.

@EmbeddedId어노테이션은 JPA의 ID필드로 별도의 객체를 사용할 수 있도록 도와주는 어노테이션 입니다.

 

ID 클래스 생성

우선 ID로 사용될 클래스를 생성합니다. UserEntity의 ID임을 쉽게 확인할 수 있도록 Class의 이름을 UserId로 작명했습니다. 그리고 accessToken이 id로써 사용됨을 표시하기 위해 필드이름은 accessToken으로 지정했습니다. 또한 DB에서의 가독성을 높이기위해서 @Column(name = "user_id")를 이용했습니다.

 

ID로 사용될 EmbeddedId 클래스는 꼭 Serializable을 구현해야 합니다. 그래야 DB에 영속화 될 수 있기 때문입니다.

 

 

@EmbeddedId 적용

UserEntity의 Id 필드를 앞서 생성한 UserId 클래스로 변경한 뒤 @EmbeddedId 어노테이션을 부여합니다.

 

 

 

 

결과

제가 사용하는 방법을 통해 제가 주장하는 바로는 2마리의 토끼를 잡을 수 있습니다. 각각은 아래에서 설명드리겠습니다.

 

DB의 가독성

@Coulmn을 통해 DB의 가독성이 향상됩니다.

 

 

Code의 가독성

@EmbeddedId를 통해 Type으로 명확하게 ID값이 무엇인지 읽을 수 있습니다. 또한 filed명으로 어떠한 값이 Id로써 사용되는지 표현이 가능합니다.