Spring 2.7에서 3.2로 넘어가기

lv2dev·2024년 1월 23일
0

이전까지 spring boot 2.7버전을 이용해 프로젝트를 진행했었기 때문에 3.x는 처음이다.
그러다보니 시작부터 오류가 날 맞이해줬다.
어떤 점들을 고쳐주어야 할까?

javax 패키지의 변경

  • Spring Boot 새 버전 부터는 jakarta를 사용해야 한다.(javax -> jakarta)

build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core-jakarta
implementation group: 'org.hibernate', name: 'hibernate-core-jakarta', version: '5.6.15.Final'

// https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api
implementation group: 'jakarta.persistence', name: 'jakarta.persistence-api', version: '3.2.0-M1'
  • jakarta.persistance : JPA 기능 사용을 위해 추가
  • hibernate-core-jakarta : JPA 기능 사용을 위해 추가. jakarta.persistance-api와 함께 사용

Spring Security의 변경

  • 기존에 사용하던 세팅을 아래와 같이 수정했다.
@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // http 시큐리티 빌더
        http
                .csrf((csrf) -> csrf
                        .ignoringRequestMatchers("/api/**", "/api/token/**")
                ) // csrf를 비활성화할 경로 설정
                .httpBasic(withDefaults()) // 기본 http 인증 사용하지 않음
                // 세션을 사용하지 않는 상태로 설정
                .sessionManagement((session) -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )
                // 특정 경로에 대한 접근 허용 (인증되지 않은 사용자도 접근 가능)
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers(SWAGGER_URI).permitAll()
                        .requestMatchers(
                                "/",
                                "/api/unauth/**",
                                "/api/token/**",
                                "/error",
                                "/swagger-ui/**",
                                "/v3/api-docs/**"
                        ).permitAll()
                        // 그 외 모든 요청은 인증 필요
                        .anyRequest().authenticated()
                );
        http
                // 인증되지 않은 요청에 대한 처리 (401 Unauthorized 응답)
                .exceptionHandling(exceptionHandling ->
                        exceptionHandling.authenticationEntryPoint(
                                new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)
                        )
                );
        // JWT 인증 필터를 CorsFilter 뒤에 추가
        http.addFilterAfter(jwtAuthenticationFilter, CorsFilter.class);

        return http.build();
    }

Swagger에서 springdoc으로

  • Swagger가 Spring Boot 3.x를 지원하지 않아서 문제가 생긴다.
  • io.swagger.v3.oas.models.info.Info 클래스를 사용해 OpenAPI 문서의 정보를 설정한다.

build.gradle

// https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui
implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.3.0'

// https://mvnrepository.com/artifact/io.swagger.core.v3/swagger-core-jakarta
implementation group: 'io.swagger.core.v3', name: 'swagger-core-jakarta', version: '2.2.19'

SwaggerConfiguration

@Configuration
public class SwaggerConfiguration {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .addSecurityItem(new SecurityRequirement().addList("JWT"))
                .components(
                        new Components()
                                .addSecuritySchemes("JWT",
                                        new SecurityScheme()
                                                .type(SecurityScheme.Type.HTTP)
                                                .scheme("bearer")
                                                .bearerFormat("JWT")
                                )
                )
                .info(new Info()
                        .title("EchoNet Auth API")
                        .description("에코넷 서비스의 인증 마이크로 서비스입니다.")
                        .version("1.0.0"));
    }

}

결과

참고

profile
언제나 레벨업을 하고 싶은 영원한 lv1

0개의 댓글