[Spring Data JPA] 값 타입(기본 값 타입, 임베디드 타입)

[Spring Data JPA] 값 타입(기본 값 타입, 임베디드 타입)

1. 개요

JPA는 데이터 타입을 크게 두 가지로 분류합니다.

Entity 타입 Value 타입

이 중 Value 타입에 대해 살펴보겠습니다.

2. Value 타입

Value 타입은 값의 변경을 추적할 수 없는 타입을 말합니다. int, double와 같은 Primitive 타입뿐만 아니라, Integer, String과 같은 클래스도 참조는 가지지만 값의 변경을 추적할 수 없기 때문에 마찬가지로 Value 타입에 속합니다. (값의 변경을 추적할 수 없다는 말은 값을 변경할 수 없다는 의미입니다. Integer, String의 값을 변경하면 참조하는 주소가 바뀝니다.)

JPA의 Value 타입은 세 가지로 나눠 생각해볼 수 있습니다.

기본 값 타입: int, double와 같은 Java의 Primitive 타입과, Integer, String과 같은 래퍼 클래스를 말합니다. Embedded 타입 (복합 값 타입): 기본 값 타입을 래핑해서 새롭게 만든 클래스 타입을 말합니다. Collection 값 타입: 위 1, 2번 타입을 List, Set과 같은 Collection 형태로 사용하는 것을 말합니다.

위 세 가지 분류를 하나씩 살펴보겠습니다.

3. 기본 값 타입

int, double과 같은 Primitive 타입은 힙 영역에 할당되어 참조를 가지는 것이 아니기 때문에 당연하고, Integer와 String 같은 클래스도 클래스이기 때문에 힙 영역에 할당되어 참조를 가지지만 Immutable(불변) 객체이기 때문에 동일한 참조로 값을 변경할 수 없습니다. 따라서 동일한 주소 참조를 가지로 값의 변경에 대해 추적하는 것이 불가능하기 때문에 Value 타입에 속합니다.

4. Embedded 타입 (복합 값 타입)

Embedded 타입은 값 타입을 여러 개 래핑해서 의미있는 이름으로 새롭게 만든 클래스 타입을 말합니다.

// Embedded 타입 예1 public class Position { int x, y; } // Embedded 타입 예2 public class Address { String city, street, zipcode; }

위처럼 만들면 더 객체지향스럽고 재활용하기도 좋습니다. Member Entity 클래스에 Address 임베디드 타입을 추가해보겠습니다.

@Embedded 애너테이션을 사용해 필드를 정의합니다.

@Entity public class Member { // ... 생략 @Embedded private Address address; }

Address 임베디드 타입은 다음과 같이 작성할 수 있습니다.

@Getter @Embeddable public class Address { private String city; private String street; private String zipcode; }

DB 입장에서 보면 임베디드 타입을 만드나 안

from http://pangtrue.tistory.com/346 by ccl(A) rewrite - 2021-12-03 10:01:48