Spring Boot는 빠르고 간편한 웹 애플리케이션 개발을 가능하게 하지만, 고성능 API를 개발하려면 추가적인 최적화가 필요합니다.
이번 글에서는 Spring Boot에서 API 응답 속도를 높이는 5가지 방법을 구체적인 팁과 함께 소개합니다.
이 글을 통해 실무에서 성능 향상을 위한 전략을 효과적으로 적용할 수 있습니다.
1. 데이터베이스 쿼리 최적화
대부분의 API 응답 속도 저하는 데이터베이스 처리 시간에서 비롯됩니다. 이를 해결하려면 다음과 같은 전략을 활용하세요.
1) N+1 문제 해결
Hibernate 또는 JPA를 사용할 때, N+1 문제가 발생하면 여러 개의 쿼리가 반복 실행됩니다. 이를 해결하려면 페치 전략(Fetch Join)을 설정하세요.
// 잘못된 예 (N+1 문제 발생)
@Query("SELECT u FROM User u")
List<User> findAllUsers();
// 올바른 예 (Fetch Join 사용)
@Query("SELECT u FROM User u JOIN FETCH u.roles")
List<User> findAllUsersWithRoles();
2) 데이터베이스 인덱스 추가
쿼리 실행 속도를 높이려면 자주 조회되는 열에 인덱스를 추가하세요.
CREATE INDEX idx_users_email ON users(email);
2. 캐싱 적용
동일한 데이터를 반복적으로 조회하는 경우, 캐싱을 통해 데이터베이스 요청을 줄일 수 있습니다.
1) Spring Cache 활용
Spring Boot에서 캐싱을 간단히 적용할 수 있습니다.
@EnableCaching
@SpringBootApplication
public class Application {}
@Cacheable("users")
public User getUserById(Long id) {
return userRepository.findById(id).orElseThrow();
}
2) Redis 캐시 사용
Redis와 같은 인메모리 데이터베이스를 활용하면 더 빠른 응답 속도를 얻을 수 있습니다.
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
3. 비동기 처리
I/O 작업이 많은 API의 경우 비동기 처리를 통해 응답 속도를 개선할 수 있습니다.
1) @Async 사용
Spring Boot의 @Async
를 활용하여 비동기 작업을 실행하세요.
@Async
public CompletableFuture<String> performAsyncTask() {
// 비동기 작업 처리
return CompletableFuture.completedFuture("Task Completed");
}
2) WebClient로 비동기 HTTP 호출
RestTemplate
대신 WebClient
를 사용하면 비동기 HTTP 호출을 쉽게 구현할 수 있습니다.
WebClient client = WebClient.create();
client.get()
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class)
.subscribe(System.out::println);
4. HTTP 요청 최적화
HTTP 요청의 크기를 줄이고 효율적으로 처리하면 응답 속도가 개선됩니다.
1) Gzip 압축 사용
Spring Boot에서 Gzip 압축을 활성화하여 네트워크 대역폭을 줄일 수 있습니다.
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html
server.compression.min-response-size=1024
2) HTTP/2 프로토콜 활성화
HTTP/2를 사용하면 다중화(Multiplexing)와 헤더 압축을 통해 성능이 향상됩니다.
server.http2.enabled=true
5. Connection Pool 및 Thread 관리
Spring Boot에서 데이터베이스와 HTTP 요청 처리를 위한 Connection Pool과 Thread 관리를 최적화하세요.
1) HikariCP 설정
Spring Boot는 기본적으로 HikariCP를 사용하며, 적절한 설정으로 성능을 최적화할 수 있습니다.
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
2) Executor 설정
비동기 작업을 위한 Executor를 커스터마이징하여 처리 성능을 높이세요.
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
결론
Spring Boot에서 API 성능을 최적화하려면 데이터베이스 쿼리, 캐싱, 비동기 처리, HTTP 최적화, 그리고 Connection Pool 설정을 종합적으로 고려해야 합니다.
이 글에서 소개한 5가지 방법을 실무에 적용해 API 응답 속도를 개선해 보세요.
'스프링&스프링부트' 카테고리의 다른 글
[Spring] Spring Batch로 사용자 활동 로그를 집계하여 실시간 보고서 자동화하기 (0) | 2025.01.20 |
---|---|
[Spring]Spring 개발자를 위한 Annotation 원리와 커스텀 Annotation 실습 (0) | 2025.01.18 |
[spring] AOP(관점 지향 프로그래밍) 이해하기: 실용적인 예제로 배우는 AOP (1) | 2024.01.21 |
[Spring] yml 암호화를 해보자(feat. jasypt) (2) | 2024.01.03 |
[Spring] 메세지 컨버터란 (Spring message converter) (5) | 2023.11.01 |