본문 바로가기
프로그래밍/JPA

[JPA] Embedded Type

by yonmoyonmo 2021. 5. 28.
김영한님의 책 [JPA 프로그래밍]을 읽고 요약한 내용입니다.

임베디드 타입

자바 기본 타입이나 객체 말고 따로 직접 정의해서 값으로 사용할 수 있다.

이것을 JPA에서는 임베디드 타입(embedded type)이라고 한다.

좀 더 응집력 있고 객체지향 적인 매핑을 할 때 사용한다.

@Embeddable
public class Period {
	@Temporal(TemporalType.DATE)
	private Date startDate;
	@Temporal(TemporalType.DATE)
	private Date endDate;
	
	public void 뭐시기(){...대충 이 embedded를 위한 메소드...}
	//기본 생성자 필수
}

@Entity
public class Member {
	@Id
	private Long id;
	private String name;
	@Embedded Peridod memberPeriod;
}

 

요런식으로 쓸 수 있다.

테이블에는 임베디드를 쓴 티 없이 컬럼에 평범하게 저장된다.

임베디드 타입은 임베디드 타입을 포함하거나 엔티티를 참조할 수 있다.

@Embeddalble
public class Address {
	private String city;
	@Embedded Street street;
}
@Embeddable
public class Street {
	private String name;
	private Long number;
}

요런 식이나

@Embeddable
public class Manager {
	String name;
	Long age;
	@ManyToOne
	Company company;
}
@Entity
public class Company {
	@Id
	private Long id;
	.....
}

 

이런 것이 가능하다.

@AttributeOverrides 를 이용하면 같은 값 타입을 여러개 쓸 때 매핑될 컬럼 이름을 각각 다르게 설정할 수도 있다.

값 타입과 불변 객체

임베디드 타입으로 만들어진 값은 사실 자바 기본 값 타입처럼 값이 아니라 객체이기 때문에 "참조"된다.

이 말은 영속성 콘텍스트 내에서 돌려쓰면 안된다는 뜻이다. 두 개 처럼 보이지만 사실 하나이기 때문이다.

복사해서 쓰고 싶으면 객체를 복사하듯이 복사해야한다. 단순히 대입 연산을 한다고 복사가 되지 않는다.

이렇게 참조 값을 돌려 쓰지 않으려 해도 돌려 쓰는 실수를 막을 방법이 없다.

개발자의 실수로 언제든지 참조를 조리돌릴 수 있기 때문이다.

그래서 이런 임베디드 같은 값 타입 객체는 setter 없이 쓰는 것이 전통적인 부작용 방지법이다.

setter를 구현하지 않고 생성자로만 초기화해서 써야한다.

수정이 안되니까 아무튼 돌림 당하다가 수정되는 상황은 막을 수 있다.

값 타입 컬렉션

값 타입을 하나 이상 저장할 때, 컬렉션에 저장하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다.

이러면 컬렉션은 데이터베이스 상에 또 다른 테이블로 매핑된다. @CollectionTable 속성 값으로 연관관계 등 컬럼 설정을 할 수 있다.

 

 

'메모장/JPA' 카테고리의 글 목록

프로그래밍 & 일상

wonmocyberschool.tistory.com

 

댓글