Project/TroubleShooting

Swagger 기능 추가

w.llama 2024. 10. 9. 12:29

인턴 과제로 Spring 프로젝트를 진행중에있는데 이 프로젝트에 swagger 를 적용하는 과제가 있다 이를 적용하기위해  

 

Swagger 의존성 추가

 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

 

SwaggerConfig 추가

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        SecurityScheme securityScheme = new SecurityScheme()
                .type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")
                .in(SecurityScheme.In.HEADER).name("Authorization");
        SecurityRequirement securityRequirement = new SecurityRequirement().addList("bearerAuth");

        return new OpenAPI()
                .components(new Components().addSecuritySchemes("bearerAuth", securityScheme))
                .security(Arrays.asList(securityRequirement))
                .info(getInfo());
    }

    private Info getInfo(){
        return new Info()
                .title("Ottoon API")
                .version("1.0")
                .description("Ottoon API");
    }
}

 

SecurityConfig에 swagger 요청 허용 추가

httpSecurity.authorizeHttpRequests(authorizeRequest ->
                authorizeRequest
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                        .requestMatchers("/api/signup").permitAll()
                        .requestMatchers("/api/login").permitAll()
                        .requestMatchers(HttpMethod.GET).permitAll()
                        .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/api-docs/**", "/swagger-resources/**", "/webjars/**", "/swagger-ui.html").permitAll() // Swagger 관련 모든 경로 허용
                        .anyRequest().authenticated() // 나머지 요청은 인증 필요
        );

Swagger에서 확인할 api에 swagger에서 명시될 이름 및 설명을 적어준다(@tag어노테이션, @Operation 어노테이션)

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
@Tag(name ="User", description = "UserController APIs") //swagger tag
public class UserController {

    private final UserService userService;

    @PostMapping("/signup")
    @Operation(summary = "User SignUp", description = "회원가입 기능입니다.") //swagger tag
    public ResponseEntity<SignUpResponseDto> signup(@Valid @RequestBody SignUpRequestDto requestDto) {
        SignUpResponseDto responseDto = userService.signUp(requestDto);
        return ResponseEntity.ok().body(responseDto);
    }

    // 로그인
    @PostMapping("/login")
    @Operation(summary = "User Login", description = "로그인 기능입니다.")
    public ResponseEntity<LoginResponseDto> login(@Valid @RequestBody LoginRequestDto requestDto) {
        LoginResponseDto responseDto = userService.login(requestDto);
        return ResponseEntity.ok().body(responseDto);
    }
}

이렇게 적용을 전부 하게되면
http://localhost:8080/swagger-ui/index.html 에서 

이와 같이 확인을 할수있다.