Swagger로 API 문서 자동화
Swagger 적용 방법
•
서론) swagger 적용은 무지무지 간단하다
•
본론) 단계별로 적겠다
◦
springdoc-openapi-ui 의존성 설치 (build.gradle)
// implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.5' -> springboot ver2 이하
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' // springboot ver3 이상
Java
복사
◦
application.yml 설정 추가
springdoc:
packages-to-scan: # 패키지명 (ex. app.company.backend)
default-consumes-media-type: application/json;charset=UTF-8
default-produces-media-type: application/json;charset=UTF-8
swagger-ui:
path: swagger-ui.html
api-docs:
path: /api-docs/json
Java
복사
◦
SwaggerConfig 파일 생성
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.components(new Components())
.info(apiInfo());
}
private Info apiInfo() {
return new Info()
.title("POLICE API 명세서")
.description("경찰청 서비스 백엔드 API 명세서")
.version("1.0.0");
}
}
Java
복사
◦
controller 별로 @tag, @operation 적용
@Tag(name = "AgentController(현장요원 API)")
@RestController
@RequiredArgsConstructor
@Slf4j
public class AgentController {
...
@Operation(summary = "현장요원 추가", description = "새로운 현장요원을 추가합니다. 어드민만 사용할 수 있습니다.")
@PostMapping("/agent")
public void saveAgent( ...
Java
복사
•
결론)
◦
swagger 초간단 설정이 끝났다. 실행 후 http://localhost:8080/swagger-ui.html 로 접속하면 된다. 401이 뜬다면, security 단에서 해당 엔드포인트를 permitAll로 허용해주자.
◦
적용은 쉽게 했지만, 내가 원하는 대로 문서가 잘 뽑히진 않았다.
◦
그 이유는,,,, 레거시 코드 때문,,,,
◦
스웨거가 인식할 수 없는 부분들이 많아서 RequestBody인데 RequestParam으로 뜬다던가,,, 하는 요상한 것들이 많았따..
◦
이건 결국 코드가 컨벤셔널 하지 않아서 그런 거 같다. 어느 정도 규격을 맞춰주는 작업이 필요하다 절실히 느꼈다.
Swagger 적용하며 만난 자잘한 이슈
•
Swagger로 제네릭 타입 감지
잠깐 보고 가는 제네릭 두 가지 방식 : 난 첫 번째 방식이 더 좋은 거 같음. 타입 검사가 되어서
1.
return new Result<>(agents);
•
제네릭(Generic)을 사용하여 Result 클래스의 생성자를 호출하는데,
•
agents 변수의 타입이 Result 클래스의 타입 매개변수와 일치하도록 추론
•
다이아몬드 문법으로 제네릭 타입을 더 간결하게 작성할 수 있도록 도와줌
•
agents의 실제 타입은 컴파일러가 타입 추론을 통해 결정함
2.
return new Result(agents);
•
명시적으로 제네릭을 사용하지 않고 Result 클래스의 생성자를 호출
•
컴파일러는 agents의 타입에 대한 제네릭 정보를 사용하지 않고 그냥 agents를 Result 생성자에 전달함
•
Swagger https cors
◦
Swagger애서 api 테스트를 하려 할 때 계속해서 CORS 에러가 났다
◦
직접 url을 명시해줘서 해결해줬다. 요렇게 써두면 swagger ui에서 url을 선택할 수 있다.
@OpenAPIDefinition(servers = {
@Server(url = "http://localhost:8080", description = "Local Server URL"),
@Server(url = "https://call-dev.iluvit.app", description = "Dev Server URL"),
@Server(url = "https://call-api.iluvit.app", description = "Prod Server URL")
})
@SpringBootApplication
public class PoliceApplication {
YAML
복사
•
이번 swagger 적용 시 반영 안해준 친구들 → 추후 추가해줄 예정
◦
사실 우리팀은 restDocs로 곧 갈아탈 거라,,,, swagger에 그렇게 힘을 들이진 않기로 했다,,, 그래서 detail한 부분은 조금,,, 놓아줬다,,, 완벽히 하고 싶은 분들은 아래 키워드들도 찾아보고 반영해주자
Swagger enum
Request body와 multipart file → 현재 multipart form data swagger가 인식 못함
Swagger RequestHeader Authorization