Everyday Dev System

Type javax.servlet.http.HttpServletRequest not present 본문

내배캠 주요 학습/TIL : Today I Learned

Type javax.servlet.http.HttpServletRequest not present

chaeyoung- 2023. 8. 17. 17:55

 

Swagger를 활용하기 위해 springfox 라이브러리를 활용하기 위해 시도해보았습니다.

    // swagger
    implementation 'io.springfox:springfox-boot-starter:3.0.0'

 

 

문제점:

Type javax.servlet.http.HttpServletRequest not present

이는 스프링 부트3을 지원하지 않는 라이브러리인 springfox swagger를 시도하다 마주한 문제입니다.

 

 

스프링 부트3.1.2 버전인 해당 프로젝트에서 springfox swagger를 사용하기 위해 시도해보았으나,

위와 같은 에러를 마주했습니다.

 

 

이는 springfox swagger가 javax 패키지를 jakarta로 변경하지 않아 생기는 문제입니다.

Spring Boot 3.0은 JavaEE 가 아닌 Java17 및 JakartaEE용으로 빌드되었고,

Spring Boot 3는 아직 개발 중이며 아직 최종 릴리스를 보지 못했습니다.

 

 

자세히 찾아보니 SpringFox는 2020년 10월을 마지막으로 버전 업데이트가 이루어지지 않고 있습니다. 

https://github.com/springfox/springfox/commits/master

 

 

즉, 현재 JakartaEE를 지원하는 SpringFox 릴리스가 없으므로 Spring Boot 3에서 사용할 수 없습니다.

따라서 이 문제가 해결될 때까지 SpringFox와 Spring Boot 3의 조합은 작동하지 않습니다.

스프링 부트의 버전을 낮추거나, 타 라이브러리를 통해 Swagger를 활용하는 방법을 찾아봤습니다.

 

 

 

 

시도 :

@EnableSwagger2 대신 @EnableSwagger2WebMvc 를 활용해보았으나, 

해당 방법으로도 Spring boot 3.x 버전과는 호환이 되지 않았습니다.

 

springdoc라는 라이브러리가 있다고 하여 해당 라이브러리를 활용하는 방법을 시도해보았습니다.

 

 

 

 

해결방법 :

2020년 10월을 마지막으로 릴리즈가 되지 않는 springfox가 있고,

 

2023년 8월 18일 기준으로 전날까지 릴리즈가 되어 꾸준히 업데이트 중인 springdoc-openapi가 있습니다.

계속 업데이트 중이므로 진행하는 프로젝트의 버전이 올라갈 수록 springdoc-openapi를 더욱 적극 활용해야 합니다.

https://github.com/springdoc/springdoc-openapi

 

 

https://springdoc.org/

상단의 공식 문서를 참조하면,

 

 

v 1.7.0 은 Spring Boot 1.x 와 Spring 2.x 와 호환이 되고,

v 2.2.0 은 Spring Boot 3.x 버전과 호환 된다고 합니다.

 

 

Swagger OpenAPI3.0에 대해서 간단하게 정리하면,
 
springdoc 라이브러리가 'OpenAPI3.0' 스펙에 맞는 JSON을 만들어주면,
Swagger UI가 화면을 만들어서 JSON들을 띄워주는 역할을 합니다.
 
springdoc-openapi-ui를 살펴보면 swagger-ui를 포함하고 있는 것을 확인할 수 있습니다.
swagger-ui : 핵심 로직 구현
springdoc-openapi : swagger-ui를 추상화해서 더 잘 활용할 수 있게 해주는 라이브러리

 

 

 

 

1. build.gradle 의존성 추가

    // swagger
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

 

2. application.properties 에 추가

# swagger-ui custom path
springdoc.swagger-ui.path=/swagger-ui.html

 

 

위 2가지를 적용하고 build를 한 후 서버를 실행하면, 아래와 같이 확인할 수가 있습니다.

url은 http://localhost:[본인서버포트넘버]/swagger-ui/index.html 입니다.

 

 

 

만약 403 에러가 뜰 경우에는,

filterChain 내에서 requestMatchers에 해당 url을 permitAll() 하면 에러가 해결 됩니다.

  • /swagger-ui/**
  • /v3/api-docs/**
 http.authorizeHttpRequests((authorizeHttpRequests) ->
                authorizeHttpRequests
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
                        .requestMatchers("/").permitAll() // 메인 페이지 요청 허가
                        .requestMatchers("/swagger-ui/**").permitAll() 
                        .requestMatchers("/v3/api-docs/**").permitAll()
                        .anyRequest().authenticated() // 그 외 모든 요청 인증처리
        );

 

 

세부적인 설정을 위해 해당되는 url의 메서드만 나오도록 설정이 가능합니다.

또한, 주의할 점으로는, @RestController 클래스 내에 명시된 메서드만 Swagger에 표시됩니다.

package com.sangbu3jo.elephant;

import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@OpenAPIDefinition(
    info = @Info(title = "Elephant Site",
        description = "Elephant Site API 명세",
        version = "v1"))
@RequiredArgsConstructor
@Configuration
public class SwaggerConfig {

  @Bean
  public GroupedOpenApi chatOpenApi() {
    String[] paths = {"/api/**"};
    // url 이 api 로 시작되는 RestController 클래스 내에 메서드만 활용

    return GroupedOpenApi.builder()
        .group("Elephant API v1")
        .pathsToMatch(paths)
        .build();
  }
}

 

 

 

구글링을 하는 것도 좋지만, 오히려 시간 효율적인 부분에서는 공식문서 혹은 stackoverflow를 적극 활용하는 습관을 가져야겠습니다. 

또한, 무지성으로 의존성을 추가하여 해보기 보다는 본인의 프로젝트 버전과 호환이 되는지 확인하는 습관을 들여야겠다는 것을 깨달았습니다.

 

 

 


참조:

https://stackoverflow.com/questions/71549614/springfox-type-javax-servlet-http-httpservletrequest-not-present

 

Springfox Type javax.servlet.http.HttpServletRequest not present

I'm trying to use SpringFox. Spring Boot version: 'org.springframework.boot:3.0.0-SNAPSHOT' build.gradle dependencies { ... implementation 'io.springfox:springfox-petstore:2.10.5' implementation &

stackoverflow.com

https://resilient-923.tistory.com/414

 

[Spring / TIL] SpringBoot 버전 3.X.X에 Swagger적용하기

프로젝트 진행 중 클라이언트와의 협업에 필요한 API명세를 위해 Swagger를 도입하게 되었습니다. 이 글은 SpringBoot 버전 3.0.0 이상을 사용하는 프로젝트에서 Swagger를 도입할 때 사용해야 하는 Swagger

resilient-923.tistory.com