JPA에서는 데이터 타입을 두가지로 만들어 저장한다.
- 엔티티 타입
데이터가 변해도 식별자로 계속 확인 가능.
데이터의 인스턴스가 변경되어도 식별자를 통해 이게 무슨 데이터인지 알 수 있다.
예) 나이를 먹어도 나이를 보고 아 이게 나이구나 라고 알 수 있다. - 값 타입
Int, String처럼 단순값으로 사용되는 타입이나 객체
식별자가 없고 값만 있기 때문에 변경시 추적 불가능하다.
예) 26(하 2023년이제 이제...)을 보고 이게 나이인지(물론 난 알지) 뭔지 알 수 없다.
오늘 공부해본 값 타입에는 3가지가 존재한다.
- 기본값 타입(java에서 기본으로 제공해 사용할 수 있는 타입)
- 임베디드 타입(복합 값)
- 컬렉션 타입
(임베디드와 컬렉션은 JPA에서 설정해서 사용해야 한다. )
기본값 타입
String name, Integer age, Long id처럼 쓰이는, 쉽게 말하면 일반 변수 인스턴스 값의 타입이다.
생명주기는 엔티티에 의존된다.
엔티티를 생성할 때 같이 생성되고, 엔티티가 소멸되며 같이 소멸된다.
이러한 기본값 타입은 엔티티마다 다르고, 한 엔티티의 인스턴스가 변경된다고 다른 엔티티의 인스턴스가 같이 변하면 안된다.
임베디드 타입
직접 정의하는 값타입, 기본값들을 모아서 사용하기 때문에 복합값이라고 부르기도 한다.
값 타입이기 때문에 엔티티처럼 추적할 수 있는 것은 아니다.
예를 들면, 주소 = 국가/도시 + zipcode + 세부주소 로 만들 수 있다. 이를 회원엔티티에 따로 인스턴스를 두기보단, 주소라는 인스턴스를 만들어 주는게 더 추상화되어 설명하기 쉽다.
이렇게 엔티티의 값들을 묶어내는 방식처럼 생각한다.
JPA에서 사용하는 법
@Embeddable : 값 타입 정의되는 곳에 (주소)
@Embedded : 값 타입을 사용하는 곳에 (회원 Entity)
장점
재사용성이 좋다(주소를 다른 곳에서 똑같이 사용할 수 있다)
응집도가 좋다(값타입만 사용하는 메서드를 따로 만들어 사용할 수 있다)
임베디드타입도 값타입이기에 생명주기를 엔티티에 의존해 사용한다.
DB에서는 임베디드타입을 사용해도 테이블의 구조가 같지만,
객체와 테이블을 아주 세밀하게 매핑할 수 있다.
설계가 잘 된 애플리케이션은 테이블보다 클래스가 많다.
또한, 한 임베디드타입으로 여러 인스턴스를 만들고 싶을 때, @AttributeOverride를 사용해 다른 속성으로 만들 수 있다.
'스프링 공부 > JPA' 카테고리의 다른 글
[JPA] 21. Re.Zero : JPQL로 다시 시작하는 프로젝트! (0) | 2023.01.19 |
---|---|
[JPA] 20. JPA에서 쿼리를 쓰는 방법 (2) | 2023.01.17 |
[JPA] 17. 로딩(미안하다 이거보여주려고 어그로끌었다.) (0) | 2022.12.23 |
[JPA] 16. 프록시? Proxy? FrogC? 개구리씨? (0) | 2022.12.01 |
[JPA] 15. 짜잔! 사실 이건 상속관계 매핑은 아닙니다. @MappedSuperclass (0) | 2022.11.29 |