해당 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍을 참고하여 작성한 글입니다.
✅ JPA의 데이터 타입
JPA의 데이터 타입을 크게 2가지로 나누면 엔티티 타입과 값 타입으로 나눌 수 있다.
- 엔티티 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적이 가능하다.
- 예: Member Entity의 키나 나이 값을 변경해도 식별자로 인식 가능하다.
- 값 타입
- int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경 시 추적이 불가능하다.
- 예: 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체된다.
엔티티 타입의 특징 | 값 타입의 특징 |
식별자 O 생명 주기 관리 공유 |
식별자X 생명 주기를 엔티티에 의존 공유하지 않는 것이 안전(복사해서 사용) 불변 객체로 만드는 것이 안전 |
✅ 기본값 타입
▶ 기본값 타입 종류
- 자바 기본 타입(예: int, double)
- 래퍼 클래스(예: Integer)
- String
▶ 기본값 타입 특징
- 생명 주기가 Entity에 의존한다.
- 예: 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다.
- 값 타입은 공유하면 안 된다.
- 예: 회원 이름 변경 시 다른 회원의 이름까지 변경되면 안 된다.
int, double 같은 기본 타입(primitive type)은 절대 공유되지 않는다. 기본 타입은 항상 값을 복사해서 사용한다. Integer과 같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 기본 타입처럼 사용할 수 있게 지원하므로 기본값 타입으로 정의했다.
✅ 임베디드 타입(복합 값 타입)
- 임베디드 타입(embedded type): 새로운 값 타입을 직접 정의해서 사용하는 경우를 말한다.
- 직접 정의를 할 뿐 int, String과 같은 값 타입으로 구성되기 때문에 복합 값 타입이라고도 한다.
▶ 임베디드 타입 사용법
- @Embeddable: 값 타입을 정의하는 곳에 표시
- @Embedded: 값 타입을 사용하는 곳에 표시
- 기본 생성자가 필수이다.
- @AttributeOverrides, @AttributeOverride: 한 Entity에서 임베디드 값 타입을 사용하면 컬럼명이 중복되는데, 해당 어노테이션으로 컬럼명을 재정의할 수 있다.
🔽 임베디드 타입 사용 코드
@Embeddable //값 타입을 정의하는 곳
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
//기본 생성자 필수
public Period() {
}
}
@Embeddable //값 타입을 정의하는 곳
public class Address {
private String city;
private String street;
private String zipcode;
//기본 생성자 필수
public Address() {
}
}
@Entity
public class Member {
...
@Embedded //값 타입을 사용하는 곳
private Period period;
@Embedded //값 타입을 사용하는 곳
private Address address;
}
▶ 임베디드 타입의 장점
- 재사용
- 높은 응집도
- 값 타입별 사용할 특정 메서드를 따로 관리할 수 있다.
▶ 임베디드 타입과 테이블 매핑
- 임베디드 타입은 Entity의 값일 뿐이다. 따라서 값이 속한 Entity의 테이블에 매핑한다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게(fine-grained) 매핑하는 것이 가능하다.
- 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
- 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null이다.
📍 참고
'Programming > JPA' 카테고리의 다른 글
[JPA] 값 타입 비교 - 값 타입 (3) (1) | 2024.07.25 |
---|---|
[JPA] 값 타입과 불변 객체 - 값 타입 (2) (0) | 2024.07.25 |
[JPA] 영속성 전이(CASCADE)와 고아 객체 (1) | 2024.07.25 |
[JPA] 즉시 로딩과 지연 로딩 (0) | 2024.07.25 |
[JPA] 프록시 (1) | 2024.07.25 |