[Spring][κ°œλ…]πŸ“„ Swaggerλ₯Ό ν™œμš©ν•œ REST API λ¬Έμ„œν™”μ˜ λͺ¨λ“  것

κΉ€μƒμš±Β·2024λ…„ 11μ›” 5일
0
post-thumbnail

✨ Swaggerλ₯Ό ν†΅ν•œ REST API λ¬Έμ„œν™”μ— λŒ€ν•œ μ„€λͺ…

SwaggerλŠ” REST API의 λ¬Έμ„œν™”λ₯Ό μžλ™ν™”ν•˜μ—¬ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ 개발 κ°„μ˜ ν˜‘μ—…μ„ 효율적으둜 μ§€μ›ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. Swagger의 μ‚¬μš©κ³Ό κ·Έ 이점을 λ‹¨κ³„λ³„λ‘œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.


1️⃣ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ 개발자의 μ—­ν•  뢄리

  • ν”„λ‘ νŠΈμ—”λ“œ 개발자: μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜λŠ” ν™”λ©΄(UI)을 κ°œλ°œν•˜κ³ , 데이터 ν‘œμ‹œμ™€ μ‘°μž‘μ„ μœ„ν•œ λ‘œμ§μ„ μž‘μ„±ν•©λ‹ˆλ‹€.
  • λ°±μ—”λ“œ 개발자: λ°μ΄ν„°λ² μ΄μŠ€ 연동, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, 데이터 처리 λ“± μ„œλ²„ 츑의 λ‘œμ§μ„ κ΅¬ν˜„ν•˜λ©°, ν”„λ‘ νŠΈμ—”λ“œμ™€μ˜ 데이터 톡신을 μœ„ν•œ APIλ₯Ό μ„€κ³„ν•©λ‹ˆλ‹€.

🎯 이처럼 역할이 λΆ„λ¦¬λ˜λ©΄ λ°±μ—”λ“œ κ°œλ°œμžκ°€ μ œκ³΅ν•˜λŠ” APIλ₯Ό ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžκ°€ μ°Έκ³ ν•˜μ—¬ 화면에 ν•„μš”ν•œ 데이터λ₯Ό 가져와야 ν•©λ‹ˆλ‹€.


2️⃣ ν”„λ‘ νŠΈμ—”λ“œ 개발자의 API μ˜μ‘΄μ„±

ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλŠ” λ°±μ—”λ“œμ—μ„œ μ œκ³΅ν•˜λŠ” API에 μ˜μ‘΄ν•΄ 데이터λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. API λ¬Έμ„œκ°€ μ—†λ‹€λ©΄ μš”μ²­ν•΄μ•Ό ν•  URL, νŒŒλΌλ―Έν„°, 응닡 ν˜•μ‹ 등을 μ•ŒκΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— API λ¬Έμ„œκ°€ ν•„μˆ˜μ μž…λ‹ˆλ‹€.

μ˜ˆμ‹œ: μ‚¬μš©μž 정보λ₯Ό λ³΄μ—¬μ£ΌλŠ” 화면을 κ΅¬ν˜„ν•  λ•Œ, ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλŠ” μ‚¬μš©μž 데이터λ₯Ό μ–»κΈ° μœ„ν•œ API의 μ—”λ“œν¬μΈνŠΈ URL, μš”μ²­ 방식, 응닡 ν˜•μ‹ 등을 μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.


3️⃣ API λ³€κ²½ μ‹œ λ°œμƒν•˜λŠ” λΆˆνŽΈν•¨

개발 μ€‘μ—λŠ” APIκ°€ 자주 λ³€κ²½λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€, κΈ°μ‘΄ κΈ°λŠ₯ μˆ˜μ •, μ˜ˆμ™Έ 처리 μΆ”κ°€ λ“±μ˜ 이유둜 APIκ°€ μ—…λ°μ΄νŠΈλ  λ•Œλ§ˆλ‹€ λ¬Έμ„œ λ˜ν•œ μ΅œμ‹ μœΌλ‘œ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • λ¬Έμ„œν™” μž‘μ—…μ˜ λΆ€λ‹΄: λ¬Έμ„œλ₯Ό μˆ˜μž‘μ—…μœΌλ‘œ 관리할 경우 λˆ„λ½μ΄λ‚˜ μ‹€μˆ˜κ°€ λ°œμƒν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • ν˜‘μ—…μ˜ λΉ„νš¨μœ¨μ„±: λ¬Έμ„œκ°€ μ΅œμ‹  μƒνƒœκ°€ μ•„λ‹ˆλΌλ©΄, ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλŠ” API의 λ³€κ²½ 사항을 μΈμ§€ν•˜μ§€ λͺ»ν•΄ 개발 효율이 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ Swagger의 μ‚¬μš© 이유

