Java/Spring

[SpringBoot] Swagger ์‚ฌ์šฉ ์‹œ ์˜ค๋ฅ˜

๋ฒผ๋ฆฌ01 2024. 3. 13. 22:35

๐Ÿ“Œํ™˜๊ฒฝ

IntelliJ Ultimate

Java 17

 

Spring boot 3.2.3

Gradle - Groovy

Dependencies: 

Spring Web

Thymeleaf

Spring Data JPA

lombok

MariaDB 10.11

Spring Dev tool

 

๐Ÿ“Œ๋ฌธ์ œ

Swagger Configuration ์ž‘์„ฑ ์‹œ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ์ •์  ๋ฆฌ์†Œ์Šค ๋‚ด ๋ชจ๋“  ํŒŒ์ผ์ด ์ธ์‹๋˜์ง€ ๋ชปํ•จ(No mapping GET...), swagger-ui/index.html๊ฐ€ 404๋กœ ๋œจ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค.

 

 


dependencies {
...
//    swagger
    implementation 'io.springfox:springfox-boot-starter:3.0.0'
    implementation 'io.springfox:springfox-swagger-ui:3.0.0'
}

 

 

์˜์กด์„ฑ ์ถ”๊ฐ€ ์‹œ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋งŒ localhost:8080/swagger-ui/index.html๋กœ ์ ‘์†ํ•˜๋ฉด 404๊ฐ€ ๋–ด๋‹ค.

 

 

http://localhost:8080/swagger-ui/index.html

 

 

์—ฌ๊ธฐ์„œ `SwaggerConfig`์™€ `CustomServletConfig`๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ ‘์† ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋œ๋‹ค.

 

 

import springfox.documentation.api.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfig {

	@Bean
    public Docket api(){
    
    	return new Docket(DocumentationType.OAS_30)
            .useDefaultResponseMessages(false)
            .select()
            .apis(RequestHandlerSelectors.basePackage("org.zerock.b01.controller"))
            .paths(PathSelectors.any())
            .build()
            .apiInfo(apiInfo());
    }
    
    private ApiInfo apiInfo() {
    	return new ApiInfoBuilder()
            .title("Boot 01 Project Swagger")
            .build();
    }

 

 

package org.zerock.b02.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
@EnableWebMvc
public class CustomServletConfig extends WebMvcConfigurationSupport {

}

 

 

 

 

 

 

๋๋‹น! ํ•˜๊ณ  ์‹ ๋‚˜๊ฒŒ ๋Œ์•„์„œ๋Š” ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๊ธฐ์กด์— ์ ์šฉํ–ˆ๋˜ CSS๊ฐ€ ๋ชจ๋‘ ๋ฐ•์‚ด๋‚˜๋Š” ๊ฒƒ์„ ๋ชฉ๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ง‘์— ์žˆ๋Š”๋ฐ ์ง‘์— ๊ฐ€๊ณ  ์‹ถ์Œ

 

 

 

Swagger UI๊ฐ€ ์ ์šฉ๋˜๋ฉด์„œ ์ •์  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์„œ์น˜ํ•œ ๋Œ€๋กœ `@EnableWebMVC`๋ฅผ ์ง€์šฐ๋ฉด swagger-ui/index.html์ด ์ ‘์†๋˜์ง€ ์•Š๊ณ , ๋„ฃ์œผ๋ฉด CSS๊ฐ€ ๋ฐ•์‚ด๋‚ฌ๋‹ค. ๋‘˜์ด ์‚ฌ์ด์ข‹๊ฒŒ ์ง€๋ƒˆ์œผ๋ฉด ์ข‹๊ฒŸ๋Š”๋””

 

์ฐพ์•„๋ณด๋‹ˆ `build.gradle`์— ์˜์กด์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•œ springfox๊ฐ€ ์Šคํ”„๋ง ๋ถ€ํŠธ 3.0 ์ด์ƒ์— ์‚ฌ์šฉํ•  ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. 

 

 

๐Ÿ“Œํ•ด๊ฒฐ

๋‚ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ”„๋ง ๋ถ€ํŠธ + springfox์˜ ์ถฉ๋Œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ springfox์—์„œ springdoc์œผ๋กœ ์ข…์†์„ฑ์„ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

springfox์™€ springdoc์€ ๋‘˜ ๋‹ค Swagger๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. springfox๋Š” 2020๋…„ ์ดํ›„๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ค‘๋‹จํ–ˆ๊ณ , springdoc์€ 2019๋…„์— ์ฒ˜์Œ ๋‚˜์™”๋‹ค. ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํ˜„์žฌ 2024๋…„ 3์›” ์‹œ์  3๊ฐœ์›” ์ „์ธ 2023๋…„ 12์›”์—๋„ ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค.

 

 

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

 

 

 

springdoc์— ๋งž์ถ”์–ด `SwaggerConfig`๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ,`CustomServletConfig`๋Š” ์‚ญ์ œํ•ด์ค€๋‹ค.

 

 

package org.zerock.b02.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

        @Bean
        public OpenAPI openAPI() {
            return new OpenAPI()
                    .components(new Components())
                    .info(apiInfo());
        }

        private Info apiInfo() {
            return new Info()
                    .title("Springdoc ํ…Œ์ŠคํŠธ")
                    .description("Springdoc์„ ์‚ฌ์šฉํ•œ Swagger UI ํ…Œ์ŠคํŠธ")
                    .version("2.2.0");
        }
    }

 

 

 

 

http://localhost:8080/swagger-ui/index.html

 

 

 

 

 

swagger-ui/index.html๋„ ์ž˜ ๋‚˜์˜ค๊ณ , ์ •์  ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋„ ๋ชจ๋‘ ์ž˜ ๋งคํ•‘๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

 

 

๐Ÿ“Œ springdoc์€ ์–ด๋–ป๊ฒŒ ์จ์š”

[Spring] ์Šคํ”„๋ง ๋ถ€ํŠธ 3.2.3์—์„œ Swagger(springdoc) ์‚ฌ์šฉํ•˜๊ธฐ!

 

 

๐Ÿ“Œ์ฐธ๊ณ 

 

[Springdoc] No mapping for GET /swagger-ui/index.html ์˜ค๋ฅ˜ ์กฐ์น˜

์ง€๋‚œ๋ฒˆ์— Springdoc ์‚ฌ์šฉ๋ฒ• ์ด๋ž˜๊ฐ€์ง€๊ณ  ๊ธ€๋„ ์“ฐ๊ณ  ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์ž˜ ๋œ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค. ์ง€๊ธˆ๋„ ํ”„๋กœ์ ํŠธ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์ „์— ์ผ๋˜ ๊ธ€๋Œ€๋กœ ์ง„ํ–‰์„ ํ•˜๋ฉด ์ž˜ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋œ ์–ด๋–ค ํ”„๋กœ์ 

oingdaddy.tistory.com