Spring Boot · 2025-12-31

Spring Boot + PostgreSQL 설정과 트랜잭션, 성능 최적화

Spring Boot와 PostgreSQL 통합 설정부터 트랜잭션 관리, 커넥션 풀 및 성능 최적화 기법을 실무 관점에서 정리한 기술 요약과 주요 체크리스트

작성일 : 2025-12-31 ㆍ 작성자 : 관리자
post
목차

개요

Spring Boot 애플리케이션에서 PostgreSQL을 안정적으로 운용하려면 설정, 트랜잭션 이해, 그리고 커넥션 풀 튜닝이 필수다. 초보자도 이해할 수 있도록 기본 설정부터 실무에서 유용한 성능 개선까지 차근히 설명한다.

환경과 의존성

기본적으로 Spring Data JPA와 PostgreSQL 드라이버가 필요하다. 빌드 도구에 맞춰 의존성을 추가하면 된다. 의존성 추가 후 application.properties 또는 application.yml을 통해 데이터소스를 구성한다.

예시: Maven 의존성

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <scope>runtime</scope>
</dependency>

기본 설정

application.properties에서 데이터베이스 연결과 JPA 관련 옵션을 설정한다. 특히 커넥션 풀은 HikariCP가 기본이며, 적절한 최소/최대 커넥션 수를 지정하는 것이 중요하다.

예시: application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.datasource.driver-class-name=org.postgresql.Driver

# HikariCP 설정
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.connection-timeout=30000

# JPA 설정
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=validate

트랜잭션 관리

트랜잭션은 데이터 일관성의 핵심이다. Spring의 @Transactional을 사용하면 선언적 트랜잭션을 쉽게 적용할 수 있다. 전파(Propagation)와 격리(Isolation) 수준을 요구사항에 맞춰 설정해야 한다.

기본 사용법

import org.springframework.transaction.annotation.Transactional;

public class UserService {

  @Transactional
  public void createUser(UserDto dto) {
    // 저장 로직
  }

  @Transactional(readOnly=true)
  public UserDto getUser(Long id) {
    // 조회 로직
  }
}

트랜잭션 전파는 트랜잭션 경계가 중첩될 때 동작을 결정한다. 기본값인 REQUIRED는 기존 트랜잭션을 재사용한다. 높은 동시성과 복잡한 작업이 있다면 REQUIRES_NEW 또는 NESTED를 고려한다.

주의사항

  • private 메서드에는 @Transactional이 적용되지 않는다.
  • 예외 타입에 따라 롤백 동작이 다르다 (checked 예외는 기본적으로 롤백하지 않음).
  • long 트랜잭션은 커넥션 점유로 이어지므로 짧게 유지한다.

성능 최적화

성능은 여러 계층의 조합이다. 쿼리, 인덱스, 커넥션 풀, 배치 처리 등이 핵심 요소다. 먼저 쿼리 최적화와 인덱스 검토를 권장한다.

커넥션 풀 튜닝

postgresql connection pool spring boot 구성을 통해 안정성을 확보한다. HikariCP 설정은 애플리케이션 특성에 맞춰 최대 풀 사이즈, 최소 유휴 커넥션, 커넥션 타임아웃을 조정한다. 일반적으로 최대 풀은 예상 동시 세션 수와 DB 서버의 처리 능력을 고려해 설정한다.

쿼리와 인덱스

  • 빈번한 WHERE절 컬럼에 인덱스 추가.
  • 조인 대상 컬럼은 정규화와 인덱스 균형을 검토.
  • EXPLAIN 분석으로 비용이 큰 쿼리 식별.

배치와 벌크 연산

대량 INSERT/UPDATE는 배치 처리가 효율적이다. Spring Data JPA 사용 시 batch.size와 JDBC batch를 활용하면 네트워크 왕복을 줄일 수 있다.

캐싱과 읽기 복제

  • 읽기 부하가 큰 서비스는 Redis 같은 캐시 도입을 고려.
  • PostgreSQL의 읽기 복제를 통해 읽기 전용 트래픽 분산 가능.

모니터링과 운영

운영 중에는 연결 수, 쿼리 지연, 스텟먼트 풀 상태를 지속적으로 관찰한다. pg_stat_statements, HikariCP의 MBeans, 애플리케이션 로그가 주요 관측 지표다.

체크리스트

  • JDBC URL과 드라이버 버전 일치 여부 확인
  • HikariCP 설정으로 최대 커넥션과 타임아웃 검증
  • 트랜잭션 범위를 짧게 유지
  • 필요한 인덱스 존재 여부와 쿼리 플랜 점검
  • 배치 사이즈와 JDBC batch 활성화 여부 확인

마무리

spring boot postgresql 설정은 작은 실수로도 성능 저하나 장애로 이어진다. spring boot postgres 트랜잭션 이해와 postgresql connection pool spring boot 구성은 안정적 운영의 핵심이다. 위 내용을 토대로 설정을 점검하면 실무에서 발생하는 주요 문제를 예방할 수 있다.

spring boot postgresql 설정 spring boot postgres 트랜잭션 postgresql connection pool spring boot hikaricp 설정 spring data jpa postgresql 성능 최적화 트랜잭션 격리 수준 connection pool 튜닝