코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

JPA

값 타입

2022. 7. 27. 12:21

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

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

 

예시

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

Member 클래스

@Entity
public class Member extends BaseEntity {

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

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

    //기간 Period
    @Embedded
    private Period workPeriod;
    
    //주소 Address
    @Embedded
    private Address homeAddress;
    ...

Period 클래스

@Embeddable
public class Period {
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    ...

Address 클래스

@Embeddable
public class Address {
    private String city;
    private String street;
    private String zipcode;
    ...
  • 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null이다.
    • Period workPeriod = null; 
      • LocalDateTime startDate = null;
      • LocalDateTime endDate = null;

임베디드 타입 어노테이션

  • @Embeddable: 값 타입을 정의하는 곳에 표시 
  • @Embedded: 값 타입을 사용하는 곳에 표시 
  • 기본 생성자가 꼭 있어야 한다.

 

임베디드 타입의 장점

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

 

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

  • 임베디드 타입은 엔티티의 값일 뿐이다. 
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
  • 객체와 테이블을 아주 세밀하게(find-grained) 매핑하는 것이 가능 
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.

 

참고: 값 타입은 변경 불가능하게 설계해야 한다.  @Setter 를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자. JPA 스펙상 엔티 티나 임베디드 타입( @Embeddable )은 자바 기본 생성자(default constructor)를 public 또는 protected 로 설정해야 한다. public 으로 두는 것 보다는 protected 로 설정하는 것이 그나마 더 안전 하다.  JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수 있도록 지원해야 하기 때문이다.

 

@AttributeOverride

  • 엔티티에서 같은 값 타입을 사용하면? 컬럼 명이 중복되므로 @AttributeOverrides, @AttributeOverride를 사용해서 컬럼 명 속성을 재정의할 수 있다.

 

 

값 타입 컬렉션

https://lovecode.tistory.com/52

 

'JPA' 카테고리의 다른 글

실전! 스프링 부트와 JPA 활용1 정리  (0) 2022.08.02
객체지향 쿼리 언어  (0) 2022.07.27
고급 매핑  (0) 2022.07.26
다양한 연관관계 매핑  (0) 2022.07.25
연관관계 매핑 기초  (1) 2022.07.22
    'JPA' 카테고리의 다른 글
    • 실전! 스프링 부트와 JPA 활용1 정리
    • 객체지향 쿼리 언어
    • 고급 매핑
    • 다양한 연관관계 매핑
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바