Programming/Java

[JPA] 값 타입(Value Type)

seandoesdev 2024. 2. 27. 10:58

값 타입은 JPA 강의를 보면서 엔티티를 정의할 때 Value Type이 명시 되어 있어서 자세히 알아보고자 정리하게 되었다.

 

Value Type

값 타입은 자바에서 다루는 원시 타입(Primitive Type)으로 int, Integer, String 등을 의미한다.

값 타입은 3가지로 나눌 수 있다.

  • 기본값 타입(basic value type)
    String, int, Integer 등 자바에서 제공하는 원시 타입 및 래퍼 클래스 타입

  • 임베디드 타입(embedded type)
    JPA에서 사용자가 직접 정의한 값 타입

  • 컬렉션 값 타입(collection value type)
    하나 이상의 값 타입을 저장할 때 사용

 

기본값 타입

@Entity
public class Member {

	@Id
    // ... (생략)
    
    private String state;
    private String city;
    private String zipCode;
}

값 타입은 엔티티에 의존하므로 다른 곳에 공유해선 안 된다.
다른 엔티티에서 Member 엔티티에서 city 값을 변경할 수 있으면 추적이 힘들어진다는 단점이 있다.

 

임베디드 타입

JPA에서 새로운 값 타입을 직접 정의해서 사용하는 것을 의미한다.

@Entity
public class Member {

	@Id
    // ... (생략)
    
    @Embedded
    private Address address;
}

@Getter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    private String state;
    private String city;
    private String zipCode;
}

임베디드 타입 정의는 어노테이션으로 하였고, 하나의 클래스에 모두 적용할 필요 없는 한 곳에만 정의해도 문제없다. 예를 들어, Member 클래스에 있는 private Address address;에 어노테이션만 추가해도 정상 동작한다.

모든 값들을 기본값 타입으로 선언에 대해 생각할 수 있는데, 그렇게 되면 알아보기 힘들고 객체애 대한 응집도가 떨어진다. 관련도니 기본값 타입을 클래스로 묶어 임베디드 타입으로 선언하게 되면 코드가 좀 더 명확해지는 장점이 있다.

 

값 타입 컬렉션

값 타입 하나 이상을 저장하기 위해 값 타입 컬렉션을 사용한다.

 

 

 

 

ref)

 

엔티티(Entity)와 값 타입(Value Type)

JPA의 데이터 타입을 가장 크게 분류하면 엔티티(Entity) 타입과 값(Value) 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는

devbksheen.tistory.com