Swagger API를 통해 API 명세서를 편리하게 관리 할 수 있음
아래 예시는 Swagger doc을 이용해서 Swagger API 관리를 해보았다
Swagger를 적용하면 아래 그림과 같이 API 명세서를 만들 수 있고, JSON 데이터로 묶어서 api 정보를 관리 할 수 있다.
적용방법
1. gradle에 의존성 주입
dependencies {
implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'
}
2. application.yml 에 추가
springdoc:
swagger-ui:
path: /swagger-ui.html
groups-order: DESC
operationsSorter: method
disable-swagger-default-url: true
display-request-duration: true
api-docs:
path: /api-docs
show-actuator: true
default-consumes-media-type: application/json
default-produces-media-type: application/json
paths-to-match:
- /**
3. SwaggerConfig 파일 생성하여 API 명세서 선언, path 설정
package com.turkey.walkingwith7puppy.config;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import lombok.RequiredArgsConstructor;
@OpenAPIDefinition( // Swagger 문서에 대한 메타데이터 정의
info = @Info(title = "WWP API 명세서",
description = "반려견 메이트 찾기 서비스 API 명세서",
version = "v1"))
@RequiredArgsConstructor
@Configuration
public class SwaggerConfig {
@Bean
public GroupedOpenApi wwpOpenApi() {
String[] paths = { "/**" };
return GroupedOpenApi.builder()
.group("WWP 서비스 API")
.pathsToMatch(paths)
.build();
}
}
4. 적용하려는 controller 클래스의 메소드에 @Operation , @ApiResponse 추가
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@Operation(summary = "회원 탈퇴 요청", description = "회원 정보가 삭제됩니다.", tags = { "Member Controller" })
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK",
content = @Content(schema = @Schema(implementation = Void.class))),
@ApiResponse(responseCode = "400", description = "BAD REQUEST"),
@ApiResponse(responseCode = "404", description = "NOT FOUND"),
@ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR")
})
@PostMapping("/user/signup")
public ResponseEntity<Void> signup(
@Parameter(description = "회원가입", required = true, example = "1")
@RequestBody @Valid final MemberSignupRequest memberSignupRequest) {
memberService.signup(memberSignupRequest);
return ResponseEntity.status(HttpStatus.OK).body(null);
}
5. Spring Security를 사용한다면 filter에 path 설정해주고 permit 추가
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
public class WebSecurityConfig {
private final JwtUtil jwtUtil;
private final JwtAuthFilter jwtAuthFilter;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf().disable()
.httpBasic().disable()
.formLogin().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.cors()
.and()
.authorizeHttpRequests(auth -> auth
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.antMatchers("/user/**").permitAll()
.antMatchers(HttpMethod.GET, "/boards/**").permitAll()
//Swagger doc관련 코드
.antMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**", "/webjars/**","/api-docs/**","favicon.ico", "/swagger/**", "/swagger-resource/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
)
.anonymous().disable()
.build();
}
}
'배포' 카테고리의 다른 글
AWS EC2 (Elastic Compute Cloud) 배포하기 (0) | 2023.05.10 |
---|---|
[암호화] JasyptConfig 설정 (0) | 2023.05.09 |
[Spring Data JPA] 사용법 (0) | 2023.05.09 |
application.yml 관리 전략 (0) | 2023.05.08 |
AWS RDS (Relational Database Service) (0) | 2023.05.07 |