SwaggerλŠ” APIλ₯Ό μžλ™μœΌλ‘œ λ¬Έμ„œν™”ν•΄μ£ΌλŠ” λ„κ΅¬λ‘œ, API λ³€κ²½ 사항을 μžλ™ λ°˜μ˜ν•˜μ—¬ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ κ°„ ν˜‘μ—…μ„ 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.

  • μžλ™ν™”λœ λ¬Έμ„œ κ°±μ‹ : SwaggerλŠ” μ½”λ“œμ— κΈ°λ°˜ν•˜μ—¬ μžλ™μœΌλ‘œ API λ¬Έμ„œλ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ—, λ°±μ—”λ“œ μ½”λ“œκ°€ 변경될 λ•Œλ§ˆλ‹€ λ¬Έμ„œλ„ μžλ™μœΌλ‘œ μ΅œμ‹  μƒνƒœλ‘œ κ°±μ‹ λ©λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ 확인 κ°€λŠ₯: ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλŠ” Swaggerλ₯Ό 톡해 API의 μ΅œμ‹  정보λ₯Ό 확인할 수 있으며, μš”μ²­ ν˜•μ‹μ΄λ‚˜ 응닡 μ˜ˆμ‹œλ„ λ°”λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŒ€μ› κ°„μ˜ 효율적인 곡유: API λ¬Έμ„œκ°€ μžλ™ν™”λ˜μ–΄ μ‹€μ‹œκ°„μœΌλ‘œ κ°±μ‹ λ˜κΈ° λ•Œλ¬Έμ—, νŒ€μ›λ“€μ΄ μΌκ΄€λœ 정보에 μ ‘κ·Όν•  수 μžˆμ–΄ λ¬Έμ„œ μ—…λ°μ΄νŠΈμ— λ”°λ₯Έ ν˜Όλž€μ΄ μ€„μ–΄λ“­λ‹ˆλ‹€.

🌐 νš¨μœ¨μ„± 증가: SwaggerλŠ” API λ³€κ²½ 사항을 μ²΄κ³„μ μœΌλ‘œ 관리할 수 μžˆμ–΄, μˆ˜λ™ λ¬Έμ„œν™”λ‘œ μΈν•œ 였λ₯˜λ₯Ό 쀄이고, μœ μ§€λ³΄μˆ˜λ₯Ό κ°„νŽΈν•˜κ²Œ ν•©λ‹ˆλ‹€.


✨ Swagger의 κΈ°λŠ₯κ³Ό μž₯점에 λŒ€ν•œ μ„€λͺ…

SwaggerλŠ” API λ¬Έμ„œν™”λ₯Ό μžλ™ν™”ν•˜κ³ , κ°œλ°œμžλ“€μ΄ API와 더 μ‰½κ²Œ μƒν˜Έμž‘μš©ν•  수 μžˆλ„λ‘ λ•λŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. 각 κΈ°λŠ₯κ³Ό μž₯점을 μ•„λž˜μ™€ 같이 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.


1️⃣ Swagger의 κ°„λ‹¨ν•œ μ„€μ •

  • SwaggerλŠ” ν”„λ‘œμ νŠΈ APIλ₯Ό μžλ™μœΌλ‘œ λ¬Έμ„œν™”ν•΄μ£Όλ©°, μ›Ή νŽ˜μ΄μ§€ ν˜•νƒœλ‘œ API λͺ©λ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.
  • μ½”λ“œμ— κ°„λ‹¨ν•œ μ„€μ •λ§Œ μΆ”κ°€ν•˜λ©΄, SwaggerλŠ” λͺ¨λ“  APIλ₯Ό μžλ™μœΌλ‘œ μˆ˜μ§‘ν•΄ κ°œλ°œμžκ°€ μ‰½κ²Œ ν™•μΈν•˜κ³  ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” λ¬Έμ„œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

