Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Kuma's Curious Paradise

JPA의 값 타입(기본값 타입 / 임베디드 타입 / 컬렉션 값 타입)이란? 본문

스프링

JPA의 값 타입(기본값 타입 / 임베디드 타입 / 컬렉션 값 타입)이란?

쿠마냥 2024. 5. 21. 16:48

1. JPA의 데이터 타입은 크게 2가지다.

  1. 엔티티 타입 (@Entity)
  2. 값 타입

2. 이중 ‘값 타입’은 3가지로 분류된다.

  • 기본 값 타입 : int, double 등 자바 원시 타입 + Wrapper class + 특별한 친구 String

  • 임베디드 타입 : 엔티티 안에 엔티티! 예를 들면… User 안에 Address 엔티티
    • 주소처럼 여러 엔티티에서 공통 사용하는 정보를 임베디드 타입으로 정의하면 코드 중복은 줄이고 재사용성은 높일 수 있다.
    • 관련 있는 필드를 묶어 관리하므로 구조가 명확해지고 엔티티들의 관계를 이해하기가 쉬워진다.
    • 예시로, Address의 모든 속성들은 User 테이블의 컬럼이 된다. (따로 테이블 안 생김 주의!) + Address가 null이면 해당 컬럼 모두 null이다.
    • 정리하자면, 임베디드 타입은 엔티티의 값일 뿐이다.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;

@Entity
public class User {
    @Id
    private Long id;
    private String name;

    @Embedded
    private Address address;
}
import javax.persistence.Embeddable;

@Embeddable
public class Address {
    private String street;
    private String city;
    private String state;
    private String zip;
    
    // 임베디드 타입은 기본생성자가 필수!
    public Address() {
    } 
}

 

  • 컬렉션 값 타입
    • 만약 멤버의 주소가 여러 개라면?
    • 컬렉션 값 타입은 엔티티의 일부로 여러 값을 저장하고 싶을 때 사용한다.
    • 별도 테이블에 저장된다는 것이 특징! (ex. User의 pk를 fk로 사용한다.)
    • 자체적인 식별자를 가지지 않는다. (ex. Address는 pk가 없음!)
    • 주의1 : 컬렉션을 수정할 때는 내용을 복사해서 엔티티에 다시 설정하는 것이 좋음.
    • 주의2 : FetchType LAZY로 성능 최적화하여 쓰는 것이 좋음.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

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

    // 생성자, 게터, 세터
}

@Embeddable
public class Address {
    private String street;
    private String city;
    private String state;
    private String zipCode;
    
    // 임베디드 타입은 기본생성자가 필수!
    public Address() {
    } 
}


사용하는 어노테이션

  • @Embeddable : 저 임베디드 타입입니다!
  • @Embedded : 이 컬럼, 임베디드 객체예요~.
  • @AttributeOverride : 예를 들어 임베디드 타입 Address가 여러 곳에 매핑될 때 해당 컬럼을 user_street로 할지, partners_street로 할지 이름 지정할 때 사용한다. 
  • @ElementCollection : 이 컬럼, 임베디드 객체를 여러 개로 해서 컬렉션으로 관리하고 싶어요~.
  • @CollectionTable : 위에서 말한 컬렉션을 저장할 때 테이블 이름을 무엇으로 할지, 무엇을 외래 키로 받을지 지정해요.