- 임베디드 타입의 개념을 파악한다.
- 임베디드 타입의 사용법을 파악한다.
- 임베디드 타입의 특징을 파악한다.
@AttributeOverride
의 용도를 파악한다.- 임베디드 타입의 한계와 대안을 파악한다.
- 임베디드 타입 : 복합 값 타입이라고도 불리며,
int
String
등 여러 타입을 모아 만든 새로운 값 타입을 의미한다.
아래와같이 유사한 필드를 묶어 응집도를 높이고 싶을 때, 임베디드 타입을 활용할 수 있다.
- @Embeddable : 타입을 정의하는 곳에 표시
- @Embedded : 타입을 사용하는 곳에 표시
- 기본 생성자는 필수이다.
- 임베디드 타입 정의
- 임베디드 타입 사용
장점
임베디드 타입을 통해 아래와 같은 장점을 얻을 수 있다.
- 높은 재사용성
- 높은 응집도
- 해당 타입만 사용하는 의미있는 메서드를 생성할 수 있다.
- 임베디드 타입은 엔티티에 생명주기를 의존한다.
테이블 매핑
임베디드 타입은 엔티티의 값일 뿐, 테이블의 구조에는 변함이 없다.
객체와 테이블이 세밀하게 매핑될 수 있도록 도와준다.
따라서 설계가 잘 된 ORM은 테이블의 수보다 클래수의 수가 더 많다.
만약 하나의 엔티티에서 같은 임베디드 타입을 사용하고싶다면 어떻게 해야할까?
- DB에서 컬럼명이 중복되는 문제가 발생하기 때문에,
@AttributeOverrides
와@AttributeOverride
를 사용하여 컬럼명을 재정의한다.
한계
임베디드 타입은 객체 타입이기 때문에, 기본 타입처럼 값을 복사해서 전달하지 않고 참조를 전달한다.
따라서 아래 코드를 실행하면,a
의 값 또한 New로 바뀌게된다.
객체 타입에 참조 값을 직접 대입하는 것을 막을 방법이 없기 때문에, 임베디드 타입을 사용한다는 것은 늘 이러한 위험에 노출되어 있음을 의미한다.
대안
이에 대한 대안으로서, 임베디드 타입을 불변 객체로 생성한다.
- 불변 객체 : 생성 시점 이후 값을 변경할 수 없는 객체
- 생성자를 통해서 값을 설정하고, setter를 생성하지 않거나
private
클래스로 명시한다.- 그럼에도 값을 바꾸고싶다면,
new
를 통해 생성자를 다시 호출해야한다.