[JPA] 7. 값 타입

2022. 8. 12. 01:26·Back-End/JPA

JPA의 데이터 타입

 

JPA의 데이터 타입은 Entity 타입과 값 타입, 2가지로 나뉜다

 

Entity 타입은 기존에 @Entity Annotation으로 수식해주는 객체이고, 

 

Id를 가지고 있어 직접 DB 테이블에 매핑된다

 

 

값 타입은 int, Integer, String 처럼 단순히 값으로 사용되는 자바 기본 객체를 칭한다

 

엔티티에 속하므로 생명주기는 엔티티에 의존하게 된다

 

@Entity
public class Member {
	private String text; // Member가 사라지면 당연히 text도 사라진다!
}

 

임베디드 타입

 

값 타입에는 기본 값 타입 이외에도 임베디드 타입(복합 값 타입)이 있는데

 

프로그래머가 새롭게 정의한 객체라고 생각하면 된다.

 

예를들어 Member가 다음과 같은 필드(값 타입)를 가질때,

 

 

연관성이 있는 필드들 끼리 묶어서 새로운 값 타입으로 정의할 수 있다

 

마치 순수 Java에서 가독성을 위해 여러 필드들을 포함하는 새로운 클래스로 만드는것과 같다

 

 

 

Period와 Address 는 Primitive 값 타입이 아닌 Embedded 타입이므로,

 

Column에 매핑될 수 없고 따로 고유한 테이블이 있어야 한다.(마치 엔티티 처럼)

 

Embedded 타입을 사용했을 때의 장점은 다음과 같다

 

  • 재사용성
    • 필드조합을 새롭게 클래스단으로 분리시키므로 재사용이 용이해진다
  • 높은 응집도
    • 관련있는 필드들끼리 묶고 심지어 함수도 안에 정의할 수 있으므로 데이터들간의 연관성이 늘어난다
  • 값 타입을 소유한 엔티티의 생명주기를 따라간다
    • 따로 관리해줄 필요가 없다!

 

Embedded 타입을 가지는 Entity 객체를 DB 테이블에 매핑하면 다음과 같아진다

 

 

잘 보면 원래 버전의 DB Table과 달라진점이 하나도 없는것을 볼 수 있다

 

Embedded 타입은 특별한 것이 아닌 그저 Entity 객체의 필드값이다.

 

Embedded 타입을 사용하더라도 Table 구조 자체가 바뀌는것이 아니며 오직 프로그래머의 편의를 위해서 존재한다

 

 

값 타입 공유 참조

 

다음과 같은 상황을 생각해보자

 

 

 

@Entity
public class Member {
	@Embedded // 값 타입을 사용하겠다고 명시
	public Address address;
}

@Embeddable // 값 타입을 정의하기 위한 명시
public class Address {
	public class Address(); // 기본 생성자가 필수이다
	public String city = "old city";
}

public static void Main() {
	Address address = new Address();
	Member member1 = new Member();
    member1.setAdress(address);
    
    Member member2 = new Member();
    member2.setAdress(address);
    member2.getAdress().setCity("new city");
    
    //member1의 주소도 바뀌게 된다!
}

 

객체의 참조성으로 일어나는 이러한 Side-Effect를 막기위해 다음과 같은 방법을 생각해볼 수 있다

 

public static void Main() {
	Address address = new Address();
	Member member1 = new Member();
    member1.setAdress(address);
    
    Address address2 = new Address(address.getCity());
    Member member2 = new Member();
    member2.getAdress().setCity("new city");
    
    //member1의 주소는 바뀌지 않는다!
}

 

의도대로 동작하긴 하지만 이것도 프로그래머의 실수로 인해

 

새로운 객체 선언 및 초기화를 까먹는다면 예기치 못한 Side-Effect를 만들 수 있다

 

 

 

따라서 가장 완벽한 방법은 값 타입은 아예 불변 객체로 설계하는 것이다

 

public class Address {
	public Address(String _city) {
    	city = _city;
    }
	private String city = "old city";
    
    // 생성자 주입으로만 값을 변경할 수 있다.
    // Setter는 없거나 있어도 private으로 설정
}

 

 

 

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

 

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

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

www.inflearn.com

 

저작자표시 (새창열림)

'Back-End > JPA' 카테고리의 다른 글

[JPA] 6. 프록시와 Cascade 및 고아 객체  (0) 2022.08.04
[JPA] 5. 상속관계 Mapping & Mapped Superclass  (0) 2022.08.03
[JPA] 4. Entity간의 연관관계 Mapping  (0) 2022.07.30
[JPA] 3. Entity Mapping  (0) 2022.07.21
[JPA] 2. Persistent에 대한 이해  (0) 2022.07.20
'Back-End/JPA' 카테고리의 다른 글
  • [JPA] 6. 프록시와 Cascade 및 고아 객체
  • [JPA] 5. 상속관계 Mapping & Mapped Superclass
  • [JPA] 4. Entity간의 연관관계 Mapping
  • [JPA] 3. Entity Mapping
imsongkk
imsongkk
이것저것 적어보는 개발 블로그
  • imsongkk
    이것저것
    imsongkk
  • 전체
    오늘
    어제
    • 분류 전체보기 (81)
      • 일상 (1)
      • Infra (21)
        • AWS (3)
        • Docker (8)
        • Kubernetes (9)
        • Terraform (1)
      • Trouble Shooting (9)
      • Back-End (18)
        • Spring Boot (2)
        • JPA (7)
        • HTTP 기본 (4)
        • DDD (3)
      • 소마 (4)
      • Programming (7)
        • 디자인 패턴 (7)
      • etc (19)
        • Unity (4)
        • Node.js (2)
        • React (1)
        • 리액트를 다루는 기술 (2)
        • C# (6)
        • Language (0)
        • Firebase (2)
        • 알고리즘 (1)
        • CS (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Private
    Terraform #테라폼 #IaC #AWS CLI
    VPC #Subnet #NAT #Region #AZ #IGW
    Push
    도메인
    React
    Firebase Analytics
    포트
    소프트웨어 마에스트로 #소마 #SWM #소프트웨어 마에스트로 14기
    Git
    clone
    Pull
    EC2
    3000
    Google Analytics
    Firebase
    Repository
    8080
    firestore
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
imsongkk
[JPA] 7. 값 타입
상단으로

티스토리툴바