문제점
- REST API를 문서화하는 것은 다른 개발자가 알아보기 쉽게 하기 위해서 중요하다.
- 하지만 수정할 때마다 직접 문서를 유지보수하는 것은 번거롭고 힘들다.
Swagger
- Swagger는 OpenApi Specification을 위한 프레임워크로 API를 자동으로 문서화해준다.
- 구성요소
- Swagger Editor : 브라우저 기반의 OpenApi Spec을 쓸수 있는 에디터
- Swagger UI : 웹에서 OpenApi Spec를 렌더링해 상호작용 가능한 API 문서를 제공(HTML, JS, CSS 파일로 구성)
- Swagger Codegen : OpenAPI spec으로부터 서버와 클라이언트 라이브러리를 위한 툴
- 추가적으로 @ApiResponses를 통해 결과 코드를 커스텀할 수 있다.
- 다음과 같이 설정파일을 작성하면 모든 API가 문서화된다.
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
Unit Testing & Integration testing
- Unit Testing은 JUnit, Mockito, Spring Test를 활용해 테스트한다. 여기서 Mockito는 JUnit위에서 동작하며 Mocking과 Verification을 도와주는 프레임워크이다. Mocking은 가짜 객체를 만들어 테스트하는 것을 의미한다. 예시 코드는 다음과 같다.
@RunWith(SpringRunner.class)
@WebMvcTest(DogController.class)
public class DogControllerUnitTest {
@Autowired
private MockMvc mockMvc;
@MockBean
DogService dogService;
@Test
public void getBreeds() throws Exception {
mockMvc.perform(get("/dogs/breed"))
.andExpect(status().isOk())
.andExpect(content().json("[]"));
verify(dogService, times(1)).retrieveDogBreed();
}
- Integration Testing은 하나의 컴포넌트가 아닌 전체 애플리케이션을 테스팅한다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class DogControllerIntegrationTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void getBreeds(){
ResponseEntity<List> response = this.restTemplate.getForEntity("http://localhost:" + port + "/dogs/breed", List.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
}