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 |
Tags
- Django
- java
- 단방향
- clonecoding
- html
- JPA
- ORM
- JS
- 트랜잭션
- web
- 장고
- 노마드코더
- 장고독학
- 일대다
- AWS
- 프론트엔드
- 매핑
- 바닐라js
- TODO
- frontend
- python
- 영속성 컨텍스트
- SBERT
- css
- nomadcoder
- React
- 다대일
- 플러시
- javascript
- 다대다
Archives
- Today
- Total
꿈꾸는 새벽하늘
09장. 값 타입 본문
1. 기본값 타입
기본값 타입 (basic value type)
- 자바 기본 타입 (ex. int, double)
- 래퍼 클래스 (ex. Integer)
- String
2. 임베디드 타입 (복합 값 타입)
새로운 값 타입을 직접 정의해서 사용하는 경우 이를 임베디드 타입이라 한다.
임베디드 타입을 사용하기 위한 어노테이션
- @Embeddable 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
/* 값 타입 적용 회원 엔티티 */
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded Period workPeriod;
@Embedded Address homeAddress;
...
}
/* 기간 임베디드 타입 */
@Embeddable
public class Period {
...
}
/* 주소 임베디드 타입 */
@Embeddable
public class Address {
...
}
임베디드 타입은 기본 생성자를 반드시 생성해야 한다.
임베디드 타입을 포함한 모든 값 타입은 엔티티의 생명주기에 의존하므로 엔티티와 임베디드 타입의 관계를 UML로 표현하면 컴포지션 관계가 된다.
참고로 하이버네이트는 임베디드 타입을 컴포넌트(components)라고 한다.
엔티티에 @AttributeOverride를 사용하면 임베디드 타입에 정의한 매핑정보를 재정의할 수 있다.
임베디드 타입이 null이면 매핑한 컬럼 값은 모두 null이 된다.
3. 값 타입과 불변 객체
값 타입은 가능하면 불변 객체로 설계해야 한다.
객체를 불변하게 만들면 값을 수정할 수 없어서 예상치 못한 곳에서 문제가 발생하는 부작용을 원천 차단할 수 있기 때문이다.
불변 객체는 한 번 만들면 절대 변경할 수 없다. 따라서 불변 객체의 값은 조회할 수 있지만 수정이 불가능하다.
불변 객체도 객체이기 때문에 인스턴스의 참조 값 공유는 피할 수 없지만 참조 값을 공유하더라도 인스턴스의 값을 수정할 수 없으므로 부작용이 발생하지 않는다.
불변 객체를 구현하는 가장 간단한 방법은 생성자로만 값을 설정하고 수정자를 만들지 않는 것이다.
/* 주소 불변 객체 */
@Embeddable
public class Address {
private String city;
protected Address() {} // JPA에서 기본 생성자는 필수
// 생성자로 초기 값 설정
public Address(String city) {
this.city = city
}
// 접근자(Getter) 노출
pubic String getCity() {
return city;
}
// 수정자(Setter) 만들지 않음
}
4. 값 타입 컬렉션
값 타입을 하나 이상 저장하려면 컬렉션에 보관하고, @ElementCollection, @CollectionTable 어노테이션을 사용한다.
5. 값 타입의 특징
- 식별자가 없음
- 생명 주기를 엔티티에 의존
- 스스로 생명 주기를 가지지 않고 엔티티에 의존하므로 의존하는 엔티티를 제거하면 같이 제거된다.
- 공유하지 않는 것이 안전함
- 공유하지 않는 것이 안전하므로 값을 복사해서 사용해야 한다.
- 오직 하나의 주인만이 관리해야 한다.
- 불변 객체로 만드는 것이 안전하다.
'🌿 Spring & Spring Boot > 📗 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
11장. 웹 애플리케이션 제작 (0) | 2023.08.07 |
---|---|
10장. 객체지향 쿼리 언어 (0) | 2023.07.31 |
08장. 프록시와 연관관계 매핑 (0) | 2023.07.17 |
07장. 고급 매핑 (0) | 2023.07.11 |
06장. 다양한 연관관계 매핑 (0) | 2023.07.03 |