🎯 효과: Swaggerλ₯Ό 톡해 API에 λŒ€ν•œ 정보가 μ‰½κ²Œ μ œκ³΅λ˜μ–΄, λͺ¨λ“  κ°œλ°œμžλ“€μ΄ κ°„νŽΈν•˜κ²Œ API λͺ©λ‘μ„ ν™•μΈν•˜κ³  각 API의 μ„ΈλΆ€ 사항을 λͺ…ν™•νžˆ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


2️⃣ Controller에 μ •μ˜λœ URL 확인

  • SwaggerλŠ” ν”„λ‘œμ νŠΈ λ‚΄μ˜ λͺ¨λ“  API URL을 ν•œ νŽ˜μ΄μ§€μ—μ„œ ν•œλˆˆμ— λ³Ό 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • 각 HTTP λ©”μ†Œλ“œ(GET, POST, PUT, DELETE λ“±)와 ν•¨κ»˜ URL이 ν‘œμ‹œλ˜μ–΄, μ–΄λ–€ APIκ°€ μ–΄λ–€ λ°©μ‹μœΌλ‘œ ν˜ΈμΆœλ˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ λ³΄μ—¬μ€λ‹ˆλ‹€.

πŸ“ 효과: ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ μ–΄λ–€ APIκ°€ μ–΄λ–€ κ²½λ‘œμ—μ„œ ν˜ΈμΆœλ˜λŠ”μ§€ μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆμ–΄, 개발자 κ°„μ˜ ν˜‘μ—…μ΄ μˆ˜μ›”ν•΄μ§‘λ‹ˆλ‹€.


3️⃣ API λͺ…세와 μ„€λͺ… 제곡

  • SwaggerλŠ” 각 API의 μž…λ ₯ νŒŒλΌλ―Έν„°, 응닡 ν˜•μ‹, μ„€λͺ… 등을 ν¬ν•¨ν•œ API λͺ…μ„Έλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” 각 APIκ°€ μ–΄λ–€ 데이터λ₯Ό μž…λ ₯으둜 λ°›κ³ , μ–΄λ–€ ν˜•μ‹μœΌλ‘œ μ‘λ‹΅ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ νŒŒμ•…ν•  수 있으며, API의 λ™μž‘μ„ μ„€λͺ…ν•˜λŠ” μΆ”κ°€ 주석을 톡해 API의 λͺ©μ μ„ μ‰½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“ 효과: κ°œλ°œμžλ“€μ΄ 각 API의 λ™μž‘κ³Ό νŒŒλΌλ―Έν„°λ₯Ό μ‰½κ²Œ 이해할 수 있으며, API μ‚¬μš© 쀑 λ°œμƒν•  수 μžˆλŠ” ν˜Όλž€κ³Ό μ‹€μˆ˜λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.


4️⃣ 직접 ν…ŒμŠ€νŠΈ κ°€λŠ₯

  • Swagger UIλŠ” 직접 APIλ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • λΈŒλΌμš°μ €μ—μ„œ APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‹€μ‹œκ°„μœΌλ‘œ 응닡 데이터λ₯Ό 확인할 수 있고, λ‹€μ–‘ν•œ νŒŒλΌλ―Έν„° 값을 λ³€κ²½ν•΄κ°€λ©° APIκ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸš€ 효과: 개발 초기 단계와 μœ μ§€λ³΄μˆ˜ λ‹¨κ³„μ—μ„œ API의 정상 μž‘λ™ μ—¬λΆ€λ₯Ό μ¦‰μ‹œ 확인할 수 μžˆμ–΄, 디버깅과 였λ₯˜ μˆ˜μ •μ΄ μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.


