티스토리 뷰
728x90
반응형
임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입(embedded type)이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- int, String과 같은 값 타입
일반적인 회원 클래스 형태 와 임베디드를 이용한 차이는 무엇인가?
일반적인 회원 클래스 코드
public class Member {
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
private LocalDateTime startDate;
private LocalDateTime endDate;
....
}
위와 같이 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다
그렇다면.. 임베디드 타입을 이용한 형태로는 어떻게 바꿀 수 있을까??
//회원
public class Member {
private Long id;
private String name;
@Embedded
private Period period;
@Embedded
private Address address;
...
}
//주소
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
...
}
//기간
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
...
}
위와 같이 회원 엔티티는 이름, 근무 기간, 집 주소를 가진다
id | name | start_date | end_date | city | street | zipcode |
임베디드 타입 사용법
- @Embeddable: 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
임베디드 타입의 장점
- 재사용
- 높은 응집도
- Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함
임베디드의 재사용성은 어떤것이 있을까?
(같은 임베디드 타입 객체를 여러번 사용하고 싶은 경우)
@AttributeOverride: 속성 재정의
- 한 엔티티에서 같은 값 타입을 사용하면?
- 컬럼 명이 중복됨
- @AttributeOverrides, @AttributeOverride를 사용해서 컬러 명 속성을 재정의
예시)
@Entity
public class Member{
@Id
@GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
private String name;
@Embedded
private Period period;
@Embedded
private Address address;
@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;
...
}
이미 Address로 선언된 임베디드 타입을 workAddress로 재사용을 이용하여 추가 선언이 가능하다.
해당 선언했을 때의 테이블 컬럼 생성 내용
id | name | start_date | end_date | city | street | zipcode | work_city | work_street | work_zipcode |
create 테이블 형태
create table Member (
MEMBER_ID bigint not null,
city varchar(255),
street varchar(255),
zipcode varchar(255),
name varchar(255),
endDate timestamp,
startDate timestamp,
WORK_CITY varchar(255),
WORK_STREET varchar(255),
WORK_ZIPCODE varchar(255),
primary key (MEMBER_ID)
)
임베디드 타입과 테이블 매핑의 연관성
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음
728x90
반응형
'프로그램 언어 > Spring JPA' 카테고리의 다른 글
Spring-JPA Repository 공통 인터페이스 사용법 (0) | 2023.06.22 |
---|---|
기본값 타입 (1) (0) | 2023.04.30 |
영속성 전이(CASCADE) (0) | 2023.04.28 |
지연 로딩, 즉시로딩 (0) | 2023.04.28 |
PROXY(프록시) (0) | 2023.04.28 |
250x250
반응형
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 권한
- mybatis
- 캘린더
- Lock
- insert
- 개념 이해하기
- ncp
- 캐시
- dfs
- spring
- dockerfile
- centos7
- hazelcast
- 도커
- Quartz
- 알고리즘
- 네이버 클라우드
- LocalDate
- leatcode
- Linux
- 격리수준
- 컨테이너
- 정의
- 리눅스
- 이미지
- MySQL
- docker
- Java
- Cache
- 스케줄러
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함