티스토리 뷰

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
링크
«   2025/01   »
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
글 보관함