꿈꾸는 새벽하늘

09장. 값 타입 본문

🌿 Spring & Spring Boot/📗 자바 ORM 표준 JPA 프로그래밍

09장. 값 타입

rovemin 2023. 7. 24. 23:24

1. 기본값 타입

기본값 타입 (basic value type)

  • 자바 기본 타입 (ex. int, double)
  • 래퍼 클래스 (ex. Integer)
  • String

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

새로운 값 타입을 직접 정의해서 사용하는 경우 이를 임베디드 타입이라 한다.

 

임베디드 타입을 사용하기 위한 어노테이션

  • @Embeddable 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
/* 값 타입 적용 회원 엔티티 */
@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    
    private String name;
    
    @Embedded Period workPeriod;
    @Embedded Address homeAddress;
    
    ...
}
/* 기간 임베디드 타입 */
@Embeddable
public class Period {
    ...
}
/* 주소 임베디드 타입 */
@Embeddable
public class Address {
    ...
}

임베디드 타입은 기본 생성자를 반드시 생성해야 한다.

임베디드 타입을 포함한 모든 값 타입은 엔티티의 생명주기에 의존하므로 엔티티와 임베디드 타입의 관계를 UML로 표현하면 컴포지션 관계가 된다.

참고로 하이버네이트는 임베디드 타입을 컴포넌트(components)라고 한다.

 

엔티티에 @AttributeOverride를 사용하면 임베디드 타입에 정의한 매핑정보를 재정의할 수 있다.

 

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

3. 값 타입과 불변 객체

값 타입은 가능하면 불변 객체로 설계해야 한다.

객체를 불변하게 만들면 값을 수정할 수 없어서 예상치 못한 곳에서 문제가 발생하는 부작용을 원천 차단할 수 있기 때문이다.

 

불변 객체는 한 번 만들면 절대 변경할 수 없다. 따라서 불변 객체의 값은 조회할 수 있지만 수정이 불가능하다.

불변 객체도 객체이기 때문에 인스턴스의 참조 값 공유는 피할 수 없지만 참조 값을 공유하더라도 인스턴스의 값을 수정할 수 없으므로 부작용이 발생하지 않는다.

 

불변 객체를 구현하는 가장 간단한 방법은 생성자로만 값을 설정하고 수정자를 만들지 않는 것이다.

/* 주소 불변 객체 */
@Embeddable
public class Address {
    
    private String city;
    
    protected Address() {} // JPA에서 기본 생성자는 필수
    
    // 생성자로 초기 값 설정
    public Address(String city) {
        this.city = city
    }
    
    // 접근자(Getter) 노출
    pubic String getCity() {
        return city;
    }
    
    // 수정자(Setter) 만들지 않음
}

4. 값 타입 컬렉션

값 타입을 하나 이상 저장하려면 컬렉션에 보관하고, @ElementCollection, @CollectionTable 어노테이션을 사용한다.

5. 값 타입의 특징

  • 식별자가 없음
  • 생명 주기를 엔티티에 의존
    • 스스로 생명 주기를 가지지 않고 엔티티에 의존하므로 의존하는 엔티티를 제거하면 같이 제거된다.
  • 공유하지 않는 것이 안전함
    • 공유하지 않는 것이 안전하므로 값을 복사해서 사용해야 한다.
    • 오직 하나의 주인만이 관리해야 한다.
    • 불변 객체로 만드는 것이 안전하다.