[JPA] 데이터 타입 분류

19·2022년 10월 18일
0

JPA

목록 보기
14/18

JPA의 데이터 타입 분류

엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자로 지속해서 추적이 가능하다
  • EX) Member 엔티티의 속성을 변경해도 식별자로 인식/추적이 가능하다

값 타입

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

값 타입 분류

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

기본값 타입

  • 생명주기를 엔티티에 의존한다
    • EX) Member를 삭제하면, 속성(이름, 나이등)도 함께 삭제된다
  • 값 타입은 공유하면 안된다
    • Member의 이름 속성 변경 시, 다른 Member의 이름 속성이 변경되면 안된다

임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있다
  • 주로 기본값 타입을 모아서 만들기 때문에, 복합값 타입이라고도 한다
  • int, String과 같은 값타입이다

예를 들어, 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다고 가정할 때,
엔티티를 이렇게 구성될 것이다.

  • 근무 시작일/종료일, 주소 도시/번지/우편번호는 유사하기 때문에 묶을 수 있다.

  • Period, Address로 묶었다.

Period, Address의 구성은 아래와 같다.
Member는 Period, Address를 가지고 있다.

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

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

@Entity
public class Member extends BaseEntity {

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

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

    // 기간
    @Embedded
    private Period workPeriod;
//    private LocalDateTime startDate;
//    private LocalDateTime endDate;

    // 주소
    @Embedded
    private Address homeAddress;
//    private String city;
//    private String street;
//    private String zipcode;
    
}
  • 임베디드 타입을 사용하지 않으면 주석친 코드대로 구현을 했어야 했다.
  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • 기본 생성자는 필수로 있어야 한다

임베디드 타입을 사용함으로써 재사용성과 높은 응집도 측면에서 장점을 가져갈 수 있다.

임베디드 타입을 구성했다고 해서, 테이블이 변경되거나 하지는 않는다.

  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다

한 엔티티에서 같은 값 타입을 사용해서 중복될때는, @AttributeOverrides, @AttributeOverride를 사용해서 컬럼명을 재정의한다.

@Entity
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;
}


데이터 삽입 예시)

Member member = new Member();
member.setName("member1");
member.setHomeAddress(new Address("homeCity", "street", "10000"));
  • 임베디드 타입인 Address 객체를 만들고 member에 넣어준다
    • 따로 persist해주지 않아도, member를 persist하면 데이터가 삽입된다.



참고

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근

0개의 댓글