๐๐ป API Documentation
๐ API ๋ฌธ์ / API ์คํ / API ์ฌ์
- API ์ฌ์ฉ์ ์ํ ์ด๋ค ์ ๋ณด๊ฐ ๋ด๊ฒจ ์๋ ๋ฌธ์
- ํด๋ผ์ด์ธํธ๊ฐ REST API ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ์ ์ ์กํ๊ธฐ ์ํด ์์์ผ ๋๋ ์์ฒญ ์ ๋ณด๋ฅผ ๋ฌธ์๋ก ์ ์ ๋ฆฌํ๋ ๊ฒ
→ ์์ฒญ์ ๋ณด : ์์ฒญ URL(URI), Request Body, Query Parameter ๋ฑ
- ๊ฐ๋ฐ์๊ฐ API ์ ๋ณด๋ฅผ ์ง์ ์๊ธฐ๋ก ์์ฑํ ์๋ ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋๋ฅผ ํตํด ์๋ ์์ฑ๋ ๊ฐ๋ฅ
๐API ๋ฌธ์ํ ๋ฐฉ์
โ Swagger
- ์ ๋ํ ์ด์ ๊ธฐ๋ฐ์ API ๋ฌธ์ํ ๋ฐฉ์
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์์ ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ๊ด๋ จ๋ ์ ๋ํ ์ด์ ์ถ๊ฐ๋จ
- ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง ๋ณด์์ฑ์ด ๋จ์ด์ง
- API ๋ฌธ์์ API ์ฝ๋ ๊ฐ ์ ๋ณด ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
- API ํด๋ก์จ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์
โก Spring Rest Docs
- ํ ์คํธ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๋ํ ์ด์
- API ๋ฌธ์ ์์ฑ์ ์ํ ์ ๋ํ ์ด์ ๊ณผ ๊ฐ์ ์ด๋ ํ ์ ๋ณด๋ ์ถ๊ฐ๋์ง ์์
- ํ ์คํธ ์ผ์ด์ค ์คํ์ด Passed์ฌ์ผ API ๋ฌธ์ ์์ฑ๋จ
- ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ฐ๋์ ์์ฑํด์ผ ํจ
- API ํด๋ก์จ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์
๐ Spring Rest Docs์ API ๋ฌธ์ ์์ฑ ํ๋ฆ
โ ํ ์คํธ ์ฝ๋ ์์ฑ
โธ ์ฌ๋ผ์ด์ค ํ ์คํธ ์ฝ๋ ์์ฑ
- Spring Rest Docs๋ Controller์ ์ฌ๋ผ์ด์คํ ์คํธ์ ๋ฐ์ ํ ๊ด๋ จ์ด ์์
- Controller์ ๋ํ ์ฌ๋ผ์ด์ค ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํจ
โธ API ์คํ ์ ๋ณด ์ฝ๋ ์์ฑ
- Controller์ ์ ์ ๋์ด ์๋ API ์คํ ์ ๋ณด(Request Body, Response Body, Query Parameter ๋ฑ)์ ์ฝ๋๋ก ์์ฑ
โก test ํ์คํฌ ์คํ
โธ ์์ฑํ ์ฌ๋ผ์ด์ค ํ ์คํธ ์ฝ๋ ์คํ
- ํ๋์ ํ ์คํธ ํด๋์ค or Gradle ๋น๋ ํ์คํฌ ์ค ํ๋์ธ test task๋ฅผ ์คํ ์์ผ์ API ๋ฌธ์ ์ค๋ํ์ ์ผ๊ด ์์ฑ
โธ ํ ์คํธ ์คํ ๊ฒฐ๊ณผ ํ์ธ
- ์คํ ๊ฒฐ๊ณผ๊ฐ passed ์ด๋ฉด ๋ค์ ์์ ์งํ
- ์คํ ๊ฒฐ๊ณผ๊ฐ failed ์ด๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ ํ ํ ๋ค์ ํ ์คํธ ์งํ
โข API ๋ฌธ์ ์ค๋ํ(.adoc ํ์ผ) ์์ฑ
- ์คํ ๊ฒฐ๊ณผ๊ฐ passed ์ด๋ฉด ํ ์คํธ ์ฝ๋์ ํฌํจ๋ API ์คํ ์ ๋ณด ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก API ๋ฌธ์ ์ค๋ํ( .adoc )์ด ํ์ผ๋ก ์์ฑ
๐ก ์ค๋ํ : Snippet
- ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋์ ์ผ๋ถ ์กฐ๊ฐ์ ์๋ฏธ ( or ๋ฌธ์์ ์ผ๋ถ ์กฐ๊ฐ )
- ํ ์คํธ ์ผ์ด์ค ํ๋ ๋น ํ๋์ ์ค๋ํ์ด ์์ฑ๋จ
- ์ฌ๋ฌ ๊ฐ์ ์ค๋ํ์ ๋ชจ์์ ํ๋์ API ๋ฌธ์ ์์ฑํ ์ ์์
- .adoc ๋ฌธ์ ์ค๋ํ์ ์์ฑํด์ฃผ๋ Asciidoctor ํ์
โฃ API ๋ฌธ์ ์์ฑ
- ์์ฑ๋ API ๋ฌธ์ ์ค๋ํ์ ๋ชจ์์ ํ๋์ API ๋ฌธ์ ์์ฑ
โค API ๋ฌธ์๋ฅผ HTML๋ก ๋ณํ
- ์์ฑ๋ API ๋ฌธ์๋ฅผ HTML ํ์ผ๋ก ๋ณํ
- HTML๋ก ๋ณํ๋ API ๋ฌธ์๋ HTML ํ์ผ ์์ฒด๋ฅผ ๊ณต์ ํ ์๋ ์๊ณ URL์ ํตํด ํด๋น HTML์ ์ ์ํด์ ํ์ธ ๊ฐ๋ฅ
- ์ฆ ์ธ๋ถ์ ์ ๊ณตํ ์๋ ์๊ณ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๊ณกํด์ API ๋ฌธใ ์ ํ์ธ ๊ฐ๋ฅ
๐ Controller ํ ์คํธ ์ผ์ด์ค์ Spring Rest Docs ์ ์ฉ
โช๏ธ API ๋ฌธ์ ์์ฑ์ ์ํ ์ฌ๋ผ์ด์ค ํ ์คํธ ์ผ์ด์ค
@WebMvcTest(MemberController.class)
@MockBean(JpaMetamodelMappingContext.class)
@AutoConfigureRestDocs
public class MemberControllerRestDocsTest {
@Autowired
private MockMvc mockMvc;
@MockBean
//ํ
์คํธ ๋์ Controller ํด๋์ค๊ฐ ์์กดํ๋ ๊ฐ์ฒด ์
๋ ฅ
@Test
public void postMemberTest() throws Exception {
//given
//ํ
์คํธ ๋ฐ์ดํฐ
//Mock ๊ฐ์ฒด๋ฅผ ์ด์ฉํ Stubbing
//when
ResultActions actions = mockMvc.perform( //request์ ์ก// )
//then
actions
.andExpect( //response์ ๋ํ ๊ธฐ๋ ๊ฐ ๊ฒ์ฆ // )
.andDo(document( //API ๋ฌธ์ ์คํ ์ ๋ณด ์ถ๊ฐ ));
}
}
โ @WebMvcTest(MemberController.class)
- Controller๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํ ์ ์ฉ ์ ๋ํ ์ด์
- ์ ํฐ๋ค์ด์ ๊ดํธ ์์๋ ํ ์คํธ ๋์ Controller ํด๋์ค๋ฅผ ์ง์ ํด์ค
โก @MockBean(JpaMetamodelMappingContext.class)
- JPA์์ ์ฌ์ฉํ๋ Bean๋ค์ Mock ๊ฐ์ฒด๋ก ์ฃผ์ ํด์ฃผ๋ ์ค์
โข @AutoConfigureRestDocs
- Spring Rest Docs์ ๋ํ ์๋ ๊ตฌ์ฑ์ ํด์ค
โฃ private MockMvc mockMvc
- MockMvc ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์
โค @MockBean
- Controller ํด๋์ค๊ฐ ์์กดํ๋ ๊ฐ์ฒด (์ฃผ๋ก Service, Mapper)์ ์์กด์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด @MockBean์ Mock ๊ฐ์ฒด ์ฃผ์
โฅ given์ ํ ์คํธ ๋ฐ์ดํฐ
- HTTP request์ ํ์ํ Request Body๋ Query Parameter, Path Variable ๋ฑ์ ๋ฐ์ดํฐ ์ถ๊ฐ
โฆ given์ Stubbing
- MockBean์ ํตํด ์ฃผ์ ๋ฐ์ Mock ๊ฐ์ฒด๊ฐ ๋์ํ๋๋ก given( ) ๋ฑ์ ๋ฉ์๋๋ก Stubbing ํด์ค
โง mockMvc.perform( request ์ ์ก )
- MockMvc์ perform( ) ๋ฉ์๋๋ก request ์ ์ก
โจ .andExpect( response์ ๋ํ ๊ธฐ๋ ๊ฐ ๊ฒ์ฆ )
- ์ฌ๋ผ์ด์ค ํ ์คํธ์ ๋์ผํ๊ฒ ๊ฒ์ฆ ์งํ
โฉ .andDo(document( API ๋ฌธ์ ์คํ ์ ๋ณด ์ถ๊ฐ ))
- andDo(...) ๋ฉ์๋๋ andExpect( ) ์ฒ๋ผ ์ด๋ค ๊ฒ์ฆ ์์ ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ผ๋ฐ์ ์ธ ๋์์ ์ ์ํ๊ณ ์ ํ ๋ ์ฌ์ฉ
๐ก SpringBootTest vs WebMvcTest
โช๏ธ @SpringBootTest
- @AutoConfigureMockMvc์ ํจ๊ป ์ฌ์ฉ๋์ด Controller๋ฅผ ํ ์คํธ
- ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์ ์ฒด Bean์ ApplicationContext์ ๋ฑ๋กํ์ฌ ์ฌ์ฉํจ
- ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ํธ๋ฆฌํ์ง๋ง ์คํ ์๋๊ฐ ์๋์ ์ผ๋ก ๋๋ฆผ
- ์ฌ์ฉ : ๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ์์ฒญ ํ๋ก์ธ์ค๊ฐ ์ด์ด์ง๋ ํตํฉ ํ ์คํธ์ ์ฃผ๋ก ์ฌ์ฉ
โช๏ธ @WebMvcTest
- Controller ํ ์คํธ์ ํ์ํ Bean๋ง Application Context์ ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ ์คํ ์๋ ์๋์ ์ผ๋ก ๋น ๋ฆ
- ์ฌ์ฉ : Controller๋ฅผ ์ํ ์ฌ๋ผ์ด์ค ํ ์คํธ์ ์ฃผ๋ก ์ฌ์ฉ
'Study > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Spring Security ์ธ์ฆ (0) | 2022.07.25 |
---|---|
[TIL] Spring Security (0) | 2022.07.24 |
[TIL] ์ธ์ฆ/๋ณด์ (0) | 2022.07.21 |
[TIL] ์ฌ๋ผ์ด์ค ํ ์คํธ (0) | 2022.07.14 |
[TIL] ๋จ์ํ ์คํธ (0) | 2022.07.12 |