πŸ“Œ Spring ν”„λ‘œμ νŠΈ μ μš©μ„ μœ„ν•œ springdoc-openapi

  • 링크(https://springdoc.org/)λŠ” springdoc-openapi 라이브러리의 곡식 μ‚¬μ΄νŠΈλ‘œ μ—°κ²°λ˜λ©°, 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” Spring ν”„λ‘œμ νŠΈμ— Swaggerλ₯Ό μ†μ‰½κ²Œ μ μš©ν•  수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€.
  • springdoc-openapiλŠ” Spring Boot ν™˜κ²½μ—μ„œ Swagger 섀정을 κ°„λ‹¨νžˆ μΆ”κ°€ν•  수 μžˆμ–΄, Spring 기반의 ν”„λ‘œμ νŠΈμ— Swagger UI κΈ°λŠ₯을 μ‰½κ²Œ λ„μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”§ SwaggerConfiguration.java 파일 μ„€μ •

πŸ“Œ 클래슀 μ„€μ •

  • @Configuration μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” Springμ—μ„œ μ„€μ • 클래슀둜 μΈμ‹λ˜λ©°, Swagger κ΄€λ ¨ 섀정이 μ μš©λ©λ‹ˆλ‹€.

πŸ“Œ OpenAPI 객체 생성

  • @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 openAPI() λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” OpenAPI의 κΈ°λ³Έ 정보λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
    • Info info 객체λ₯Ό μƒμ„±ν•˜μ—¬ API의 타이틀, μ„€λͺ…, 버전, μ—°λ½μ²˜ 정보 등을 μ„€μ •ν•©λ‹ˆλ‹€.
    • title("Project API λͺ…μ„Έμ„œ"): API의 이름을 λ‚˜νƒ€λ‚΄λ©°, ν”„λ‘œμ νŠΈ λͺ…μ„Έμ„œλΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
    • description: Swagger UI에 ν‘œμ‹œλ  μΆ”κ°€ μ •λ³΄λ‘œ, HTML νƒœκ·Έλ₯Ό 포함해 λ‘œκ³ μ™€ μ•ˆλ‚΄ ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
    • contact: API λ‹΄λ‹Ήμž 이름, 이메일, URL을 μ„€μ •ν•˜μ—¬ μ—°κ΄€λœ 정보도 ν‘œμ‹œν•©λ‹ˆλ‹€.
    • return: μ„€μ •λœ info 객체가 ν¬ν•¨λœ OpenAPI μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜μ—¬ Swagger UI에 ν‘œμ‹œλ©λ‹ˆλ‹€.
@Configuration
public class SwaggerConfiguration {
    
    @Bean
    public OpenAPI openAPI() {
        Info info = new Info()
                .title("Project API λͺ…μ„Έμ„œ")
                .description("<img src='https://example.com/logo.png' style='width: 50px;'/> API λͺ…μ„Έμ„œμž…λ‹ˆλ‹€. ")
                .version("v1.0.0")
                .contact(new Contact().name("κ°œλ°œνŒ€").email("devteam@example.com").url("https://example.com"));
        
        return new OpenAPI().info(info);
    }
}

πŸ“‚ API κ·Έλ£Ή μ„€μ •

πŸ“Œ κ΄€λ¦¬μž API κ·Έλ£Ή

  • publicApi() λ©”μ„œλ“œλŠ” GroupedOpenApiλ₯Ό 톡해 κ΄€λ¦¬μžμš© API 그룹을 λ§Œλ“­λ‹ˆλ‹€.
    • group("admin-api"): 이 API 그룹의 이름을 "admin-api"둜 μ„€μ •ν•˜μ—¬, Swagger UIμ—μ„œ κ΄€λ¦¬μžμš© APIλ₯Ό μ‰½κ²Œ ꡬ뢄할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
    • pathsToMatch("/admin/**"): /admin/둜 μ‹œμž‘ν•˜λŠ” 경둜만 이 그룹에 ν¬ν•¨μ‹œμΌœ κ΄€λ¦¬μžκ°€ μ‚¬μš©ν•˜λŠ” μ—”λ“œν¬μΈνŠΈλ“€λ§Œ ν‘œμ‹œλ©λ‹ˆλ‹€.
@Bean
public GroupedOpenApi publicApi() {
    return GroupedOpenApi.builder()
            .group("admin-api")
            .pathsToMatch("/admin/**")
            .build();
}

πŸ“Œ μ‚¬μš©μž API κ·Έλ£Ή

  • userApi() λ©”μ„œλ“œλŠ” μ‚¬μš©μžμš© GroupedOpenApiλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • group("user-api"): 이 API 그룹의 이름을 "user-api"둜 μ„€μ •ν•˜μ—¬ 일반 μ‚¬μš©μžκ°€ λ³Ό 수 μžˆλŠ” API 그룹을 ν‘œμ‹œν•©λ‹ˆλ‹€.
    • pathsToMatch("/user/**"): /user/둜 μ‹œμž‘ν•˜λŠ” 경둜만 이 그룹에 ν¬ν•¨λ˜μ–΄ μ‚¬μš©μžμš© μ—”λ“œν¬μΈνŠΈλ“€λ§Œ ν‘œμ‹œλ©λ‹ˆλ‹€.
@Bean
public GroupedOpenApi userApi() {
    return GroupedOpenApi.builder()
            .group("user-api")
            .pathsToMatch("/user/**")
            .build();
}

πŸ”§ AdminUserController 클래슀

@RestController
@RequestMapping("/admin")
@CrossOrigin("*")
@Tag(name = "μ–΄λ“œλ―Ό 컨트둀러", description = "νšŒμ› λͺ©λ‘κ³Ό 상세보기, 등둝, μˆ˜μ •, μ‚­μ œ λ“± μ „λ°˜μ μΈ νšŒμ› 관리λ₯Ό μ²˜λ¦¬ν•˜λŠ” 클래슀")
public class AdminUserController {
    private static final Logger logger = LoggerFactory.getLogger(AdminUserController.class);

    private MemberService memberService;

    public AdminUserController(MemberService memberService) {
        this.memberService = memberService;
    }

πŸ“Œ @RestController

  • ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ REST API의 μ»¨νŠΈλ‘€λŸ¬μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. Springμ—μ„œ 이 클래슀λ₯Ό RESTful μ›Ή μ„œλΉ„μŠ€μ˜ μ—”λ“œν¬μΈνŠΈλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

πŸ“Œ @RequestMapping("/admin")

  • 클래슀의 κΈ°λ³Έ 경둜λ₯Ό /admin으둜 μ„€μ •ν•©λ‹ˆλ‹€. 이 ν΄λž˜μŠ€μ— μ •μ˜λœ λͺ¨λ“  λ©”μ„œλ“œλŠ” /admin을 ν¬ν•¨ν•œ URLμ—μ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

πŸ“Œ @CrossOrigin("*")

  • CORS (Cross-Origin Resource Sharing) μ„€μ •μœΌλ‘œ, λͺ¨λ“  λ„λ©”μΈμ—μ„œ 이 API에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν—ˆμš©ν•©λ‹ˆλ‹€. νŠΉμ • 도메인 μ œν•œ 없이 μ™ΈλΆ€ μš”μ²­μ„ ν—ˆμš©ν•˜λ €λŠ” 경우 μ‚¬μš©ν•©λ‹ˆλ‹€.

πŸ“Œ @Tag μ–΄λ…Έν…Œμ΄μ…˜

  • @Tag(name = "μ–΄λ“œλ―Ό 컨트둀러", description = "νšŒμ› λͺ©λ‘κ³Ό 상세보기, 등둝, μˆ˜μ •, μ‚­μ œ λ“± μ „λ°˜μ μΈ νšŒμ› 관리λ₯Ό μ²˜λ¦¬ν•˜λŠ” 클래슀")
  • Swagger λ¬Έμ„œμ—μ„œ 이 μ»¨νŠΈλ‘€λŸ¬μ— λŒ€ν•œ μ„€λͺ…을 μ œκ³΅ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
    • name: Swagger UIμ—μ„œ 컨트둀러의 이름을 ν‘œμ‹œν•©λ‹ˆλ‹€.
    • description: νšŒμ› 관리 κΈ°λŠ₯에 λŒ€ν•œ μ„€λͺ…을 μΆ”κ°€ν•˜μ—¬, ν•΄λ‹Ή μ»¨νŠΈλ‘€λŸ¬κ°€ μ–΄λ–€ 역할을 μˆ˜ν–‰ν•˜λŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€.

πŸ”§ API λ©”μ„œλ“œ - νšŒμ› λͺ©λ‘ 쑰회

    @Operation(summary = "νšŒμ›λͺ©λ‘", description = "νšŒμ›μ˜ <big>전체 λͺ©λ‘</big>을 λ°˜ν™˜ν•΄ μ€λ‹ˆλ‹€.")
    @ApiResponses(value = {
        @ApiResponse(responseCode = "200", description = "νšŒμ›λͺ©λ‘ OK!!"),
        @ApiResponse(responseCode = "404", description = "νŽ˜μ΄μ§€μ—†μ–΄!!"),
        @ApiResponse(responseCode = "500", description = "μ„œλ²„μ—λŸ¬!!")
    })
    @GetMapping(value = "/user")
    public ResponseEntity<?> userList() {
        return ResponseEntity.ok("νšŒμ›λͺ©λ‘ 리턴 call");
    }
}

πŸ“Œ @Operation μ–΄λ…Έν…Œμ΄μ…˜

  • summary: API μ—”λ“œν¬μΈνŠΈμ˜ κ°„λ‹¨ν•œ μš”μ•½μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "νšŒμ›λͺ©λ‘"으둜 μ„€μ •λ˜μ–΄ μžˆμ–΄, 이 APIκ°€ νšŒμ› λͺ©λ‘μ„ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • description: API의 상세 μ„€λͺ…을 μ œκ³΅ν•©λ‹ˆλ‹€. 이 μ„€λͺ…은 Swagger UIμ—μ„œ 더 μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•˜λ©°, HTML νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈλ₯Ό κ°•μ‘°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ @ApiResponses μ–΄λ…Έν…Œμ΄μ…˜

  • μ—¬λŸ¬ @ApiResponseλ₯Ό ν¬ν•¨ν•˜μ—¬ API의 λ‹€μ–‘ν•œ 응닡 μ½”λ“œμ™€ κ·Έ μ„€λͺ…을 μ •μ˜ν•©λ‹ˆλ‹€.
    • 각 응닡 μ½”λ“œμ™€ μ„€λͺ…을 톡해, ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ— λŒ€ν•œ κ°€λŠ₯ν•œ 응닡 μƒνƒœλ₯Ό μ‰½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ @ApiResponse μ–΄λ…Έν…Œμ΄μ…˜

  • responseCode: HTTP 응닡 μ½”λ“œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  • description: 응닡 μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • 200: μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œμ˜ λ©”μ‹œμ§€ "νšŒμ›λͺ©λ‘ OK!!".
    • 404: λ¦¬μ†ŒμŠ€λ₯Ό 찾지 λͺ»ν–ˆμ„ λ•Œμ˜ λ©”μ‹œμ§€ "νŽ˜μ΄μ§€μ—†μ–΄!!".
    • 500: μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμ„ λ•Œμ˜ λ©”μ‹œμ§€ "μ„œλ²„μ—λŸ¬!!".

πŸ“Œ @GetMapping(value = "/user")

  • HTTP GET μš”μ²­μ„ λ°›λŠ” λ©”μ„œλ“œμ΄λ©°, /admin/user 경둜둜 ν˜ΈμΆœλ©λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” νšŒμ› λͺ©λ‘μ„ λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

πŸ“Œ userList λ©”μ„œλ“œ

  • ResponseEntity.ok("νšŒμ›λͺ©λ‘ 리턴 call")을 λ°˜ν™˜ν•˜μ—¬, νšŒμ› λͺ©λ‘μ„ λ°˜ν™˜ν•˜λŠ” API의 예제 응닡을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ‹€μ œ 개발 ν™˜κ²½μ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νšŒμ› λͺ©λ‘μ„ 가져와 λ°˜ν™˜ν•  κ²ƒμž…λ‹ˆλ‹€.

🧾 @Schema μ–΄λ…Έν…Œμ΄μ…˜ 적용 (MemberDto 클래슀)

@Schema(title = "MemberDto (νšŒμ›μ •λ³΄)", description = "νšŒμ›μ˜ 아이디, λΉ„λ²ˆ, 이름을 가진 Domain Class")
public class MemberDto {

πŸ“Œ @Schema μ–΄λ…Έν…Œμ΄μ…˜ (클래슀 μˆ˜μ€€)

  • title: 클래슀의 제λͺ©μ„ μ„€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "MemberDto (νšŒμ›μ •λ³΄)"둜 μ„€μ •ν•˜μ—¬ 이 ν΄λž˜μŠ€κ°€ νšŒμ› 정보λ₯Ό λ‹€λ£¨λŠ” DTOμž„μ„ λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€.
  • description: 이 클래슀의 μ„€λͺ…을 μ œκ³΅ν•˜μ—¬, Swagger λ¬Έμ„œμ— "νšŒμ›μ˜ 아이디, λΉ„λ²ˆ, 이름을 가진 Domain Class"λΌλŠ” μ„€λͺ…이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€. 이λ₯Ό 톡해 이 DTOκ°€ νšŒμ› κ΄€λ ¨ 데이터λ₯Ό λ‹΄κ³  μžˆμŒμ„ μ§κ΄€μ μœΌλ‘œ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

🧾 @Schema μ–΄λ…Έν…Œμ΄μ…˜ (ν•„λ“œ μˆ˜μ€€) 각 ν•„λ“œλ³„ μ„€λͺ…

    @Schema(description = "νšŒμ›μ•„μ΄λ””", requiredMode = Schema.RequiredMode.REQUIRED, example = "hissam")
    private String userId;
  1. userId ν•„λ“œ
    • description: ν•„λ“œμ— λŒ€ν•œ μ„€λͺ…μœΌλ‘œ "νšŒμ›μ•„μ΄λ””"λ₯Ό λͺ…μ‹œν•˜μ—¬, Swagger UIμ—μ„œ 이 ν•„λ“œκ°€ νšŒμ›μ˜ μ•„μ΄λ””μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • requiredMode: 이 ν•„λ“œλ₯Ό ν•„μˆ˜ κ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€. Schema.RequiredMode.REQUIREDλ₯Ό μ‚¬μš©ν•˜μ—¬, API μš”μ²­ μ‹œ λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λŠ” κ°’μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • example: μ˜ˆμ‹œ κ°’ "hissam"을 μΆ”κ°€ν•˜μ—¬, Swagger UIμ—μ„œ API ν…ŒμŠ€νŠΈ μ‹œ μ°Έμ‘°ν•  수 μžˆλŠ” μƒ˜ν”Œ 값을 μ œκ³΅ν•©λ‹ˆλ‹€.
    @Schema(description = "νšŒμ›μ΄λ¦„", example = "홍길동")
    private String userName;
  1. userName ν•„λ“œ
    • description: "νšŒμ›μ΄λ¦„"으둜 ν•„λ“œμ— λŒ€ν•œ μ„€λͺ…을 μΆ”κ°€ν•˜μ—¬ 이 ν•„λ“œκ°€ μ‚¬μš©μžμ˜ 이름을 λ‹΄κ³  μžˆμŒμ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
    • example: "홍길동"μ΄λΌλŠ” μ˜ˆμ‹œ 값을 μ œκ³΅ν•˜μ—¬ Swagger UIμ—μ„œ API ν…ŒμŠ€νŠΈ μ‹œ μ°Έκ³ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    @Schema(description = "νšŒμ›λΉ„λ°€λ²ˆν˜Έ")
    private String userPwd;
  1. userPwd ν•„λ“œ
    • description: "νšŒμ›λΉ„λ°€λ²ˆν˜Έ"λΌλŠ” μ„€λͺ…을 μΆ”κ°€ν•˜μ—¬, 이 ν•„λ“œκ°€ μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ‹΄λŠ” ν•„λ“œμž„μ„ λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€.
    @Schema(description = "이메일아이디")
    private String emailId;

    @Schema(description = "이메일도메인", defaultValue = "ssafy.com", example = "google.com")
    private String emailDomain;
  1. emailId 및 emailDomain ν•„λ“œ
    • emailId ν•„λ“œλŠ” "이메일아이디"둜 μ„€λͺ…λ©λ‹ˆλ‹€.
    • emailDomain ν•„λ“œλŠ” "이메일도메인"으둜 μ„€λͺ…λ˜λ©°, μΆ”κ°€μ μœΌλ‘œ κΈ°λ³Έ κ°’κ³Ό μ˜ˆμ‹œ 값을 μ œκ³΅ν•©λ‹ˆλ‹€.
      • defaultValue: κΈ°λ³Έ 값을 "ssafy.com"으둜 μ„€μ •ν•˜μ—¬, 값이 μ§€μ •λ˜μ§€ μ•Šμ•˜μ„ λ•Œ 기본적으둜 이 값을 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
      • example: "google.com"μ΄λΌλŠ” μ˜ˆμ‹œ 값을 μ„€μ •ν•˜μ—¬ Swagger λ¬Έμ„œμ—μ„œ 이 ν•„λ“œλ₯Ό ν…ŒμŠ€νŠΈν•  λ•Œ μ°Έκ³ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    @Schema(description = "κ°€μž…μΌ", defaultValue = "ν˜„μž¬μ‹œκ°„")
    private String joinDate;
}
  1. joinDate ν•„λ“œ
    • description: 이 ν•„λ“œλ₯Ό "κ°€μž…μΌ"둜 μ„€λͺ…ν•˜μ—¬ κ°€μž… λ‚ μ§œλ₯Ό λ‹΄λŠ” ν•„λ“œμž„μ„ λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€.
    • defaultValue: κΈ°λ³Έ 값을 "ν˜„μž¬μ‹œκ°„"으둜 μ„€μ •ν•˜μ—¬, 값이 주어지지 μ•Šμ€ 경우 ν˜„μž¬ μ‹œκ°„μ΄ 기본으둜 μ‚¬μš©λ¨μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보