임베디드 타입(Embedded Type)이란?
오늘은 JPA 공부를 하던 중 만난 임베디드 타입에 대해서 정리해보겠습니다. 임베디드 타입에 대한 자세한 설명보다는 제가 이해한 것을 토대로 작성하였기에 일부 누락이 있고 오류가 있을 수 있습니다. 지적 및 조언 주시면 감사하겠습니다.
임베디드 타입이란?
단어 그대로 번역하면 내장된 타입이라고 합니다.
JPA에서는 데이터 타입이 두 가지로 나뉩니다. 엔티티 타입과 값타입입니다.
조금 간단하게 설명해보면, 엔티티 타입은 데이터가 될 타입입니다. 주로 우리는 @Entity를 사용해서 선언합니다.
또한 값 타입은, int, Integer 같은 자바에서 기본으로 사용하는 기본 타입 또는 객체를 의미합니다.
임베디드 타입은 값 타입입니다.
이제 이런 딱딱한 설명은 그만하고 실제로 임베디드 타입이 뭔지 알아봅시다.
임베디드 타입은 여러 타입들을 카테고리화한 것 같습니다. 예를 들어 우리가 어떤 회사의 직원 엔티티에 '주소'라는 정보를 넣고 싶습니다. 이럴 때는 주소의 정보를 구성하기 위해 '도시', '거리', '우편번호' 등으로 나눠서 엔티티를 구성할 수 있습니다.
그렇다면 회사 임원의 엔티티에도 '주소'라는 정보를 넣어야한다면, 도시, 거리 ... 이 많은 정보를 선언하는 JPA를 다시 일일이 작성해야할까요?? 이는 개발자가 가장 싫어하는 코드 중복을 발생시키는 것입니다.
이러한 중복을 싫어하는 개발자들을 위해 임베디드 타입을 사용합니다. 임베디드 타입은 위에 예제처럼 도시, 거리, 우편번호... 등을 클래스내에 필드로 묶어두어서 관리하는 것입니다. 이렇게 된다면, 우리는 임베디드 타입의 클래스 하나만 엔티티에 작성하면, 임베디드 타입의 클래스 내에 있는 모든 필드가 엔티티의 속성으로 들어가게 됩니다.
코드로 다시 살펴봅시다!
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
이 코드는 임베디드 클래스를 정의하는 부분입니다. 보시는 것처럼 @Embeddable로 어노테이션을 달아서, 해당 클래스가 임베디드 타입임을 알려줍니다.
@Entity
public class Member {
@Id @GeneratedValue
private Long Id;
private String name;
@Embedded
private Address address;
}
엔티티의 코드입니다. 임베디드 타입인 Address를 사용하기 위해 임베디드 타입을 속성으로 갖는 엔티티의 필드에는 @Embedded 어노테이션을 달아줍니다.
사실 이 두 개의 어노테이션 중 하나만 사용하여도 되지만, 코드의 가독성을 위해서 둘 다 붙여주는 것이 좋을 것 같습니다.
이렇게 되면 우리는 엔티티에 Address라는 속성을 넣은 것처럼 보이지만, 임베디드 타입이기 때문에 Address 클래스 내에 있는 필드인 city, street, zipcode의 속성이 Member 엔티티에 추가되게 됩니다.
따라서 임베디드 타입은 이러한 효율을 우리에게 제공하고 있습니다. 공통적인 속성들은 묶어서 임베디드 타입으로 사용하자!!
오늘 공부하면서 느낀 것입니다.