본문 바로가기
JPA

JPA - 기본값 타입과 임베디드 타입

by 왈레 2022. 4. 12.

1. 기본값 타입

이번내용은 JAVA의 데이터 타입에 대한 간단한 내용입니다.

 

JPA의 데이터 타입 분류

JPA 최상위 데이터를 크게 2가지로 분류한다.

 

1. 엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자로 지속해서 추적 가능
  • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능

 

2. 값 타입

  • int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
  • 식별자가 없고 값만 있으므로 변경시 추적 불가
  • 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

 

값 타입 분류

  • 기본값 타입 (기본적으로 공유가 되지않거나 되더라도 불변함으로 개발자가 안전하게 마음껏 사용할 수 있다.)
      • 자바 기본 타입(int, double)
      • 래퍼 클래스(Integer, Long)
      • String
  • 임베디드 타입(embedded type, 복합 값 타입)
  • 컬렉션 값 타입(collection value type)

 

기본값 타입

  • 예): String name, int age
  • 생명주기를 엔티티의 의존 ex)회원을 삭제하면 이름, 나이 필드도 함께 삭제
  • 값 타입은 공유하면X  ex)회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨

 

 

자바의 기본 타입은 절대 공유되지 않는다.

  • int, double 같은 기본 타입(primitive type)은 절대 공유되지 않는다.
  • 기본 타입은 항상 값을 복사함
int a = 10;
int b = a;

a = 20;

a,b 출력결과
a == 20
b == 10

 

  • Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 사이드 이펙트를 방지하기 위해변경자체가 불가능하게 만들어졌다. 참고로 래퍼 클래스나 String은 값이 아닌 reference을 가져간다.
Integer a = new Integer(10);
Integer b = a; //10이라는 값이 아닌 a의 reference가 넘어간다.

a.setValue(20); //setValue는 없는 메소드이지만, 있다고 가정

a,b 출력결과
a == 20;
b == 20;

같은 인스턴스를 공유하기 때문에 출력값이 동일하다.

 

 


 

2. 임베디드 타입(복합 값 타입)

  • 새로운 값 타입을 직접 정의할 수 있다
  • JPA는 임베디드 타입(embedded type)이라 한다.
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.
  • 임베디드 타입도 int, String과 같은 하나의 값 타입이다.

 

임베디드 타입 사용법

  • @Embeddable: 값 타입을 정의하는 곳에 표시 (둘 중 하나만 넣어도 상관없는데, 둘다 넣는걸 권장)
  • @Embedded: 값 타입을 사용하는 곳에 표시 (둘 중 하나만 넣어도 상관없는데, 둘다 넣는걸 권장)
  • 기본 생성자 필수

 

임베디드 타입의 장점

  • 재사용
  • 높은 응집도
  • Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
  • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함 (당연)

 

임베디드 타입과 테이블 매핑

 

@Embeddable
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    
    public boolean isWork(){
        ...
    }
}

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
}

@Entity
public class Member{
    ...

    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;
}

main{
    Member member = new Member();
    member.setWorkPeriod(new Period(...));
    member.setHomeAddress(new Address("city", "street", "zipcode"));
    
    em.persist(member);
}

 

임베디드 타입의 장점

  • 임베디드 타입은 엔티티의 값일 뿐이다.
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능
  • 모델링이 깔끔하게 떨어지고, 코드 보기도 편하고, 객체지향적인 관점에서도 좋다.
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.

 

임베디드 타입과 연관관계

Address나 PhoneNumber에서 값 타입뿐만 아니라 다른 Entity를 참조할 수 있다.

 

 

@AttributeOverride: 속성 재정의

한 엔티티에서 같은 값 타입을 사용하고싶다면?

public class Member{
    @Embedded
    private Address homeAddress;
    
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city",               //기존
                    column = @Column(name = "WORK_CITY")),  //변경 (새로운 테이블 컬럼명)
                    
            @AttributeOverride(name = "street",    
                    column = @Column(name = "WORK_STREET")),
                    
            @AttributeOverride(name = "zipcode",
                    column = @Column(name = "WORK_ZIPCODE"))
    })
    private Address workAddress;
}

 

• @AttributeOverride : 1개 일 경우

• @AttributeOverrides : 2개 이상

임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null

 

 

※출처 - 인프런 김영한 JPA

'JPA' 카테고리의 다른 글

JPA - 값 타입의 비교  (0) 2022.05.02
JPA - 값 타입과 불변 객체  (0) 2022.04.12
JPA - 영속성 전이(CASCADE)와 고아 객체  (2) 2022.04.11
JPA - 즉시 로딩과 지연 로딩  (0) 2022.04.11
JPA - 프록시  (0) 2022.04.11

댓글