ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • junit5
  • tree
  • scope value
  • 구조화된 동시성
  • querydsl
  • FilterSecurityInterceptor
  • UserDetailsService
  • restdocs enum
  • nginx basic auth
  • StructuredConcorrency
  • nGrinder
  • 동등성
  • node exporter basic auth
  • restdocs custom
  • mysql
  • 트랜잭션
  • VirtualThread Springboot
  • java
  • 가상 스레드
  • jpa
  • 가상 스레드 예외 핸들링
  • AccessDecisionManager
  • DataJpaTest
  • AccessDecisionVoter 커스텀
  • 정규표현식
  • 동일성
  • LocalDateTime
  • AuthenticationException
  • 동시성 제어
  • 인가(Authorization) 처리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

[Springdocs ]Swagger Error - Failed to fetch.
기타

[Springdocs ]Swagger Error - Failed to fetch.

2022. 9. 7. 10:09

[Springdocs ]Swagger Error - Failed to fetch.

  • 환경
  • 개요 및 원인
  • 해결 방법
  • 여러 Server를 추가하여 요청 처리

환경

  • springboot 2.6.7
  • swagger - springdoc - openapi-ui 1.6.6
dependencies {
  implementation 'org.springdoc:springdoc-openapi-ui:1.6.6'
}

개요 및 원인

Spring Boot 애플리케이션의 docs로 Swagger를 사용하던 중 다음과 같은 에러가 발생했습니다.

Failed to fetch. Possible Reasons:

  • CORS
  • Network Failure
  • URL scheme must be "http" or "https" for CORS request.

원인은, Server의 Host가 https로 설정되었는데

스웨거의 requestUrl http로 발생하여서 생긴 문제였습니다.

즉 https로 요청을 받아야 하는데, http로 요청이 날라와 문제가 생긴것.

curl -X 'GET' \
  'http://서버URL' \
  ...

스웨거 페이지의 상단의 Servers (요청을 보내는 곳) 설정도 http로 되어있었으니 수정해야합니다.

문제를 해결할라면 Swagger의 요청을 https로 바꿔줘야 했습니다.

해결 방법

스프링 부트 프로젝트 내에 스웨거의 설정을 추가해서 문제를 해결할 수 있습니다.

다음 이슈를 참고하여도 해결 할 수 있습니다.

  • https://github.com/springfox/springfox/issues/3483
  • https://github.com/springdoc/springdoc-openapi/issues/118

https://idratherbewriting.com/learnapidoc/pubapis_openapi_step3_servers_object.html

  • 페이지에 나와있는 servers 설정입니다.
servers:
- url: https://api.openweathermap.org/data/2.5/
  description: Production server
- url: http://beta.api.openweathermap.org/data/2.5/
  description: Beta server
- url: http://some-other.api.openweathermap.org/data/2.5/
  description: Some other server
  • 이 페이지를 보면 Servers에 url을 추가하는 것을 볼 수 있습니다.

프로젝트 내에 Configration Class로 스웨거 설정을 따로 관리하는데 다음과 같이 추가하였습니다.

@Configuration
public class SwaggerConfig extends WebMvcConfigurationSupport {
​
    @Bean
    public OpenAPI customOpenApi() {
​
        return new OpenAPI()
                .addServersItem(new Server().url("/").description("https 설정"))
                .info(info);
    }
  • OpenAPI()의 addServerItem 메서드를 호출하여 새 Server를 추가해줍니다.

  • "/" url 아이템이 추가된것을 볼 수 있습니다

여러 Server를 지정하여 요청 처리

  • Servers에 여러 Server를 지정하여 등록할 수 있습니다.
  • 지정하여 처리할 때 url의 규칙을 알아야 합니다.

[이미지참조](https://cotak.tistory.com/45)

  • 그림 : URL 구조
    • protocol: 통신규약, 사용자가 서버에 접속할 때 어떤 방식으로 통신할 지 정의한다.
      • HTTP(Hyper Text Transfer Protocol): 웹 브라우저와 웹 서버가 서로 데이터(하이퍼 텍스트)를 주고받기 위해 만든 통신규약
      • HTTPS(Hyper Text Transter Protocol Secure): HTTP에서 보안이 강화된 버전. 자세한 설명은 영상을 참고
    • host(domain): 인터넷에 접속되어 있는 각각의 컴퓨터를 가리키는 주소 또는 도메인
    • port: 포트번호
      • 한 개의 컴퓨터엔 여러 개의 서버가 존재할 수 있다. 즉, 포트번호를 통해 어떤 서버를 이용할 지 결정한다.
      • 웹서버는 전세계적으로 80번 포트를 이용하는 것이 표준이다.
      • 따라서 url엔 기본적으로 포트번호 80이 생략되어 있다
    • path: 컴퓨터 내부에 있는 디렉토리의 파일을 또는 자원의 경로를 의미한다.
    • query string: 데이터를 전달하는 데 사용된다.
      • 쿼리 스트링의 시작은 "?"이고, 각 key-value쌍은 "&"로 구분된다.

  • 프로토콜콰 호스트, 포트를 나누어 처리할 수 있습니다.
// application.yml
​
server:
  protocol: https
  host: 서버 host
  • 프로퍼티에 정의한 옵션을 주입받아 사용합니다.
  • 물론 프로파일에 따라 다른 값을 주입받을 수 있습니다.
@EnableWebMvc
@Configuration
public class SwaggerConfig extends WebMvcConfigurationSupport {
​
    @Value("${server.protocol}")
    private String protocol;
​
    @Value("${server.host}")
    private String host;
​
    @Bean
    public OpenAPI customOpenApi() {
​
        return new OpenAPI()
                .addServersItem(new Server().url("/"))
                .addServersItem(new Server().url(protocol + "://" + host).description("https 호스트"))
                // description은 생략 가능. 원하면 추가해도 된다.
                // 이하 생략 ...
    }
  • 다음과 같이 Servers에 추가된 것을 볼 수 있습니다.
  • 이제 원하는 Server로 요청을 보내면 됩니다.

  • 요청을 보내보면 다음과 같이 https로 잘 동작합니다.
curl -X 'GET' \
  'https://도메인' \
  ...

'기타' 카테고리의 다른 글

마크다운 이미지 나란히, 이미지 정렬 하는법  (0) 2023.04.26
커서 기반 페이지네이션(Cursor-based-pagination) vs 오프셋 기반 페이지 네이션(offset-based-pagination  (0) 2022.12.14
Asciidoctor란  (0) 2022.12.12
Asciidoc, Asciidoc 사용법  (0) 2022.12.12
VsCode(Visual Studio Code) 키 십힘, Vim모드, VsCode INSERT 해결방법  (1) 2022.10.01
    '기타' 카테고리의 다른 글
    • 커서 기반 페이지네이션(Cursor-based-pagination) vs 오프셋 기반 페이지 네이션(offset-based-pagination
    • Asciidoctor란
    • Asciidoc, Asciidoc 사용법
    • VsCode(Visual Studio Code) 키 십힘, Vim모드, VsCode INSERT 해결방법
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바