값 타입인 경우

@Entity
public class DeliveryJpaEntity {
    ...
    
    @Embedded	// 생략 가능
    private AddressJpaEntity address;
    
    ...
}

@Embeddable
public class AddressJpaEntity {

    private String address;

    private String ji;

    private String bun;
}

 

값 타입 컬렉션인 경우

- 값 타입을 컬렉션에 담아서 쓰는 걸 값 타입 컬렉션이라 한다.

- 값 타입 컬렉션은 영속성 전이(Casecade)와 고아 객체 제거(Orphan remove)가 Default 이다.

@Entity
public class DeliveryJpaEntity {

    ...
    
    @ElementCollection	// 기본 fetch 전략은 lazy 이다.
    @CollectionTable(name = "delivery_item", joinColumns = @JoinColumn(name = "delivery_id"))
    private List<DeliveryItemJpaEntity> deliveryItems = new ArrayList<>();
    
    ...
}

@Embeddable
public class DeliveryItemJpaEntity {

    private String name;

    private Long quantity;

    private BigDecimal amount;
}

 

값 타입 컬렉션의 한계

엔티티는 ID로 DB에서 찾을 수 있기 때문에 쉽게 CRUD가 가능하나, 값 타입은 식별자라는 개념이 없기에 원본데이터를 찾기 어렵다, 값 타입 컬렉션은 별도의 테이블에 저장되는데 이 테이블 안에 있는 값타입의 값이 변경 되면 기존 값 타입 컬렉션을 제거하고 컬렉션 전체를 새롭게 저장하는 방식으로 이뤄진다. 때문에 컬렉션의 양이 많아지면 쿼리 수가 많아지기 때문에 컬렉션의 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계 엔티티로 수정하는 것을 고려해야 한다.

반응형

'SpringBoot > JPA' 카테고리의 다른 글

계층형 테이블 구현  (1) 2024.10.09
Inheritance 전략  (0) 2024.10.08
Springboo3 으로 변경 했을시에 QueryDSL 변경 점  (0) 2023.06.09

H2 DB (공식문서)

주요 특징

  • 매우 빠른 데이터베이스 엔진
  • 오픈 소스
  • 자바로 작성
  • 표준 SQL, JDBC API 지원
  • 임베디드 및 서버 모드, 클러스터링 지원
  • 강력한 보안 기능
  • PostgreSQL ODBC 드라이버를 사용.
  • 다중 버전 동시성

사용에 대한 고찰

 외부에 물리DB를 생성하기 어려울 때나, 사이드 프로젝트를 하고 싶은데 물리 DB를 생성하기 부담 스러울때 간단히 내부 DB를 사용하고자 인메모리DB인 h2 를 사용한다.


  

Spring Boot에 H2 DB 사용법

H2 DB는 두가지 모드인 Embedded Mode 와 Server Mode가 존재하며 각 특징으로는 

  • Embedded mode(내장모드) : Application 서버 실행 종료시 데이터 모두 휘발
    • H2를 Application과 동일한 JVM을 이용하여 구동, Application이 종료되면 Data가 휘발
  • Server mode(서버모드) : Application 서버 종료시에도 데이터가 휘발 되지 않는다.
    • 별도의 JVM을 이용하여 구동
    • 여러 Application이 해당 H2에 동시 접근 가능

두 가지 모드 중 어떤 걸 선택하느냐에 따라 SpringBoot의 application.yml 의 설정이 다르며 아래는 Embedded Mode에서의 사용 방법에 대해 서술하는 내용이다.

bulid.gradle에 JPA 와 h2에 관한 의존성을 추가한다. JPA 의존성을 추가하는 이유는  H2:1.4.198 버전부터 보안상의 문제로 자동 데이터베이스 생성을 막아 두어 DB 파일이 생성되지 않고 있기 때문에 더미 Entity 생성으로 DB 생성을 유도해야하기 때문이다. 또는 h2의 버전을 1.4.198 보다 낮은 버전으로 설정해야한다.

// build.gradle
dependencies {
	...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
//    runtimeOnly 'com.h2database:h2:1.4.197'
	...
}
# application.yml
  datasource:
    hikari: 
      jdbc-url: jdbc:h2:mem:testdb
      username: sa	# 필수로 입력해야만 한다. 
      password:
      driver-class-name: org.h2.Driver
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
  jpa:
    hibernate:
      ddl-auto: create-drop # 시작할 때 새로 생성 하고 세션을 마칠 때 스키마를 소멸 시킵니다.
    properties:
      hibernate:
        show_sql: true
        format_sql: true

application.yml에서 해당 h2.console.enabled: true 설정한 후 console창을 보게 되면

H2 console available at 이라는 문구를 확인할 수 있으며

localhost:8080/h2-console 로 접속하게 된다면 아래와 같은 화면을 볼 수 있다.

반응형

+ Recent posts