• ABOUT
  • PORTFOLIO
  • POSTS
  • GUESTBOOK

© 2025 BlueCool12 All rights reserved.

2025.09.29JPA

⚙️ 운영 환경까지 고려한 JPA 설정 가이드

1. 기본 설정 

spring:
datasource:
url: jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver

jpa:
hibernate:
ddl-auto: validate
properties:
hibernate:
format_sql: true
highlight_sql: true
jdbc:
time_zone: UTC
open-in-view: false

위 설정은 Spring Boot + JPA(Hibernate) 기반 애플리케이션에서 자주 사용하는 기본 설정 예시이다. 각각의 설정들에 대해 알아보자.


2. DDL 전략 선택 (ddl-auto) 

spring.jpa.hibernate.ddl-auto 속성은 JPA가 엔티티와 DB 스키마를 어떻게 동기화할지를 결정하는 옵션이다.

사용 가능한 옵션과 의미는 다음과 같다.

  • none 
    Hibernate가 스키마를 전혀 건드리지 않음
  • validate 
    엔티티와 실제 테이블 구조가 일치하는지 검증만 수행
  • update 
    엔티티 변경사항을 테이블에 반영(컬럼 삭제/타입 변경 등은 제한적)
  • create 
    애플리케이션 시작 시 기존 스키마를 삭제 후 새로 생성
  • create-drop 
    시작 시 생성하고 종료 시 삭제

참고로 update는 컬럼 추가는 가능하지만 컬럼 삭제, 컬럼 이름 및 타입 변경 작업은 수행하지 않는다. 이는 데이터 손실을 방지하기 위한 Hibernate의 설계 의도이다.

환경에 따라 ddl-auto 설정을 다르게 사용하는 것이 일반적인데 운영 환경에서는 Flyway 또는 Liquibase 같은 데이터베이스 마이그레이션 도구를 사용하여 스키마를 관리하기 때문에 Hibernate가 스키마를 변경하지 않도록 validate나 none을 사용하는 경우가 많다.


3. Hibernate Properties 

- Dialect

hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect

Dialect는 Hibernate가 SQL을 생성할 때 DB 벤더별 문법 차이를 처리하기 위한 규칙 집합이다. 예를 들어 문자열 처리 함수(concat), 페이징 쿼리(limit/offset), 시퀀스 생성 등은 DB마다 문법이 다르므로 Dialect를 통해 적합한 SQL로 변환된다. 

다만 Spring Boot 2.x 이후부터는 JDBC URL과 DB 메타데이터를 기반으로 Dialect를 자동감지하므로 대부분의 경우 별도 설정이 필요하지 않다.


- SQL 포맷팅 

spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
highlight_sql: true

format_sql은 실행되는 SQL을 줄바꿈과 들여쓰기로 정렬해주는 옵션이다. 추가로 highlight_sql을 사용하면 콘솔 출력되는 SQL에 ANSI 컬러 코드를 적용하여 키워드를 색상으로 강조해준다. 

show-sql은 Hibernate가 실행하는 SQL을 콘솔에 출력한다. System.out으로 로그를 출력하기 때문에 로그 프레임워크의 제어를 받지 않는다. 따라서 실무에서는 보통 다음과 같이 logging 설정을 사용하는 방식이 권장된다.

logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE​


- JDBC Time Zone

hibernate:
jdbc:
time_zone: UTC

DB에 저장되거나 조회되는 timestamp, datetime 컬럼의 기준 타임존을 지정한다. 애플리케이션 서버와 DB 서버의 타임존이 다를 경우 발생할 수 있는 시간 불일치 문제를 예방한다. 


4. Open-In-View (OSIV)

Open Session In View (OSIV)는 영속성 컨텍스트를 어느 계층까지 유지할지 결정하는 패턴이다.

spring:
jpa:
open-in-view: false

JPA/Hibernate는 영속성 컨텍스트가 열려 있어야 지연 로딩이 가능하다. 기본적으로 Spring Boot는 open-in-view: true가 디폴트이기 때문에 컨트롤러/뷰 계층까지 영속성 컨텍스트가 유지된다.

즉 서비스 계층에서 트랜잭션이 종료된 이후에도 컨트롤러나 뷰에서 엔티티의 지연 로딩 필드를 호출할 수 있다. 따라서 open-in-view: false를 설정하여 서비스 계층까지만 영속성 컨텍스트를 열고 그 이후 컨트롤러/뷰 계층에서는 닫는다. 

개발 환경에서는 편의상 true로 설정하기도 하지만 대부분 운영 환경에서는 성능, 안정성, 커넥션 관리 측면에서 false로 설정하는 경우가 많다.

false로 설정하는 경우 서비스 계층에서 필요한 데이터 조회 전략(Fetch Join, DTO Projection 등)을 명확히 설계하는 것이 중요하다.


5. Hibernate 성능 관련 설정

Hibernate는 기본 설정만으로도 동작하지만 성능 최적화를 위해 몇 가지 추가 설정을 사용할 수 있다.

- JDBC Batch

spring:
jpa:
properties:
hibernate:
jdbc:
batch_size: 100

hibernate.jdbc.batch_size는 여러 개의 INSERT 또는 UPDATE 쿼리를 배치(batch)로 묶어 실행하는 옵션이다. 이를 통해 데이터베이스 round-trip 횟수를 줄여 성능을 개선할 수 있다.


- Default Batch Fetch Size

spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 100

hibernate.default_batch_fetch_size는 지연 로딩 시 여러 엔티티를 한 번에 조회하도록 하는 옵션이다. 예를 들어 N+1 문제가 발생하는 상황에서 사용하여 쿼리 횟수를 줄일 수 있다.


- INSERT / UPDATE 정렬

spring:
jpa:
properties:
hibernate:
order_inserts: true
order_updates: true

이 옵션은 Hibernate가 실행하는 INSERT와 UPDATE 쿼리를 정렬하여 batch 처리 효율을 높이는 옵션이다. 대량 데이터 처리 시 batch 성능을 향상시킬 수 있다.

이전 글
⏱️ useEffect vs useLayoutEffect 완벽 정리 - 실행 시점과 사용법
다음 글
🔗 자바의 객체 비교 - equals()와 hashCode()를 함께 재정의해야 하는 이유
장식용 로고