스프링 공부/JPA

[JPA] 18. 값타입이란거...들어보긴 했었나...?

장아장 2023. 1. 17. 14:55

도대체 이걸 뭐라고했었지 여태까지..?

JPA에서는 데이터 타입을 두가지로 만들어 저장한다. 

  • 엔티티 타입
    데이터가 변해도 식별자로 계속 확인 가능.
    데이터의 인스턴스가 변경되어도 식별자를 통해 이게 무슨 데이터인지 알 수 있다. 
    예) 나이를 먹어도 나이를 보고 아 이게 나이구나 라고 알 수 있다. 
  • 값 타입
    Int, String처럼 단순값으로 사용되는 타입이나 객체
    식별자가 없고 값만 있기 때문에 변경시 추적 불가능하다. 
    예) 26(하 2023년이제 이제...)을 보고 이게 나이인지(물론 난 알지) 뭔지 알 수 없다. 

 


오늘 공부해본 값 타입에는 3가지가 존재한다. 

  • 기본값 타입(java에서 기본으로 제공해 사용할 수 있는 타입)
  • 임베디드 타입(복합 값)
  • 컬렉션 타입

(임베디드와 컬렉션은 JPA에서 설정해서 사용해야 한다. )


Basic to Basick

기본값 타입

String name, Integer age, Long id처럼  쓰이는, 쉽게 말하면 일반 변수 인스턴스 값의 타입이다. 

생명주기는 엔티티에 의존된다. 

엔티티를 생성할 때 같이 생성되고, 엔티티가 소멸되며 같이 소멸된다. 

이러한 기본값 타입은 엔티티마다 다르고, 한 엔티티의 인스턴스가 변경된다고 다른 엔티티의 인스턴스가 같이 변하면 안된다. 


임베디드 시스템...개인적으로 제일 힘들었던 과목이다...와닿질 않더라...

임베디드 타입

직접 정의하는 값타입, 기본값들을 모아서 사용하기 때문에 복합값이라고 부르기도 한다. 

값 타입이기 때문에 엔티티처럼 추적할 수 있는 것은 아니다. 

 

예를 들면, 주소 = 국가/도시 + zipcode + 세부주소 로 만들 수 있다. 이를 회원엔티티에 따로 인스턴스를 두기보단, 주소라는 인스턴스를 만들어 주는게 더 추상화되어 설명하기 쉽다. 

이렇게 엔티티의 값들을 묶어내는 방식처럼 생각한다. 

JPA에서 사용하는 법

@Embeddable : 값 타입 정의되는 곳에 (주소)

@Embedded : 값 타입을 사용하는 곳에 (회원 Entity)

 

장점

재사용성이 좋다(주소를 다른 곳에서 똑같이 사용할 수 있다) 

응집도가 좋다(값타입만 사용하는 메서드를 따로 만들어 사용할 수 있다)

임베디드타입도 값타입이기에 생명주기를 엔티티에 의존해 사용한다. 

 

DB에서는 임베디드타입을 사용해도 테이블의 구조가 같지만, 

객체와 테이블을 아주 세밀하게 매핑할 수 있다. 

설계가 잘 된 애플리케이션은 테이블보다 클래스가 많다. 

 

또한, 임베디드타입으로 여러 인스턴스를 만들고 싶을 , @AttributeOverride 사용해 다른 속성으로 만들 있다.