개요
프론트엔드와 백엔드간 협업을 하기 위해 백엔드에서 구축한 API 스펙을 문서화 하여 프론트엔드에게 보여줘야한다.이때 API 문서를 효과적으로 만들기 위해 사용할 수 있는 라이브러리를 찾아 보았고, swagger 라는 라이브러리를 알게 되었다.
Swagger 란?
- Swagger는 API를 문서화하고 테스트할 수 있는 오픈 소스 프레임워크이다.
- 어노테이션을 통해 간편하게 API 문서를 자동으로 만들 수 있다.
- 자체적으로 사용자 친화적인 UI도 제공해주고 있기 때문에 문서를 쉽게 읽고 테스트할 수 있다.
문서화에 사용되는 어노테이션이 프로덕션 코드에 존재하기에 가독성을 떨어뜨리는 단점도 존재한다. API 스펙이 변했을 때 어노테이션 메타 데이터를 적절하게 바꿔주지 않으면 잘못된 정보를 전달할 수도 있다. 하지만 간편한 설정과 사용, 사용자 친화적인 UI는 큰 장점으로 다가온다.
Swagger 적용하기
Swagger 를 설정하기 위해 2가지의 라이브러리가 존재합니다.
- SpringFox
- SpringDoc
SpringFox 는 더이상 업데이트를 해주지 않기 때문에 Spring Boot 특정 버전에서 제대로 동작하지 않는 문제있습니다..
따라서 현재 꾸준히 업데이트 해주고 있으며, Spring Boot 최신 버전도 지원하고 있는 SpringDoc 을 사용하겠습니다.
라이브러리 추가
implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.2.0'
설정
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI openAPI() {
Server server = new Server(); // API 서버 설정
server.setUrl("/");
Server prodServer = new Server(); // 운영서버에 따로 띄우기 위해 서버를 추가할 수 있다.
server.setUrl("운영 URL");
Info info = new Info()
.title("Swagger API") // API 문서 제목
.version("v1.0.0") // API 문서 버전
.description("스웨거 API"); // API 문서 설명
return new OpenAPI()
.info(info)
.servers(List.of(server, prodServer));
}
}
Swagger 적용 모습
SwaggerController
@RestController
@RequestMapping("/api/v1")
public class SwaggerController {
// 기본적으로 controller의 이름을 따라갑니다.
// SwaggerController => swagger-controller
@GetMapping("/posts")
public String getPosts() {
return "ok";
}
@PostMapping("/posts")
public SwaggerDTO addPosts(SwaggerDTO swaggerDTO) {
return swaggerDTO;
}
}
SwaggerDTO
@Getter
@Setter
public class SwaggerDTO {
private String name;
private String phone;
}
@
@Tag
controller 에 적용
@Tag(name = "스웨거", description = "스웨거 API")
@RestController
@RequestMapping("/api/v1")
public class SwaggerController {
...
}
@Operation: API 엔드 포인트 정의
method 에 적용
@Tag(name = "스웨거", description = "스웨거 API")
@RestController
@RequestMapping("/api/v1")
public class SwaggerController {
@Operation(summary = "조회", description = "등록된 게시물을 조회합니다.")
@GetMapping("/posts")
public String getPosts() {
return "ok";
}
...
}
@ApiResponse: API 응답에 대한 설명과 상태 코드 정의
method 에 적용
@Tag(name = "스웨거", description = "스웨거 API")
@RestController
@RequestMapping("/api/v1")
public class SwaggerController {
@Operation(summary = "조회", description = "등록된 게시물을 조회합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "400", description = "조회 실패")
})
@GetMapping("/posts")
public String getPosts() {
return "ok";
}
...
}
@Schema: API 모델의 속성 정의
model 에 적용
@Getter
@Setter
public class SwaggerDTO {
@Schema(description = "이름", example = "스웨거")
private String name;
private String phone;
}
참조
'Spring Boot' 카테고리의 다른 글
Bucket4j (0) | 2024.08.26 |
---|---|
Error creating bean with name 'entityManagerFactory' defined in class path resource 에러 (0) | 2024.03.23 |
Spring Boot + Spring Security 로 JWT 로그인 방식 구현 (1) | 2023.12.06 |
Spring Security + Spring Boot / Rest API Login 구현 (3) | 2023.11.20 |
Spring boot 로 구글 클라우드 저장소(GCS) 에 파일 업로드 하기 (0) | 2023.11.07 |