๋ฒ ์˜ค
DCode
๋ฒ ์˜ค
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (218)
    • ๊ณต์ง€์‚ฌํ•ญ (1)
    • ์žก์„ค (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • ์ž๋ฃŒ๊ตฌ์กฐ (2)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Java) (14)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ธฐ์ดˆ) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • ์ด๋ก ์ ์ธ๊ฑฐ (14)
      • ๋ณด์•ˆ (5)
      • ์˜ค๋ฅ˜ ํ•ด๊ฒฐ (2)
      • ๋””์ž์ธ ํŒจํ„ด (5)
      • ๋„คํŠธ์›Œํฌ (1)
      • ๊ธฐํƒ€ (1)
    • ์ตœ์‹ ๊ธฐ์ˆ  (4)
      • ๋ธ”๋ก์ฒด์ธ (1)
    • [Project] (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿˆโ€โฌ› GitHub
  • ๐Ÿ“ซ ๋ฐฉ๋ช…๋ก
  • ๐Ÿ”– ํƒœ๊ทธ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๋ฒ ์˜ค

DCode

Programming/[Spring Boot]

Swagger๋ฅผ ํ™œ์šฉํ•œ REST API ๋ช…์„ธ ๋ฌธ์„œํ™”

2023. 1. 25. 17:55

๐Ÿ’ก
API๊ฐ€ ์–ด๋–ค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์–ด๋–ค ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ์ •๋ฆฌํ•ด์ค€๋‹ค.

์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

pom.xml ์— ๋‹ค์Œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-boot-starter</artifactId>
			<version>3.0.0</version>
		</dependency>

์˜์กด์„ฑ ์ถ”๊ฐ€ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


Swagger ๊ด€๋ จ ์„ค์ • ์ฝ”๋“œ ์ž‘์„ฑ

com.springboot.api.config.SwaggerConfiguration.java๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

package com.springboot.api.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfiguration {
    @Bean
    public InternalResourceViewResolver defaultViewResolver() {
        return new InternalResourceViewResolver();
    }
    
    @Bean
    public Docket api(){
        // ์Šค์บ”ํ•  ํŽ˜์ด์ง€ ๋ฒ”์œ„ ์„ค์ •(ํ•ด๋‹น ํŒจํ‚ค์ง€ ๋ฐ ํ•˜์œ„ ํŒจํ‚ค์ง€๋ฅผ ์Šค์บ”)
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.springboot.api"))
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("Spring Boot Open API Test with Swagger")
                .description("์„ค๋ช… ๋ถ€๋ถ„")
                .version("1.0.0")
                .build();
    }
}

์ ‘์†ํ•˜๊ธฐ

๋‹ค์Œ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•œ ํ™”๋ฉด์ด๋‹ค.

๐Ÿ’ก
http://localhost:8080/swagger-ui/

์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์ง์ ‘ GUIํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


API ์„ค์ •

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…, ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์—†๋Š” ์ƒํƒœ์ด๋‹ค.

    ์ด๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

์ „

@GetMapping("/request1")
public String getRequestParam1(
        @RequestParam String name,
        @RequestParam String email,
        @RequestParam String organization){
    return name+" "+email+" "+organization;
}

ํ›„

@ApiOperation(value="GET ๋ฉ”์„œ๋“œ",notes="@RequestParam์„ ํ™œ์šฉํ•œ GET Method")
@GetMapping("/request1")
public String getRequestParam1(
        @ApiParam(value="์ด๋ฆ„",required = true) @RequestParam String name,
        @ApiParam(value="์ด๋ฉ”์ผ",required = true) @RequestParam String email,
        @ApiParam(value="ํšŒ์‚ฌ",required = true) @RequestParam String organization){
    return name+" "+email+" "+organization;
}

๊ฒฐ๊ณผ


Swagger ๊ด€๋ จ ์˜ค๋ฅ˜

Swagger๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ์˜ค๋ฅ˜๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค.

์˜ค๋ฅ˜ 1 : Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.24.jar:5.3.24]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.24.jar:5.3.24]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.7.jar:2.7.7]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.7.jar:2.7.7]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.7.jar:2.7.7]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.7.jar:2.7.7]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.7.jar:2.7.7]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.7.jar:2.7.7]
	at com.springboot.api.ApiApplication.main(ApiApplication.java:11) ~[classes/:na]
Caused by: java.lang.NullPointerException: null
	at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]
	at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113) ~[springfox-core-3.0.0.jar:3.0.0]
	at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89) ~[springfox-spi-3.0.0.jar:3.0.0]
	at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) ~[na:na]
	at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:na]
	at java.base/java.util.TimSort.sort(TimSort.java:220) ~[na:na]
	at java.base/java.util.Arrays.sort(Arrays.java:1515) ~[na:na]
	at java.base/java.util.ArrayList.sort(ArrayList.java:1750) ~[na:na]
	at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:392) ~[na:na]
	at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]
	at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]
	at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]
	at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
	at springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:81) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na]
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na]
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[na:na]
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[na:na]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.withDefaults(AbstractDocumentationPluginsBootstrapper.java:107) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.buildContext(AbstractDocumentationPluginsBootstrapper.java:91) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.bootstrapDocumentationPlugins(AbstractDocumentationPluginsBootstrapper.java:82) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.24.jar:5.3.24]
	... 14 common frames omitted


Process finished with exit code 1
  • ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค๋ฉด

ApiApplication.java์— @EnableWebMvcAnnotation์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

package com.springboot.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@EnableWebMvc
@SpringBootApplication
public class ApiApplication {
	public static void main(String[] args) {
		SpringApplication.run(ApiApplication.class, args);
	}
}

์˜ค๋ฅ˜ 2: Whitelabel Error Page

  • ๋‹ค์Œ ์ฃผ์†Œ๋กœ ์ ‘๊ทผ์„ ํ•  ๋•Œ ํŽ˜์ด์ง€๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
    ๐Ÿ’ก
    http://localhost:8080/swagger-ui/
  • ๋‹ค์Œ @Bean ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
@Configuration
public class SwaggerConfiguration {
    @Bean
    public InternalResourceViewResolver defaultViewResolver() {
        return new InternalResourceViewResolver();
    }


Uploaded by N2T

'Programming > [Spring Boot]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

JpaRepository getById, findById  (0) 2023.03.12
DB ๊ด€๋ จ ์šฉ์–ด  (1) 2023.02.01
PUT/DELETE API ๋งŒ๋“ค๊ธฐ  (1) 2023.01.21
POST API ๋งŒ๋“ค๊ธฐ  (0) 2023.01.20
GET API ๋งŒ๋“ค๊ธฐ  (0) 2023.01.19
    'Programming/[Spring Boot]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • JpaRepository getById, findById
    • DB ๊ด€๋ จ ์šฉ์–ด
    • PUT/DELETE API ๋งŒ๋“ค๊ธฐ
    • POST API ๋งŒ๋“ค๊ธฐ
    ๋ฒ ์˜ค
    ๋ฒ ์˜ค

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”