> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/9./undefined-1.md).

# 임베디드 타입

임베디드 타입\
\=>공통으로 관리 가능하다. 용어와 코드 공통화된다! 도메인의 언어를 공통적으로 사용할 수 있는 부분이 더 많아진다!

* 새로운 값 타입을 직접 정의할 수 있음
* JPA는 임베디드 타입(embedded type)이라 함
* 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
* int, String과 같은 값 타입
* 기존 회원 엔티티 : 이름, **근무 시작일, 근무 종료일**, **주소 도시, 주소 번지, 주소 우편번호**
* 임베디드 타입으로 정의한 회원 엔티티 : 이름, **근무 기간**, **집 주소**
* 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null\
  ex) Address homeAddress = null; 이면 Addreess의 필드(컬럼)들 모두 null이다.

임베디드 타입 사용법

1. @Embeddable: 값 타입을 정의하는 곳에 표시
2. @Embedded : 값 타입을 사용하는 곳에 표시
3. **기본 생성자 필수 //JPA가 동적으로 객체 생성해서 처리를 하나봄.**

임베디드 타입의 장점

* 재사용
* 높은 응집도
* Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
* **임베디드 타입을 포함한 모든 값 타입**은, **값 타입을 소유한 엔티티에 생명주기에 의존**함

임베디드 타입과 테이블 매핑

* 임베디드 타입은 엔티티의 값일 뿐이다.
* 임베디드 타입 사용 전 후에 매핑하는 테이블은 같음.
* 객체와 테이블을 아주 세밀하게(find-grained) 매핑 가능
* 잘 설계한 ORM(Object Relation Mapping) 애플리케이션은 **매핑한 테이블의 수<클래스 수**

**임베디드 타입과 연관관계**\
값 타입(임베디드 타입) 안에 엔티티가 들어갈 수 있다!!!

![](/files/-MegZKEYkfKa3OHTtmu8)

**@AttributeOverride**

한 엔티티에서 같은 임베디드 값 타입을 사용하려면 컬럼명이 중복되버린다!\
ex) 집 주소, 회사 주소\
\=>**@AttributeOverride: 속성 재정의**

**값 타입의 필드(컬럼)가 하나면 @AttributeOverride, 여러개면 @AttributeOverrides 사용해서 컬럼명 속성을 재정의한다!**

![@AttributeOverrides를 사용하여 임베디드 타입 Address를 오버라이딩하고 된 모습](/files/-MegZtmQuRp0wlmK1JZV)
