최근에는 SpringBoot 3 을 사용하는 것을 권장하고 있고, SpringBoot 3 은 Java 17 이상을 사용할 것을 권고하고 있다.
특정 라이브러리를 적용하려고 했을 때 원인이 SpringBoot 2 라서 버전이 안 맞아서 그런가 싶어서 버전 업그레이드를 결심하게 됐다.
그러나 알고 보니 다른 이유 때문에 라이브러리 작동이 되지 않았던 것이었다 😅
그래도 언젠가 버전 업그레이드를 해야했을텐데 이번 기회에 업그레이드를 하게 됐다.
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()
}
//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 사용하도록 수정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'
//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"
//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'
//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'
//Before
implementation 'io.springfox:springfox-boot-starter:3.0.0'
//After
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
@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-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 파라미너 이름 설정 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'
sudo apt update
sudo apt install openjdk-17-jdk
java -version