처음에 두 어노테이션을 구글에 검색했는데, 대부분 식별자와 공유에 대한 얘기만 있었다. 먼저 테이블 클래스 내 필드는 연결이 되어야 하는데 값 타입 필드는 공유가 되지 않는다고 한다. 그리고 식별자가 따로 없어 추적할 수 없다고 한다.
음... 뭔가 엔티티 타입과 값 타입의 차이점일 뿐, 임베디드 타입과 두 어노테이션에 대한 궁금증은 해소되지 않았다. 나는 좀 더 직관적인 필요성을 알고 싶었다. 그렇게 해서 찾은 것이 "객체지향"이었다. 데이터베이스 테이블 역시 객체지향으로 귀결하는 것이었다.
회원 엔티티는 식별자, 이름, 도시, 번지, 우편번호를 가진다. 코드를 보자면 두 가지 생각이 들어야 한다.
1. 회원 테이블이 식별자를 가지고 있다. 엔티티 타입이네?
2. 관심사가 겹치는 특정 필드가 너무 많다. 줄이고 싶다!!
회원 엔티티에게 있어서 이름은 필수이다. 하지만 도시, 번지, 우편번호는 회원 엔티티가 관리하기엔 책임이 맞지 않는다. 책임을 분리해주어야 한다.
그렇다면 회원 엔티티가 갖는 도시, 번지, 우편번호를 분리해 주자.
회원 엔티티가 갖는 도시, 번지, 우편번호를 Address 클래스로 분리해 주었다. 그런데 에러가 뜬다.
'Basic' attribute type should not be 'Address'.
이 에러는 엔티티 내에서 객체를 필드로 가질 때 발생하는 에러이다. 그럼 이 에러를 어떻게 해결해 주어야 할까? 이때 사용하는 것이 @Embedded, @Embeddable이다.
즉, 책임을 분리하기 위해 클래스를 생성하고, 해당 클래스의 객체를 테이블에서 참조할 때 @Embedded, @Embeddable가 필요하다. 새로운 책임을 갖는 클래스에 @Embeddable를 붙여주고, 해당 클래스의 객체를 갖는 필드에 @Embedded를 붙여주면 된다. 이때 임베디드 타입 클래스는 기본 생성자가 필수이다.
이쯤 되면 임베디드 타입을 사용하는 이유를 알 수 있다.
- 높은 응집도
- 코드의 재사용성
- 책임 분리
즉, 불필요한 책임을 분리하고 응집도를 높이기 위해서 @Embedded, @Embeddable를 사용해야 한다.
잘 설계한 ORM 애플리케이션일수록, 매핑한 테이블의 수와 클래스의 수가 많다는 것을 명심하자!
'Dev > JPA' 카테고리의 다른 글
[JPA] 엔티티에서 일급 컬렉션 사용하기 (0) | 2024.06.03 |
---|