SpringBoot 2 + Java 9 에서 SpringBoot 3 + Java 17 로 버전 업그레이드

joona95·2024년 8월 22일

문제 상황

최근에는 SpringBoot 3 을 사용하는 것을 권장하고 있고, SpringBoot 3 은 Java 17 이상을 사용할 것을 권고하고 있다.

특정 라이브러리를 적용하려고 했을 때 원인이 SpringBoot 2 라서 버전이 안 맞아서 그런가 싶어서 버전 업그레이드를 결심하게 됐다.

그러나 알고 보니 다른 이유 때문에 라이브러리 작동이 되지 않았던 것이었다 😅

그래도 언젠가 버전 업그레이드를 해야했을텐데 이번 기회에 업그레이드를 하게 됐다.

해결 방안

1. SpringBoot, Java 버전 업그레이드

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'groovy'
    id 'war'
}

group = 'com.recipe'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = "17"

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}
  • SpringBoot 3 + Java 17 로 버전 업그레이드

2. 라이브러리 버전 업그레이드

	//Before
    compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'
    compile group: 'com.google.api-client', name: 'google-api-client', version: '1.25.0'
    compile group: 'com.google.apis', name: 'google-api-services-youtube', version: 'v3-rev212-1.25.0'
    compile("com.google.oauth-client:google-oauth-client-jetty:1.25.0") {
        exclude group: 'org.mortbay.jetty', module: 'servlet-api'
    }
    compile group: 'com.google.http-client', name: 'google-http-client-jackson2', version: '1.25.0'
    compile group: 'com.google.collections', name: 'google-collections', version: '1.0'
    
	//After
    implementation 'com.googlecode.json-simple:json-simple:1.1'
    implementation group: 'com.google.api-client', name: 'google-api-client', version: '1.25.0'
    implementation group: 'com.google.apis', name: 'google-api-services-youtube', version: 'v3-rev212-1.25.0'
    implementation("com.google.oauth-client:google-oauth-client-jetty:1.25.0") {
        exclude group: 'org.mortbay.jetty', module: 'servlet-api'
    }
    implementation group: 'com.google.http-client', name: 'google-http-client-jackson2', version: '1.25.0'
    implementation group: 'com.google.collections', name: 'google-collections', version: '1.0'
  • compile 대신 implementation 사용하도록 수정
  • SpringBoot 3 에서는 compile deprecated 됨
	//Before
	implementation 'javax.servlet:jstl'

	//After
    implementation 'jakarta.servlet:jakarta.servlet-api'
    implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
    implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
  • jstl 라이브러리 버전 업그레이드
	//Before
    implementation "com.querydsl:querydsl-jpa"
    implementation "com.querydsl:querydsl-core"
    implementation "com.querydsl:querydsl-collections"
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
    annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
    annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
    
    //After
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
  • querydsl 라이브러리 버전 업그레이드
	//Before
    implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.1'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    
    //After
    implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
  • circuit breaker 라이브러리 버전 업그레이드
	//Before
    testImplementation 'org.spockframework.spock:spock-core:spock-2.3'
    testImplementation 'org.spockframework.spock:spock-spring:spock-2.3'
    
    //After
    testImplementation 'org.spockframework:spock-core:2.4-M1-groovy-4.0'
    testImplementation 'org.spockframework:spock-spring:2.4-M1-groovy-4.0'
  • spock 라이브러리 버전 업그레이드
	//Before
    implementation 'io.springfox:springfox-boot-starter:3.0.0'
    
    //After
	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
  • swagger 라이브러리 버전 업그레이드

3. WebSecurity 설정 변경

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    private final JwtUtil jwtUtil;
    private final UserDetailsService userDetailsService;
    
    public WebSecurityConfig(JwtUtil jwtUtil, UserDetailsService userDetailsService) {
        this.jwtUtil = jwtUtil;
        this.userDetailsService = userDetailsService;
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    
            return http
                .csrf(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/swagger-ui/**").permitAll()
                        .requestMatchers("/swagger-ui.html").permitAll()
                        .requestMatchers("/swagger-resources/**").permitAll()
                        .requestMatchers("/v2/api-docs/**").permitAll()
                        .requestMatchers("/static/**").permitAll()
                        .requestMatchers("/users/**").permitAll()
                        .requestMatchers("/app/version/**").permitAll()
                        .requestMatchers("/notice/**").permitAll()
                        .requestMatchers("/dialog/**").permitAll()
                        .anyRequest().authenticated())
                .addFilterBefore(new JwtFilter(jwtUtil, userDetailsService), UsernamePasswordAuthenticationFilter.class)
                .build();
    }
}
  • extends WebSecurityConfigurerAdapter 제거 후 Override 하던 authenticationManagerBean 을 빈으로 등록하도록 수정
  • configure 메서드를 Override 해서 설정하던 filterChain 을 SecurityFilterChain 빈으로 등록하도록 수정

4. Swagger 3 에 맞춰 코드 수정

4-1. Swagger 설정 코드 수정

@OpenAPIDefinition(
        info = @Info(title = "레시피 저장소 API 명세서",
                description = "레시피 저장소 API 목록",
                version = "1.0")
)
@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI openAPI() {
    
    SecurityScheme securityScheme = new SecurityScheme()
                .type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
                .in(SecurityScheme.In.HEADER).name("Authorization");

        SecurityRequirement securityRequirement = new SecurityRequirement().addList("bearerAuth");
        
        return new OpenAPI()
                .components(new Components().addSecuritySchemes("bearerAuth", securityScheme))
                .security(Arrays.asList(securityRequirement));

    }
}

4-2. Swagger 어노테이션 수정

  • @Tag(name="") 어노테이션으로 컨트롤러 이름 설정
  • @Operation(summary="") 어노테이션으로 컨트롤러 내 API 이름 설정
  • @Parameter(name="") 어노테이션으로 요청 DTO 이름 설정
    • hidden 옵션으로 swagger 문서 내 표시 여부 결정 가능
    • required 옵션으로 필수여부 표시 설정 가능
    • example 옵션으로 예시 데이터 설정 가능
  • @Schema(description="") 어노테이션으로 DTO 이름 및 DTO 파라미너 이름 설정

5. GitHub Actions Java 버전 업그레이드

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    - uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'adopt'
  • Java 17에 맞춰 JDK 버전 업그레이드

6. 배포 서버 내 Java 버전 업그레이드 필요

sudo apt update

sudo apt install openjdk-17-jdk

java -version

0개의 댓글