๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Study/Java

[TIL] API ๋ฌธ์„œํ™”

by hong- 2022. 7. 21.

๐Ÿ™Œ๐Ÿป 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