자바/JPA

JPA 값타입

류창 2022. 6. 27. 16:49
반응형

 

 

 

 

JPA 에서 쓰이는 값타입을 분류를 해보자.

 

 

엔티티 타입:

• @Entity로 정의하는 객체

• 데이터가 변해도 식별자로 지속해서 추적 가능

• 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능

 

값 타입 :

int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체

식별자가 없고 값만 있으므로 변경시 추적 불가

예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

 

 

 

엔티티 타입은 값타입이 여러개가 모여 생성된다고 보면된다.

 

 

 

여기서 값타입을 더욱 세부 분류해보자.

 

• 기본값 타입

• 임베디드 타입(embedded type, 복합 값 타입)

• 컬렉션 값 타입(collection value type

 

 

 

 

기본값타입

• 예): String name, int age

• 생명주기를 엔티티의 의존

   예) 회원을 삭제하면 이름, 나이 필드도 함께 삭제

• 값 타입은 공유하면X

  예) 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨

 

 

 

임베디드 타입

- 기본값 타입들을 모아서 새로운 값 타입을 만듬

 

• @Embeddable: 값 타입을 정의하는 곳에 표시

• @Embedded: 값 타입을 사용하는 곳에 표시

• 기본 생성자 필수

 

 

 

 

 

 

임베디드 타입의 사용 주의점

 

임베디드 타입은  기본값 타입이 모여서 새로운 객체타입으로 정의된 타입으로,

 

기본타입과 달리, 객체타입은 값을 참조해서 가져온다.

 

따라서, 임베디드 타입을 수정하려고 들면 안된다. (불변 객체)

 

-> 좀더 자세하게 설명하면,  회원 1이  임베디드 타입 Adress를 활용하여  서울 지역을 입력했다.

회원 2가 그다음, 임베디드 타입 Adress를 활용하여 부산 지역을 입력했다.

이렇게 하면  회원1, 회원2 둘다 부산지역이 입력이된다. 객체타입은 값을 참조해서 가져오기때문에 동시에 같이 바뀐다.

 

 

해결방법:

이 사태를 해결하기위해선  임베디드 타입 객체값의   Set메소드를 지워버리자.

 

처음 생성할때만 값을 넣을수있고,   수정자체를 막아버리는것이다. (불변 객체)

 

 

 

 

컬렉션 값 타입

 

• 값 타입을 하나 이상 저장할 때 사용

• @ElementCollection, @CollectionTable 사용

• 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.

• 컬렉션을 저장하기 위한 별도의 테이블이 필요함

 

 

컬렉션 값 타입의 대한 제약사항

• 값 타입은 엔티티와 다르게 식별자 개념이 없다.

• 값은 변경하면 추적이 어렵다

• 값 타입 컬렉션에 변경 사항이 발생하면, 주인 엔티티와 연관된 모든 데이터를 삭제하고, 값 타입 컬렉션에 있는 현재 값을 모두 다시 저장한다

• 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본 키를 구성해야 함: null 입력X, 중복 저장X

 

 

 

따라서, 값타임 컬렉션을 쓰는것보다, 일대다 관계를맺는 새로운 엔티티타입을 만들어 사용한다.

반응형

'자바 > JPA' 카테고리의 다른 글

Querydsl 기능 (1)  (0) 2022.07.27
스프링 JPA Querydsl 소개  (0) 2022.07.25
JPA : 상속관계 매핑  (0) 2022.06.15
JPA: 연관관계 매핑 (1:1 , 1:N, N:1, N:M)  (0) 2022.06.14
JPA: 엔티티(Entity) 매핑  (0) 2022.06.14