JPA에서 사용하는 데이터 타입은 무엇이 있을까?
JPA의 데이터 타입
--
JPA에서 지원하는 데이터 타입은 2개로 분류된다.
- Entity 타입
- 값 타입
Entity 타입은
@Entity로 정의된 클래스(객체)로
데이터가 변해도 식별자를 통해 지속적으로 추적이 가능하다.
즉, 특정 엔티티의 내부 데이터를 변경해도 식별자를 통해 어떤 데이터인지 인식 가능
값 타입은
int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 의미하며
따로 식별자가 없고 값만 존재하여 값 변경 시 추적이 불가능하다.
즉, 값이 100에서 200으로 변경하면 기존에 100이었는지 인식 불가능
값 타입은 크게 3가지로 분류된다.
- 기본 타입
- 임베디드 타입 (복합 값 타입)
- 컬렉션 값 타입
그 외의 타입 종류
- 연관 관계 매핑 타입
--- 엔티티 간 관계를 표현할 때 연관관계 매핑 (단방향, 양방향, 1:1, 1:N, N:1, N:N)
- Enum 타입
--- enum 타입을 저장할 때 @Enumerated를 사용
- LOB 타입
--- 텍스트나 바이너리 같은 대용량 데이터를 저장할 때 @Lob를 사용
- Transient 타입
--- JPA가 관리하지 않도록 하는 필드에 @Transient를 사용
--
기본값 타입 (Basic Type)
--
JPA에서 엔티티 필드는 대부분 기본 타입을 사용하며,
이는 DB의 컬럼과 직접 매핑된다.
String name
int age
...
특징
- 생명주기는 엔티티에 의존 (A 엔티티를 삭제하면 그 안에 있는 필드들도 같이 삭제)
- 값 타입은 고유 불가 (A의 이름을 변경해도 B의 이름이 같이 변경되지 않는다.)
--
임베디드 타입 (Embedded Type, 복합 값 타입)
--
엔티티 내부에서 하나의 객체로 그룹화된 필드를 재사용할 때 사용하는 것으로
새로운 값 타입을 직접 정의하는 것이다.
주로 기본 값 타입들을 모아 만든 것으로 "복합 값 타입"이라고도 부른다.
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
private Address address; // Address 타입을 포함
}
사용 방법
- 값 타입을 정의하는 곳에 "@Embeddable" 적용
- 값 타입을 사용하는 곳에 "@Embedded" 적용
- 임베디드 클래스에는 기본 생성자를 필수로 넣어야 한다.
@Embedded, @Embeddable 둘 중에서 하나만 작성하고 나머지는 생략 가능
장점
- 재사용 (클래스를 따로 분리하여 다시 재사용 가능)
- 높은 응집도
- 해당 값 타입만 사용하는 의미 있는 메서드를 만들 수 있음
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존
임베디드 타입과 DB 테이블 매핑에서
DB 입장에서는 테이블이 변경될 일은 없다.
객체에서 값 타입을 사용하든 말든, 임베디드 타입을 사용하든 말든
테이블은 그대로이며 매핑만 잘해주면 된다.
특징
- 임베디드 타입은 그냥 엔티티의 값을 뿐
- 임베디드 타입을 사용하기 전과 후의 매핑하는 테이블의 상태는 그대로
- 깔끔한 설계가 가능 (잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음)
(그렇다고 많이 사용하지는 않음) - 임베디드 안에 임베디드를 가질 수 있음
- 임베디드 안에 엔티티도 가질 수 있음
- 임베디드 안에 @Column 같은 것도 일반 필드처럼 사용 가능
(기존 필드와 동일한 필드인데 따로 클래스에 묶어서 빼놓은 느낌이라고만 이해) - 임베디드 타입의 값이 null이면 매핑한 컬럼 값도 모두 null
--
참고 및 출처
'JPA' 카테고리의 다른 글
JPQL 기본 문법 (0) | 2025.04.07 |
---|---|
객체지향 쿼리 언어(OOQL) 종류 (0) | 2025.04.05 |
영속성 전이 (CASCADE) (+ 고아 객체) (0) | 2025.04.03 |
즉시 로딩 및 지연 로딩 (+ JPA의 프록시) (1) | 2025.04.02 |
상속관계 매핑 (+@MappedSuperclass) (1) | 2025.04.01 |