Search
Duplicate

[Spring JPA] 값 타입 - 기본값 타입, 임베디드 타입

날짜
2022/04/29 05:25
상태
스프링 JPA 기본
속성 1
Spring
JAVA
JPA
담당자

기본값 타입

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;
Java
복사
package helloJpa; import javax.persistence.Embeddable; @Embeddable public class Address { //주소 Periodprivate 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; } }
Java
복사
package helloJpa; import javax.persistence.Embeddable; import java.time.LocalDateTime; @Embeddable public class Period { //기간 Periodprivate 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; } }
Java
복사

@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;
Java
복사
결론
임베디드 타입을 사용하면 좀 더 객체지향스럽게 유지할 수 있으며, 테이블에도 기존과 동일하게 값을 넣을 수 있어서, 이야기의 흐름처럼 작성할 수 있다.
이 글은 인프런의
제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.