Spring/스프링 JPA

값 타입 - 기본값 타입, 임베디드 타입

코징 2022. 4. 1. 16:08

기본값 타입

JPA의 데이터 타입 분류

  • 엔티티 타입
    • @Entitiy로 정의하는 객체
    • 데이터가 변해도 식별자로 지속해서 추적 가능
    • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능
  • 값 타입
    • int, Integerm String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
    • 식별자가 없고 값만 있으므로 변경시 추적 불가
    • 얘) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

값 타입 종류

  • 기본값 타입
    • 자바 기본 타입(int, double)
    • 래퍼 클래스(Integer, Long)
    • String
  • 임베디드 타입(embedded type, 복합 값 타입)
  • 컬렉션 값 타입(collection value type)

기본값 타입

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

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

  • int. double 같은 기본 타입(primitive type)은 절대 공유되지 않는다.
  • 기본 타입은 항상 값을 복사함
  • Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경 못한다.

임베디드 타입

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

임베디드 타입

  • 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.

위 표를 보게 되면 근무일(근무 시작일, 근무 종료일), 집주소( city, street, zipcode)로 묶어서 값 타입으로 변경시키는 것을 Embedded type이라고 한다. 이렇게 하면 우리가 실생활로 이야기하는 흐름처럼 자연스럽게 이해하고 넘어갈 수 있다는 장점이 있다.

 

임베디드 타입 사용법

  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

임베디드 타입의 장점

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

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

  • 테이블 적으로는 변경되지 않지만 객체지향 적으로 보게 되면 각각의 기능들을 묶을 수 있어서 사용하는 측면에서는 좀 더 직관적이고 편리하게 사용할 수 있다.

장점

객체와 테이블을 아주 세밀하게 매핑하는 것이 가능

잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

@Entity
public class Member extends BaseEntity {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;

    @Enumerated
    private Period workPeriod;
    @Enumerated
    private Address homeAddress;
package helloJpa;

import javax.persistence.Embeddable;

@Embeddable
public class Address {

    //주소 Period
    private String city;
    private String street;

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    private String zipcode;

    public Address() {

    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}

 

package helloJpa;

import javax.persistence.Embeddable;
import java.time.LocalDateTime;

@Embeddable
public class Period {

    //기간 Period
    private LocalDateTime startDate;
    private LocalDateTime endDate;

    public Period() {
    }

    public LocalDateTime getStartDate() {
        return startDate;
    }

    public void setStartDate(LocalDateTime startDate) {
        this.startDate = startDate;
    }

    public LocalDateTime getEndDate() {
        return endDate;
    }

    public void setEndDate(LocalDateTime endDate) {
        this.endDate = endDate;
    }
}

@AttributeOverried 속성 재정의

  • 한 엔티티에서 같은 값 타입을 사용하면?
  • 칼럼 명이 중복됨
  • @AttributeOverrides, @AttributeOverride를 사용해서 컬러 명 속성을 재정의
@Entity
public class Member extends BaseEntity {

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String name;

    @Enumerated
    private Period workPeriod;
    @Enumerated
    private Address homeAddress;

    @Enumerated
    @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;
결론

임베디드 타입을 사용하면 좀 더 객체지향스럽게 유지할 수 있으며, 테이블에도 기존과 동일하게 값을 넣을 수 있어서, 이야기의 흐름처럼 작성할 수 있다.

 

이 글은 인프런의

제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편

강사 : 김영한 님의 동영상을 참조해 만들었습니다.

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'Spring > 스프링 JPA' 카테고리의 다른 글

객체지향 쿼리 언어1 - 기본 문법  (0) 2022.04.05
값 타입 과 불변 객체  (0) 2022.04.01
영속성 전이 : CASECADE  (0) 2022.03.31
즉시 로딩과 지연 로딩  (0) 2022.03.31
프록시  (0) 2022.03.30