IT Developer/Spring

Spring 기초 <39. Spring Boot에서 서버 성능 튜닝 및 최적화 방법>

TEMA_ 2025. 4. 24. 13:17
반응형

스프링 Spring

39. Spring Boot에서 서버 성능 튜닝 및 최적화 방법

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. Spring Boot 서버 성능 튜닝이 필요한 이유

Spring Boot는 간편한 설정과 강력한 기능을 제공하지만, 기본 설정만으로는 성능 최적화가 부족할 수 있음
특히, 대량 트래픽 처리나 복잡한 비즈니스 로직을 포함하는 경우 성능 튜닝이 필수적

📌 Spring Boot에서 성능 튜닝이 필요한 주요 원인

원인설명
메모리 부족 불필요한 객체 생성, GC 최적화 부족
DB 부하 N+1 문제, 인덱스 미적용, Connection Pool 부족
I/O 블로킹 동기적 API 호출, 파일 처리 및 네트워크 지연
GC 튜닝 부족 적절한 GC 정책 미적용으로 인한 성능 저하
불필요한 Spring Bean 과도한 Bean 등록으로 인한 애플리케이션 부하

📌 성능 튜닝을 하면 "트래픽 증가에도 안정적으로 서비스를 운영할 수 있음"


2. Spring Boot 애플리케이션 성능 측정 방법

Spring Boot 애플리케이션의 성능을 최적화하려면 먼저 성능을 측정해야 함

📌 Spring Boot 성능 측정 도구 및 기법

도구/기법설명
Spring Actuator /actuator/metrics API를 통해 애플리케이션 성능 모니터링
JProfiler, YourKit 실시간 CPU, 메모리 사용량 분석
Prometheus + Grafana 애플리케이션 및 서버 성능 모니터링
JMeter, Gatling 부하 테스트 및 성능 측정
OpenTelemetry 분산 트레이싱 및 성능 분석

📌 Spring Boot Actuator를 활용하면 "애플리케이션의 성능을 실시간으로 모니터링 가능"


✅ 여기까지 Spring Boot 성능 튜닝이 필요한 이유와 기본 개념을 배웠습니다!
👉 "그렇다면, Spring Boot에서 성능을 최적화하는 실전 방법은?"
✅ 2부에서 Spring Boot의 주요 성능 튜닝 기법과 실전 최적화 방법을 배워봅시다!

 

반응형

 


 

2. 상세 주제 정리

 

1. JVM & GC 튜닝 (메모리 최적화)

JVM 옵션 및 GC 설정을 최적화하여 메모리 사용량을 줄이고, 애플리케이션 성능을 개선 가능

📌 1️⃣ JVM 옵션 튜닝 (메모리 설정 최적화)

-Xms512m -Xmx1024m -XX:NewRatio=2 -XX:SurvivorRatio=8
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError

Heap 크기 조정 (-Xms, -Xmx): 적절한 메모리 크기를 설정하여 OutOfMemory 오류 방지
G1GC 사용 (-XX:+UseG1GC): 최신 Garbage Collector(GC)로 멀티스레드 환경 최적화

📌 2️⃣ GC 로그 모니터링 설정 (문제 발생 시 분석 용이)

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/gc.log

GC 로그를 활성화하여 "메모리 누수 및 성능 문제를 추적 가능"


2. 데이터베이스 성능 최적화

Spring Boot 애플리케이션에서 가장 중요한 성능 최적화 요소 중 하나는 데이터베이스 최적화

📌 1️⃣ 데이터베이스 Connection Pool 튜닝

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 30000
      max-lifetime: 1800000

HikariCP를 사용하여 Connection Pool을 적절히 설정하여 DB 연결 최적화

📌 2️⃣ JPA N+1 문제 해결 (Fetch Join 활용)

@Query("SELECT o FROM Order o JOIN FETCH o.customer WHERE o.id = :id")
Order findOrderWithCustomer(@Param("id") Long id);

JPA JOIN FETCH를 활용하여 N+1 문제 해결

📌 3️⃣ 인덱스 튜닝 (조회 성능 개선)

CREATE INDEX idx_user_email ON users(email);

자주 조회하는 컬럼에 인덱스를 설정하여 DB 조회 속도 개선

📌 데이터베이스 튜닝을 하면 "DB 부하를 최소화하고, 성능을 크게 향상 가능"


3. 캐싱 전략 적용 (Redis 활용)

자주 조회되는 데이터를 캐싱하여 DB 부하를 줄이고, API 응답 속도를 개선

📌 1️⃣ Redis를 활용한 캐싱 적용

spring:
  cache:
    type: redis
  redis:
    host: localhost
    port: 6379

Redis 캐싱을 활용하여 "자주 사용하는 데이터를 빠르게 조회 가능"

📌 2️⃣ Spring Cache 활용 (@Cacheable 적용)

@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {
    return userRepository.findById(id).orElseThrow();
}

캐시 적용 시 DB 조회 없이 빠르게 데이터 반환 가능

📌 캐싱을 활용하면 "API 응답 속도를 획기적으로 개선 가능"


4. 비동기 처리 및 WebFlux 활용 (I/O 성능 최적화)

CPU 연산이 아닌 외부 API 호출, DB 조회 등의 I/O 작업은 비동기로 처리하여 성능을 높일 수 있음

📌 1️⃣ @Async를 활용한 비동기 처리

@Async
public CompletableFuture<String> asyncMethod() {
    return CompletableFuture.completedFuture("Hello Async!");
}

비동기 작업을 수행하여 메인 스레드의 부담을 줄일 수 있음

📌 2️⃣ WebClient를 활용한 비동기 API 호출 (논블로킹 방식)

public Mono<String> fetchData() {
    return webClient.get().uri("/data")
           .retrieve()
           .bodyToMono(String.class);
}

WebClient를 활용하면 "블로킹 없는 API 호출이 가능하여 성능 최적화 가능"


✅ 여기까지 Spring Boot 애플리케이션의 주요 성능 튜닝 기법을 배웠습니다!
👉 "그렇다면, 실전 프로젝트에서 성능 최적화 사례는?"
✅ 다음 회차에서 실전 프로젝트에서 Spring Boot 성능 최적화 사례 분석을 배워봅시다!

 



 

반응형