Spring Boot 4 완벽 가이드: Spring Boot 3에서 마이그레이션하기
Backend

Spring Boot 4 완벽 가이드: Spring Boot 3에서 마이그레이션하기

· 9분 읽기

개요

Spring Boot 4가 2024년 11월에 정식 출시되었습니다! Spring Boot 3에서 4로의 마이그레이션은 비교적 간단하지만, 몇 가지 중요한 변경사항과 새로운 기능들이 있습니다. 이 포스트에서는 Spring Boot 4의 주요 특징과 실전 마이그레이션 가이드를 제공합니다.

Spring Boot 버전 히스토리

  • Spring Boot 2.x (2018-2023): Java 8+ 지원, Spring Framework 5
  • Spring Boot 3.x (2022-2024): Java 17+ 필수, Jakarta EE 9, Spring Framework 6
  • Spring Boot 4.x (2024-현재): Java 17+ 필수 (Java 21 권장), Jakarta EE 10, Spring Framework 6.1

Spring Boot 4의 주요 변경사항

1. Java 버전 요구사항

Spring Boot 3:

  • Java 17 이상 필수

Spring Boot 4:

  • Java 17 이상 필수 (변경 없음)
  • Java 21 권장 - Virtual Threads 등 최신 기능 활용
<!-- pom.xml -->
<properties>
    <java.version>21</java.version>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
</properties>

2. Spring Framework 6.1 기반

Spring Framework 6.1의 새로운 기능들이 Spring Boot 4에 포함되었습니다:

  • 향상된 AOT (Ahead-of-Time) 컴파일 지원
  • 개선된 네이티브 이미지 지원
  • 더 나은 메모리 관리

3. Jakarta EE 10 지원

Spring Boot 3: Jakarta EE 9 Spring Boot 4: Jakarta EE 10

주요 변경사항:

  • jakarta.servlet.* 패키지 유지 (변경 없음)
  • 새로운 Jakarta EE 10 API 활용 가능

4. Virtual Threads 기본 지원

Spring Boot 4에서는 Virtual Threads가 더욱 잘 통합되었습니다.

# application.yml
spring:
  threads:
    virtual:
      enabled: true  # Java 21에서 기본 활성화 권장

5. GraalVM 네이티브 이미지 개선

네이티브 이미지 빌드가 더욱 안정적이고 빠르게 개선되었습니다.

# 네이티브 이미지 빌드
./mvnw -Pnative native:compile

마이그레이션 가이드: Spring Boot 3 → 4

Step 1: 의존성 버전 업데이트

Maven (pom.xml)

<!-- Before: Spring Boot 3 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
    <relativePath/>
</parent>

<!-- After: Spring Boot 4 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.0.0</version>
    <relativePath/>
</parent>

Gradle (build.gradle)

// Before: Spring Boot 3
plugins {
    id 'org.springframework.boot' version '3.2.5'
    id 'io.spring.dependency-management' version '1.1.4'
}

// After: Spring Boot 4
plugins {
    id 'org.springframework.boot' version '4.0.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

Step 2: Java 버전 확인 및 업그레이드

# 현재 Java 버전 확인
java -version

# Java 21 설치 (권장)
# macOS
brew install openjdk@21

# Linux (Ubuntu/Debian)
sudo apt install openjdk-21-jdk

# Windows
# https://adoptium.net/ 에서 다운로드

Step 3: 호환성 확인

3.1 주요 변경사항 체크리스트

  • [ ] 의존성 호환성: 서드파티 라이브러리가 Spring Boot 4와 호환되는지 확인
  • [ ] 커스텀 Auto-Configuration: 변경된 API 확인
  • [ ] 테스트 코드: 테스트 프레임워크 버전 확인

3.2 주요 호환성 이슈

1. Spring Data JPA 변경사항

// Spring Boot 3
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 기존 코드 그대로 동작
}

// Spring Boot 4 - 추가 기능 활용 가능
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 새로운 쿼리 메서드 활용 가능
    List<User> findByCreatedAtAfter(LocalDateTime date);
}

2. Spring Security 설정

// Spring Boot 3 & 4 모두 동일
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")
                .permitAll()
            );
        return http.build();
    }
}

Step 4: Virtual Threads 활성화 (Java 21+)

# application.yml
spring:
  threads:
    virtual:
      enabled: true

server:
  port: 8080
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

성능 비교:

@RestController
@RequestMapping("/api")
public class ApiController {
    
    // Virtual Threads 활성화 시
    // - 동시 요청 처리 능력 향상
    // - 메모리 사용량 감소
    // - 응답 시간 개선
    
    @GetMapping("/users")
    public List<User> getUsers() {
        // I/O 작업 시 다른 요청도 처리 가능
        return userService.findAll();
    }
}

Step 5: 테스트 실행

# 전체 테스트 실행
./mvnw test

# 특정 테스트만 실행
./mvnw test -Dtest=UserServiceTest

# Gradle
./gradlew test

Step 6: 점진적 마이그레이션 (선택사항)

프로덕션 환경에서는 점진적 마이그레이션이 안전합니다:

  1. 개발 환경에서 먼저 테스트
  2. 스테이징 환경 배포 및 검증
  3. 프로덕션 배포

Spring Boot 4의 새로운 기능

1. 향상된 네이티브 이미지 지원

# 네이티브 이미지 빌드 (GraalVM 필요)
./mvnw -Pnative native:compile

# 실행
./target/application

장점:

  • 빠른 시작 시간 (밀리초 단위)
  • 낮은 메모리 사용량
  • 작은 바이너리 크기

