Kuma's Curious Paradise
JPA의 값 타입(기본값 타입 / 임베디드 타입 / 컬렉션 값 타입)이란? 본문
1. JPA의 데이터 타입은 크게 2가지다.
- 엔티티 타입 (@Entity)
- 값 타입
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 : 위에서 말한 컬렉션을 저장할 때 테이블 이름을 무엇으로 할지, 무엇을 외래 키로 받을지 지정해요.
'스프링' 카테고리의 다른 글
테스트 코드3 - Service와 Manager 계층이 분리되어 있을 때의 테스트 (0) | 2024.07.02 |
---|---|
테스트 코드2 - 시큐리티 필터 테스트 만들기 (0) | 2024.06.02 |
JPA : N+1 문제 개념과 해결방법 (0) | 2024.05.29 |
테스트 코드1 - Member 관련 코드를 하나씩 살펴보며 이해하기 (0) | 2024.05.28 |
JUnit과 AssertJ의 차이점 (0) | 2024.05.25 |