🥕
TIL
  • [TIL] Studying tech / computer science knowledge
  • KeyMap
  • 알고리즘
    • 복잡도 계산 ( Computational Complexity )
    • DisjointSet-unionFind
    • Bellman-ford Algorithm
    • Dijkstra's Algorithm
    • DP ( Dynamic Programming , 동적 계획법 )
    • 플로이드-워셜 알고리즘 (Floyd-Warshall algorithm)
    • Kruskal's Algorithm
    • 최장 증가 수열 (Longes Increasing Subsequence)
    • Prim's Algorithm
    • 정렬
    • 시간복잡도 와 공간복잡도 ( Time Complexity & Space Complexity )
    • Topological Sort (위상 정렬)
  • 책 읽고난 후 요약
    • 프로그래밍 대회에서 배우는 알고리즘 문제해결 전략
    • cleancode
    • 도메인 주도 설계로 시작하는 마이크로서비스 개발
    • 오브젝트
  • CDC
    • debzium
    • kafka
  • 개발 상식
    • asciidoctor
    • 컴파일러
    • ELK 스택
    • 엔디안
    • git
    • Gitmoji
    • 테스트 종류
    • 라이브러리와 프레임워크
    • 정규 표현식
    • REST API
    • 동기와 비동기 / Blocking과 NonBlocking
    • Transaction Script와 Domain Model
    • 디자인 패턴
      • 행동 패턴
      • 객체 생성 패턴
        • 추상 팩토리 패턴
        • 빌더 패턴
        • 팩토리 메서드 패턴
        • [생성 패턴] 프로토 타입 (Prototype Parttern)
        • 싱글톤
      • 구조 패턴
        • 어댑터 패턴
        • 브릿지 패턴
        • 컴포짓(Composite) 패턴
        • 데코레이터
        • 프록시
    • refactoring
      • 중복 코드
      • 전역 데이터
      • 긴 함수
      • 긴 매개변수 목록
      • 가변 데이터
      • 이해하기 힘든 이름
  • 자료구조
    • AVL Tree
    • Splay Tree
    • aaTree
    • array-list
    • 자료구조 시간/공간 복잡도
    • 그래프
    • 힙
    • Red Black Tree
    • stack-queue
    • 트리 ( Tree )
  • DevOps
    • MSA
    • Kubernetes
      • AccessingAPI
      • controller
      • dashboard
      • kubernetes
      • object
      • pod
      • service
      • volume
  • Java
    • 어노테이션
    • 제어문
    • 데이터 타입
    • Enum
    • jvm
    • 연산자
    • thread
    • Java8
      • CompletableFuture
      • Date/Time
      • 어노테이션과 메타스페이스
      • 인터페이스
      • 람다식
      • Optional
      • 스트림
  • JavaScript
    • moduleProject
    • webpack-babel
    • 코어 자바스크립트
      • array
      • 함수 바인딩
      • 데코레이터와 포워딩
      • Class
      • 비교 연산자
      • Date 내장 객체
      • destructuring-assignment
      • function
      • 함수의 prototype 프로퍼티
      • 가비지 컬렉션 ( Garbage Collection )
      • JSON (JavaScript Object Notation)
      • map-set
      • 내장 프로토타입
      • new연산자와 생성자 함수
      • 객체
      • Object.keys, values, entries
      • 옵셔널 체이닝 '?.'
      • 프로퍼티 플래그
      • 프로퍼티 종류
      • 프로토 타입
      • 호출 스케줄링 ( scheduling a call )
      • scope
      • this
      • type-conversions
      • type
      • 함수의 자료형
      • var_let_const
  • Linux
    • 기본 명령어
    • 파일 종류
    • 리눅스
  • 네트워크
    • 응용 계층 ( Application Layer )
    • 오류 검출과 오류 정정
    • Http
    • Http Header
    • 컴퓨터 네트워크란
    • 네트워크 계층
    • 네트워크 제어 영역
    • 전송 계층 ( Transport Layer )
  • PHP
    • Facade
    • composer
    • scopeResolutionOperator
    • Laravel
      • SocialProvider
      • architecture
      • blade
      • controller
      • db
      • dbArchitecture
      • debug
      • eloquent
      • email
      • event
      • exceptionHandling
      • middleware
      • model
      • modelFactory
      • pagingLoading
      • queryBuilder
      • route
      • scout
      • seeding
      • tntsearch
      • validate
      • view
  • React
    • Next.js
    • React 란?
  • Spring
    • Controller
    • 요청이 들어왔을때 스프링이 처리하는 방법 ( 내부구조 )
    • ConfigurationProperties
    • Entity / DTO / VO
    • Maven
    • Repository와 DAO
    • 스프링 빈
    • Spring Framework
    • MVC 패턴
    • 도메인 입력값 검증
    • Spring Cloud
      • Spring Cloud
      • Eureka
    • Spring Data
      • JPA
      • JPA 어노테이션
      • 엔티티 비교
      • 복합 키와 식별 관계 매핑
      • JPA 예외처리
      • 객체지향 쿼리
      • EntityManagerFactory와 EntityManager
      • JPA 최적화
      • 프록시와 연관관계 맵핑
      • 연관관계
      • 상속관계 맵핑
      • 트랜잭션 범위와 영속성 컨텍스트
      • 데이터 타입
      • MySQL 연결
      • Pageable
    • Spring Project들과 library
      • Custom Serialize
      • Elasticsearch Index API
      • Spring HATEOAS
      • lombok (롬복)
      • Model Mapper
      • Object Mapper
      • Representation Model
      • Spring REST Docs
      • Spring Boot
    • Spring Security
      • Spring Security
      • Authentication
      • Authentication Filter
      • Authorization Filter
      • Filter Chain
      • SecurityContext
      • Spring OAuth2.0
    • Spring Test
      • AssertJ
      • Junit5
      • JunitParams
      • Mock Object
  • DataBase
    • ALIAS
    • CONCAT
    • CTE
    • Group By
    • HAVING
    • IFNULL
    • 인덱스
    • JOIN
    • ORDER BY
    • ROLLUP
    • SELECT
    • SELECT DISTINCT
    • SQL
    • WHERE
  • Web 상식
    • OAuth
    • WAS
    • HTTP통신 기반 인증
    • 브라우저
    • CSR 과 SSR
    • HTTPS
    • Web
