의존성 추가
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 요청이 처리되는 동안 영속성 컨텍스트를 열어서 뷰 렌더링까지 영속성 컨텍스트를 유지하는 것을 의미한다.
→ 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 |