2. 개선된 Actuator 엔드포인트

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: always
// 새로운 엔드포인트 활용
@RestController
public class HealthController {
    
    @Autowired
    private HealthEndpoint healthEndpoint;
    
    @GetMapping("/custom-health")
    public Health customHealth() {
        return healthEndpoint.health();
    }
}

3. 향상된 보안 기능

@Configuration
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            )
            .headers(headers -> headers
                .contentSecurityPolicy(csp -> csp
                    .policyDirectives("default-src 'self'")
                )
            );
        return http.build();
    }
}

4. 개선된 로깅

# application.yml
logging:
  level:
    root: INFO
    com.example: DEBUG
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

실전 예제: 마이그레이션 시나리오

시나리오 1: 기본 웹 애플리케이션

// Spring Boot 3 코드 (그대로 동작)
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAll();
    }
    
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
}

변경사항: 없음! 기존 코드 그대로 동작합니다.

시나리오 2: 비동기 처리 개선

// Spring Boot 3 - CompletableFuture 사용
@Service
public class UserService {
    
    @Async
    public CompletableFuture<List<User>> findAllAsync() {
        return CompletableFuture.completedFuture(findAll());
    }
}

// Spring Boot 4 + Java 21 - Virtual Threads 활용
@Service
public class UserService {
    
    // @Async 어노테이션 없이도 Virtual Threads로 자동 처리
    public List<User> findAll() {
        // I/O 작업 시 자동으로 다른 요청 처리
        return userRepository.findAll();
    }
}

시나리오 3: 네이티브 이미지 빌드

<!-- pom.xml -->
<build>
    <plugins>
        <plugin>
            <groupId>org.graalvm.buildtools</groupId>
            <artifactId>native-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
# 네이티브 이미지 빌드
./mvnw -Pnative native:compile

# 실행 시간 비교
# JAR: ~2초
# 네이티브 이미지: ~0.05초 (40배 빠름!)

마이그레이션 체크리스트

필수 확인 사항

  • [ ] Java 버전: Java 17 이상 (Java 21 권장)
  • [ ] 의존성 버전: Spring Boot 4.0.0으로 업데이트
  • [ ] 서드파티 라이브러리: 호환성 확인
  • [ ] 테스트 코드: 모든 테스트 통과 확인
  • [ ] 프로덕션 배포: 스테이징 환경에서 먼저 검증

선택적 개선 사항

  • [ ] Virtual Threads 활성화: Java 21 사용 시
  • [ ] 네이티브 이미지 빌드: 빠른 시작 시간 필요 시
  • [ ] 새로운 Actuator 엔드포인트 활용
  • [ ] 보안 설정 강화

주의사항 및 알려진 이슈

1. 서드파티 라이브러리 호환성

일부 오래된 라이브러리는 Spring Boot 4와 호환되지 않을 수 있습니다:

<!-- 호환성 확인 필요 -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>old-library</artifactId>
    <version>1.0.0</version>
</dependency>

해결 방법:

  • 최신 버전으로 업데이트
  • 대체 라이브러리 검토
  • 커뮤니티 확인

2. 커스텀 Auto-Configuration

// 변경된 API 확인 필요
@Configuration
@ConditionalOnClass(SomeClass.class)
public class CustomAutoConfiguration {
    // Spring Boot 4 API 변경사항 확인
}

3. 테스트 프레임워크

// JUnit 5 사용 권장
@SpringBootTest
class UserServiceTest {
    
    @Autowired
    private UserService userService;
    
    @Test
    void testFindAll() {
        List<User> users = userService.findAll();
        assertThat(users).isNotEmpty();
    }
}

성능 개선 팁

1. Virtual Threads 활용

# application.yml
spring:
  threads:
    virtual:
      enabled: true

예상 성능 향상:

  • 동시 요청 처리 능력: 10배 이상 향상
  • 메모리 사용량: 50% 감소
  • 응답 시간: 30% 개선

2. 네이티브 이미지 빌드

# 개발 환경에서는 JAR 사용
./mvnw spring-boot:run

# 프로덕션에서는 네이티브 이미지 사용
./mvnw -Pnative native:compile

예상 성능 향상:

  • 시작 시간: 40배 빠름 (2초 → 0.05초)
  • 메모리 사용량: 30% 감소
  • 바이너리 크기: 증가 (하지만 실행 시 메모리 감소)

3. 연결 풀 최적화

# application.yml
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000

마무리

Spring Boot 4는 Spring Boot 3에서 자연스럽게 진화한 버전입니다. 대부분의 코드는 변경 없이 동작하며, 새로운 기능들을 점진적으로 도입할 수 있습니다.

핵심 정리:

  • 하위 호환성: 대부분의 코드 변경 불필요
  • Java 21 권장: Virtual Threads 등 최신 기능 활용
  • 성능 개선: Virtual Threads, 네이티브 이미지로 성능 향상
  • 점진적 마이그레이션: 안전하게 단계별 업그레이드 가능

다음 단계:

  1. 개발 환경에서 Spring Boot 4로 업그레이드
  2. 모든 테스트 통과 확인
  3. Virtual Threads 활성화로 성능 테스트
  4. 스테이징 환경 배포 및 검증
  5. 프로덕션 배포

Spring Boot 4의 새로운 기능들을 활용하여 더욱 빠르고 효율적인 애플리케이션을 만들어보세요! 🚀

야근반장

야근반장

프로그래밍과 데이터 분석을 좋아하는 개발자입니다. 낮에도 밤에도 코딩하는 주경야근 라이프를 살고 있습니다.

GitHub