Powered by GitBook
On this page
  • 엔티티 타입
  • 값 타입
  • ◾ 기본 값 타입(Basic type)
  • ◾ 임베디드 타입(Embedded type)
  • ◾ 컬렉션 값 타입(Primitive type)
  • ◾ 문제점
  • Refernece
  1. Spring
  2. Spring Data

데이터 타입

엔티티 타입

@Entity로 정의하는 객체로 이는 식별자를 통해 추적,관리가 가능하다.

값 타입

단순히 특정 데이터의 값으로 사용되는 primitive type 이나 Reference type과 같은 타입으로 단순히 값으로 사용되는 값이다.

값 타입은 엔티티 타입의 특정 데이터들을 표시하는 타입으로 생명주기를 엔티티에 의존하고 값 타입은 영속성을 위해 공유되면 안된다.

한 데이터에서 값을 변경할 때 다른 엔티티의 값이 변경되면 안되기 때문에 불변이어야 한다. 또한, 값 타입은 동등성을 판단하기 위해 equals/hashcode를 구현해야 한다.

◾ 기본 값 타입(Basic type)

  • 기본 타입 (Primitive type)

  • Wrapper Class

  • String

기본 타입과 String은 기본적으로 불변이고, Wrapper 클래스는 기본타입과 같이 표현할 수 있는 기능을 제공한다.

◾ 임베디드 타입(Embedded type)

새로운 값 타입을 직접 정의해서 사용할 수 있는 타입이고 복합키를 설정할때 Embedded Id를 설정한 것이 이에 해당한다.

@Entity
public class Member{
    //...
    @Embedded
    Address homeAddress;
}

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

위와 같이 어노테이션으로 임베디드 타입을 생성하고 사용할 수 있으며 임베디드 타입에는 특정 의미있는 메서드를 만들어 사용할 수도 있어 재사용성과 응집도가 높다.

임베디드 타입의 관계를 UML로 표현하면 컴포지션 관계가 되고 하이버네이트는 component라고 한다.

@AttributeOverride

임베디드 타입에 정의한 맵핑정보를 재정의하는 어노테이션

@Entity
public class Member{
    //...
    @Embedded
    @AttributeOverrides({
        @AttributOverride(name="city", column=@Column(name = "COMPANY_CITY")),
        @AttributOverride(name="street", column=@Column(name = "COMPANY_STREET")),
        @AttributOverride(name="zipcode", column=@Column(name = "COMPANY_ZIPCODE"))
    })
    Address homeAddress;
}

문제점

memeber1.setHomeAddress(new Address("old city"));
Address address = member1.getHomeAddress();

address.setCity("new city");
member2.setHomeAddress(address);

값 타입은 영속성을 위해 불변 객체이어야 하는데 객체이기 때문에 setter가 존재하면 불변성이 깨지며 위의 코드와 같이 member2의 주소정보만 변경하고 싶었지만 member1의 주소정보까지 변경되는 문제가 발생한다. (address라는 객체를 공유하기 때문)

그래서 이를 해결하기 위해서는 clone()메서드와 같이 값을 복사해서 사용하거나 애초에 setter를 없애 변경하지 못하도록 해야 부작용을 원천 봉쇄할 수 있다.

Address address = member1.getHomeAddress();

Address newAddress = new Address(address.getCity());
member2.setHomeAddress(newAddress);

◾ 컬렉션 값 타입(Primitive type)

값 타입을 하나 이상 저장하기 위한 타입

@Entity
public class Member{
    //...
    @ElementCollection
    @CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    @Column(name = "FOOD_NAME")
    private Set<String> favoriteFoods = new HashSet<String>();
}

값타입 컬렉션을 저장하려면 @CollectionTable을 이용해서 별도의 DB테이블과 맵핑해야 하고 별도의 테이블을 이용하기 때문에 삽입시 각각 insert query가 수행된다. 또한, 컬렉션도 조회시 패치 전략을 설정할 수 있고 LAZY가 기본이다.

값 타입은 모두 불변이기 때문에 수정하기 위해서는 삭제하고 새로 등록해야 한다.

◾ 문제점

값 타입은 엔티티 타입이 아니기 때문에 별도의 식별자로 관리 되는 것이 아니기 때문에 이 테이블의 수정사항이 발생하면 테이블에서 지우고 새로 insert하는 방법으로 수정을 한다. 이 때문에 성능에 문제가 발생할 여지가 있어서 데이터가 많다면 1:N관계를 고려해야 한다.

식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야 한다면 값 타입이 아닌 엔티티


Refernece

자바 ORM 표준 JPA 프로그래밍 책 (김영한 저)

Previous트랜잭션 범위와 영속성 컨텍스트NextMySQL 연결

Last updated 3 years ago