티스토리 뷰

JPA

임베디드 타입, 엔티티 타입

절취선 2022. 5. 13. 00:20
반응형

JPA의 데이터 타입을 분류한다면 엔티티 타입값 타입 나눌 수 있다.

엔티티 타입은 @Entity로 정의하는 객체이고, 값 타입은 int, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다.

값 타입은 다음 3가지로 나눌 수 있다.

  • 기본 값 타입
    • 차바 기본 타입(int, double ...)
    • 래퍼 클래스(Integer ...)
  • 임베디드 타입
  • 컬렉션 값 타입

임베디드 타입

새로운 값 타입을 직접 정의해서 사용할 수 있는 값 타입의 일종으로 객체와 테이블을 세밀하게 매핑하는 것이 가능하다.

또한 정의한 값 타입에 의한 재사용성과 높은 응집도를 가질 수 있다.

엔티티 타입

특징

  • 식별자(@Id)가 있다.
    • 엔티티 타입은 식별자가 있고 식별자로 구별 할 수 있다.
  • 생명 주기
    • 생성하고, 영속화하고, 소멸하는 생명 주기가 있다.
    • em.persist(entity);
    • em.remove(entity);
  • 공유할 수 있다.
    • 참조 값을 공유할 수 있다.

값 타입

특징

  • 식별자가 없다.

  • 생명주기를 엔티티에 의존한다.

    • 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거된다.
  • 공유하지 않는 것이 안전하다.

    • 엔티티 타입과는 다르게 공유하지 않는 것이 안전하며, 대신에 값을 복사해서 사용해야한다.
    • 오직 하나의 주인만이 관리해야한다. (참조값에 의한 값 변경)
    • 불변 객체로 만드는 것이 안전하다.

문제

값 타입은 여러 엔티티에서 공유할 수 없다. 하나의 엔티티에서 값을 변경할 경우
같은 참조값을 바라보고 있는 엔티티에서 원하는 값이 나오지 않는다.

이 문제를 개선할 수는 없을까?

값 복사(clone)

객체를 복사하여 사용하면 새로운 참조값으로 값을 변경할 수 있고 공유참조로 인한 부작용을 피할 수 있다.

그러나 이 방법도 임시적인 방법일 뿐 이며 근본적인 문제는 해결할 수 없다.

불변 객체 선언

객채를 불변하게 만들면 값을 수정할 수 없으므로 부작용을 원천 차단할 수 있다.

불변 객체란 한번 만들면 절대 변경할 수 없는 객체를 말하며 조회는 가능하지만 수정은 할 수 없다.

불변 객체를 구현하는 방법중 하나는 생성자로만 값을 설정하고 수정자(Setter)를 구현하지 않으면 된다.

반응형

'JPA' 카테고리의 다른 글

JPA - 상속 관계 매핑  (0) 2022.06.24
프록시  (0) 2022.05.14
JPA 에서의 식별과 비식별  (0) 2022.05.12
ORM에서의 객체 연관 매핑  (0) 2022.05.11
SQL Mapper vs ORM  (0) 2022.05.10
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함