250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링 폼
- FetchType
- querydsl
- 낙관적락
- CHECK OPTION
- SQL프로그래밍
- PS
- 다대다
- 연결리스트
- BOJ
- fetch
- 백트래킹
- 즉시로딩
- JPQL
- shared lock
- eager
- 유니크제약조건
- 다대일
- 데코레이터
- 연관관계
- exclusive lock
- 힙
- 일대다
- 비관적락
- 지연로딩
- dfs
- execute
- 동적sql
- 스토어드 프로시저
- 이진탐색
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
[JPA] 값 타입2 - 값 타입 컬렉션 본문
728x90
값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다.
@Entity
@Getter @Setter
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Embedded private Address homeAddress;
@ElementCollection
@CollectionTable(name = "FAVORITE_FOODS",
joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<>();
실무에서는 값 타입 컬렉션이 매핑된 테이블에 데이터가 많다면 값 타입 컬렉션 대신에 일대다 관게를 고려해야 한다.
// 값 타입 컬렉션 대신에 일대다 관게 사용
@Entity
public class AddressEntity {
@Id
@GeneratedValue
private Long id;
@Embedded Address address;
}
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<>();
...
엔티티 타입 (Entity Type)과 값 타입(Value Type)의 차이
엔티티 타입의 특징
- 식별자(@id)가 있다.
- 엔티티 타입은 식별자가 있고 식별자로 구별할 수 있다.
- 생명 주기가 있다.
- 생성하고, 영속화하고, 소명하는 생명 주기가 있다.
- 공유할 수 있다.
- 참조 값을 공유할 수 있다. 이것을 공유 참조라 한다.
- 예를 들어 회원 엔티티가 있다면 다른 엔티티에서 얼마든지 회원 엔티티를 참조할 수 있다.
값 타입의 특징
- 식별자가 없다.
- 생명 주기를 엔티티에 의존한다
- 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거된다.
- 공유하지 않는 것이 안전하다.
- 엔티티 타입과는 다르게 공유하지 않는 것이 안전하다. 대신에 값을 복사해서 사용해야 한다.
- 오직 하나의 주인만이 관리해야 한다
- 불변 객체로 만드는 것이 안전하다.
식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야 한다면 그것은 값 타입이 아닌 엔티티다.
'Spring' 카테고리의 다른 글
[JPA] JPQL (0) | 2023.02.25 |
---|---|
[JPA] JPQL, Criteria, QueryDSL 소개 (0) | 2023.02.25 |
[JPA] 값 타입1 - 복합, 연관관계, 재정의, 복사, 비교 (0) | 2023.02.19 |
[JPA] 영속성 전이 : CASCADE, 고아 객체 (0) | 2023.02.19 |
[JPA] 프록시, 즉시로딩, 지연로딩 (0) | 2023.02.19 |