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 | 29 | 30 |
31 |
Tags
- spring jpa
- @MappedSuperclasss
- 값 타입 컬렉션
- Database
- Remember-me
- 임베디드 타입
- 값 타입 비교
- 기본값 타입
- 객제지향 쿼리 언어
- 상속관계 매핑
- 다대다
- AnonymousAuthenticationFilter
- field column mapping
- 세션 생성 정책
- SessionManagementFilter
- 즉시 로딩
- Spring Security
- orphanRemovel
- 세션 고정 보호
- TABLE
- ddl-auto
- form login
- 기본 키 매핑
- 양방향 매핑
- 지연 로딩
- MySQL
- jpa
- concurrentsessionfilter
- 동시 세션 제어
- JPQL
Archives
- Today
- Total
hoondev
[Spring JPA] 임베디드 타입(복합 값 타입) 본문
임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입(embedded type)이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- int, String과 같은 값 타입
사용방법
다음과 같은 Member엔티티에서 공통으로 묶을 수 있는 부분을 찾아보자.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "username")
private String username;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String city;
private String street;
private String zipcode;
...
}
이 코드에서 startDate, endDate와 cit, street, zipcode끼리 묶으면 훨씬 깔끔해진다. 임베디드 타입으로 묶어보자.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "username")
private String username;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
...
}
@Embeddable
@Getter @Setter
public class Peroid {
private LocalDateTime startDate;
private LocalDateTime endDate;
...
}
@Embeddable
@Getter @Setter
public class Address {
@Column(name="city")
private String city;
private String street;
private String zipcode;
...
}
- @Embeddable: 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
임베디드 타입의 장점
- 재사용
- 높은 응집도
- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티 티에 생명주기를 의존함
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가 능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래 스의 수가 더 많음
@AttributeOverride: 속성 재정의
만약 한 엔티티에서 같은 타입의 임베디드 타입을 두개 사용하면 어떻게 될까?
당연히 중복되어 에러가 발생한다. 이때 @AttributeOverride라는 속성을 사용할 수 있다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "username")
private String username;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column=@Column(name="WORK_CITY")),
@AttributeOverride(name="street", column=@Column(name="WORK_STREET")),
@AttributeOverride(name="zipcode", column=@Column(name="WORK_ZIPCODE"))
})
private Address workAddress;
...
}
임베디드 타입과 null
임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null
Reference
'Spring JPA' 카테고리의 다른 글
[Spring JPA] 값 타입의 비교 (0) | 2023.02.08 |
---|---|
[Spring JPA] 값 타입과 불변 객체 (0) | 2023.02.07 |
[Spring JPA] 값 타입 (0) | 2023.02.05 |
[Spring JPA] 영속석 전이와 고아객체 (0) | 2023.02.03 |
[Spring JPA] 즉시 로딩과 지연 로딩 (1) | 2023.02.02 |
Comments