코드 저장소.

Jpa - 값타입 본문

웹개발/Jpa

Jpa - 값타입

slown 2024. 5. 28. 02:42

목차

1.JPA의 데이터 타입

2.기본값 타입

3.임베디드 타입

4.컬렉션 값 타입

 

1.JPA의 데이터 타입

JPA에서의 데이터 타입은 크게 엔티티타입값 타입으로 되어있습니다.

 

엔티티 타입 

 

엔티티 타입은 @Entity로 정의를 할 수 있는 객체를  의미합니다.

 

값타입

 

값타입은 크게 3가지로 분류를 할 수 있습니다.

 

1.기본 값 

2.임베디드 타입

3.컬렉션 타입

2.기본값 타입

기본 값 타입은 자바에서 기본 타입, 래퍼 클래스, String을 예로 들 수 있습니다.

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class testEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

 

위의 코드에 testEntity라는 엔티티 안에 id와name은 Long,String이 기본 타입입니다. 또한 기본값 타입은 주의해야 할 점이 있는데 기본값은 엔티티에 의존적이라는 것입니다. 간단히 말하자면 각 엔티티 인스턴스가 독립적인 상태를 가지며, 다른 인스턴스와 상태를 공유하지 않는 것을 의미합니다. 이를 통해 데이터 무결성, 동시성 문제, 영속성 컨텍스트와의 호환성 문제를 방지할 수 있습니다.

 

3.임베디드 타입

임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고 공통 타입을 다양한 엔티티에서 재사용할 수 있습니다.

 

알기 쉽게 아래의 코드를 보면 알 수 있습니다.

@Embeddable
public class testEmbedded {

    private String phone;
    private String address;
    private String age;
    private String sex;

    public testEmbedded(){

    }
}
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class testEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    
    @Embedded
    private testEmbedded testEmbedded;
}

 

임베디드 타입인 클래스에 @Embeddable을 붙여주고 사용하는 엔티티에 @Embedded를 붙여주면 됩니다.

그러면 @Embeddable에 있는 컬럼이 testEntity에 들어갈 수 있는 것을 확인할 수 있습니다.

 

이 임베디드 타입을 통해서 알 수 있는 장점은 다음과 같습니다. 

 

재사용성

높은 응집도

값 타입별 의미있는 메소드를 만들 수 있다.

 

그리고 임베디드 타입을 사용하는데 있어서 주의사항이 있습니다.

  • 기본 생성자가 있어야 한다.
  • 불변적이어야 한다.
  • 엔티티에서 공유하여 사용하면 부작용이 발생한다.
  • 생명주기가 사용된 엔티에 의존한다.

4. 컬렉션 타입

값 타입 컬렉션은 엔티티의 필드로 사용되는 컬렉션이며, 컬렉션의 요소가 값 타입인 경우를 말합니다.

 

이해를 돕기 위해서 아래의 코드를 예시로 들겠습니다.

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

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

    // getters and setters
}

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ElementCollection
    @CollectionTable(name = "user_address", joinColumns = @JoinColumn(name = "user_id"))
    private List<Address> addresses = new ArrayList<>();

    // getters and setters
}

 

위의 코드를 설명하면 다음과 같습니다.  우선은 Address클래스는 @Emveddable로 정의를 해서 값 타입으로 사용을 합니다.  그 다음 User 엔티티에서 addresses 필드를 가지고 있으며, 이는 Address 값 타입의 리스트입니다.

 

@ElementCollection을 사용해서 값 타입 컬렉션을 명시를 하고, @CollectionTable을 사용해서 컬렉션 테이블의 이름과 조인 컬럼을 지정을 합니다. 여기서는 user_address 테이블이 생성되고, user_id 컬럼을 통해 User엔티티에 연결을 합니다.

 

그 후 실행을 하게 되면 user_address라는 별도의 테이블을 생성을 하고 addresses  컬렉션의 요소들을 저장을 합니다. 이 테이블은 다음과 같습니다.

 

user_idcitystreetzipcode

New York 5th Ave 10001
1 Boston Beacon St 02108

값 타입 컬렉션의  특징

종속성

  • 값 타입 컬렉션은 소유 엔티티에 종속적입니다. 즉, 소유 엔티티가 삭제되면 값 타입 컬렉션의 요소들도 함께 삭제됩니다.
  • 독립적 식별자 없음
    • 값 타입은 독립적인 식별자를 가지지 않습니다. 이는 값 타입 컬렉션의 요소들도 식별자를 가지지 않음을 의미합니다.
  • 변경 시 전체 삭제 후 재삽입:
    • 값 타입 컬렉션의 요소가 변경되면, JPA는 기존 요소들을 모두 삭제하고 새로운 요소들로 대체합니다. 이는 값 타입 컬렉션의 요소들이 데이터베이스에서 관리되는 방식 때문입니다.

마지막으로 컬렉션 타입을 사용하는데 있어서의 주의사항은 다음과 같습니다.

  • 데이터베이스 성능:
    • 값 타입 컬렉션의 변경 시 전체 삭제 후 재삽입 방식은 많은 데이터가 있을 때 성능에 영향을 미칠 수 있습니다. 따라서 대규모 데이터의 경우 별도의 엔티티로 모델링하는 것이 좋습니다.
  • 컬렉션의 크기 제한:
    • 값 타입 컬렉션의 크기가 매우 클 경우, 성능 문제와 관리 복잡성을 야기할 수 있습니다. 적절한 크기로 제한하거나, 필요한 경우 별도의 엔티티로 변경하는 것이 좋습니다.
  • 변경 불가능한 값 타입 사용:
    • 값 타입은 변경 불가능(immutable)하게 설계하는 것이 좋습니다. 이는 불변 객체의 특성을 활용하여 사이드 이펙트를 방지하고, 코드의 안정성을 높이는 데 도움이 됩니다.

출처

https://hstory0208.tistory.com/entry/JPA-임베디드-타입이란-Embeddable [< Hyun / Log >:티스토리]  

 

[JPA] 임베디드 타입이란? (@Embeddable)

임베디드 타입은 엔티티의 일부에 별도의 클래스를 사용하여 구현함으로써, 코드를 더 모듈화하고 재사용성을 높이는 방식이다. 임베디드 타입을 사용함으로써 복잡한 속성 그룹을 분리하고

hstory0208.tistory.com

https://zepettoworld.tistory.com/36

 

JPA 값 타입이란?

이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 기본편 강의를 참고하였습니다. www.inflearn.com/course/ORM-JPA-Basic/dashboard 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접하거나,

zepettoworld.tistory.com

 

'웹개발 > Jpa' 카테고리의 다른 글

Jpa - 프록시 및 로딩전략  (0) 2024.05.29
Jpa - 엔티티 연관관계  (0) 2024.05.25
Jpa - 영속성 컨텍스트  (0) 2024.05.13
Jpa [엔티티 매핑]  (0) 2024.05.11
Jpa 란 무엇인가??  (0) 2024.05.07