본문 바로가기

프로그래밍/JPA

JPA_JPA yml 파일 설정

의존성 추가 

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

yml 파일

server:
  port: 8080
  servlet:
    context-path: /
    
    
spring:
  mvc:
    view:
      prefix: /WEB-INF/view
      suffix: .jsp
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/green_blog?serverTimezone=Asia/Seoul
    username: ten
    password: 1q2w3e4r5t!  
  
  jpa:
    open-in-view: true
    hibernate:
      ddl-auto: create
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: true
    show-sql: true
    properties:
      hibernate:
        format_sql: true

→ open-in-view: true

open-in-view는 JPA에서 제공하는 옵션 중 하나로, 요청과 응답 처리를 하나의 트랜잭션으로 묶어주는 옵션이다.

open-in-view를 true로 설정하면 HTTP 요청의 시작부터 끝까지 영속성 컨텍스트가 열린 상태로 유지된다. 이는 EntityManager가 요청에 대한 모든 뷰 렌더링 및 HTTP 응답 작성까지 사용 가능한 상태를 유지하기 때문이다. 이를 통해 편리한 데이터 접근성을 제공하지만, 너무 많은 데이터를 조회하거나 부하가 많은 쿼리를 실행하는 경우 성능에 부정적인 영향을 줄 수 있다.

 

관례상 OSIV 라고 한다.

OSIV는 Open Session In View의 약자이다. Hibernate와 같은 ORM 프레임워크에서 사용하는 기능 중 하나로, HTTP 요청이 처리되는 동안 영속성 컨텍스트를 열어서 뷰 렌더링까지 영속성 컨텍스트를 유지하는 것을 의미한다.

true일 경우 영속성 컨텍스트 범위가 트랜잭션 범위를 넘어서 뷰 레이어까지 살아있다. (단, 뷰 레이어에서 수정 안 됨.)
false일 경우 트랜잭션을 종료할 때 영속성 컨텍스트 또한 닫힌다.

 

→ Hibernate

: Hibernate는 JPA의 구현체 중 하나로서, JPA와의 호환성을 지원하면서도 다양한 확장 기능과 편의 기능을 제공한다.

 

→ ddl-auto: create

: Hibernater가 데이터베이스 스키마를 생성하는 방법을 설정하는 프로퍼티이다.

이 프로퍼티는 애플리케이션이 시작될 때 Hiberante가 데이터베이스에 필요한 스키마를 생성하도록 지정할 수 있다.

 

ddl-auto 프로퍼티에는 여러가지 값이 있다.

  • none :  Hibernater가 스키마를 생성하거나 수정하지 않도록 한다.
  • create : 애플리케이션을 시작할 때마다 Hibernate가 스키마를 새로 생성한다.
  • create-drop : 애플리케이션을 종료할 때 Hibernate가 스키마를 삭제한다.
  • update : Hibernate가 스키마를 수정한다.
  • validate : Hibernate가 데이터베이스 스키마를 유효성 검사한다. 

(create와 update를 적절히 섞어 사용해줘야 함.)

 

→ DDL Naming 전략

: JPA는 DDL Naming 전략이란 database(카멜 로케이션)와 java(파스칼 케이스)간의 이름 맞추기 전략이다.

 

기본적으로 JPA는 DDL을 진행할 때 Entity 이름과 해당 필드들을 lower_under_score 방식을 이용한다. 

jpa.hibernate.naming은 Hibernate에서 엔티티 클래스와 테이블 간의 네이밍 전략(strategy)을 지정하는 설정이다. 이 설정을 통해 논리적으로 동일한 의미를 가진 엔티티와 테이블 간의 네이밍 규칙을 맞출 수 있다.

 

자바에서 camelCase로 작성된 엔티티 클래스를 MySQL에서는 snake_case로 작성된 테이블로 매핑하고자 한다면, 

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl로 설정하고, spring.jpa.hibernate.naming.physical-strategy 속성을 구현한 클래스를 작성하여 naming_strategy 패키지에 등록한다.

 

이렇게 설정하면, Hibernate는 엔티티 클래스와 테이블 간의 네이밍 전략에 따라, my_field와 myField로 매핑하여 사용한다. 이를 통해 네이밍 규칙이 일관성을 갖게 되어 유지보수가 용이하다.

 

  • Implict Naming Strategy (암시적 명칭 전략)
  • Physical Naming Strategy (물리적 명칭 전략)

 

→ use-new-id-generator-mappings: true 설정

use-new-id-generator-mappings: true 설정은 Hibernate 5.0 이상에서 추가된 새로운 ID 생성 전략을 사용하도록 지정하는 옵션이다. 이 옵션을 사용하면 JPA의 @GeneratedValue 어노테이션을 통해 쉽게 ID 생성 전략을 설정할 수 있다.

 

→ spring.jackson.serialization.fail-on-empty-beans

Jackson 라이브러리에서 JSON 직렬화를 수행할 때, 객체의 필드가 모두 null인 경우 빈 JSON 객체 ({})를 반환할지 여부를 설정하는 속성이다. 

 

기본값이 true로 설정되어 있어, 모든 필드가 null인 객체를 직렬화할 경우 JsonMappingException이 발생하도록 되어 있다.

이 속성을 false로 설정하면, 빈 JSON 객체 ({})가 반환된다. -> {}

 

 

model 패키지 > User.java 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.tenco.blog.model;
 
import java.sql.Timestamp;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String password;
    private String email;
    private Timestamp createdDate;
}
cs

 

mysql

SELECT * FROM user;

 

'프로그래밍 > JPA' 카테고리의 다른 글

JPA_테이블 생성  (0) 2023.06.06
JPA_더티체킹(dirty checking)  (0) 2023.05.13
JPA_Pageable 페이징 처리  (0) 2023.05.13
JPA_JPA와 connection pool  (0) 2023.05.13