Skip to content

Latest commit

Β 

History

History
429 lines (284 loc) Β· 14.3 KB

File metadata and controls

429 lines (284 loc) Β· 14.3 KB

ꡬ쑰 및 섀계 μ»¨λ²€μ…˜

1. νŒ¨ν‚€μ§€ ꡬ쑰

기본 ꡬ쑰

  • api: Controller, DTO, Facadeλ₯Ό ν¬ν•¨ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측
    • controller: RESTful API μ—”λ“œν¬μΈνŠΈ μ •μ˜
    • dto: Request/Response DTO μ •μ˜
    • facade: μ—¬λŸ¬ 도메인 μ„œλΉ„μŠ€λ₯Ό μ‘°μœ¨ν•˜λŠ” Facade 클래슀
  • domain: λ„λ©”μΈλ³„λ‘œ κ΅¬μ„±λ˜λ©° 각 도메인은 λ‹€μŒμ˜ ν•˜μœ„ νŒ¨ν‚€μ§€λ₯Ό 가짐
    • Entity 클래슀 (도메인 λͺ¨λΈ)
    • application: Service ν΄λž˜μŠ€μ™€ DTO μ •μ˜
    • infra: JPA Repository κ΅¬ν˜„μ²΄ 및 μ™ΈλΆ€ μ‹œμŠ€ν…œ 연동
  • auth: 인증/인가 κ΄€λ ¨ 둜직 (JWT, OAuth, 둜그인/λ‘œκ·Έμ•„μ›ƒ λ“±)
  • external: μ™ΈλΆ€ API ν΄λΌμ΄μ–ΈνŠΈ (Feign Client λ“±)
  • global: 곡톡 μ„€μ •, μ˜ˆμ™Έ 처리, μœ ν‹Έλ¦¬ν‹°, μ–΄λ…Έν…Œμ΄μ…˜ λ“±

κ·œμΉ™

  • μ„œλΉ„μŠ€ κ°„ μ°Έμ‘° κΈˆμ§€: 도메인 ServiceλŠ” λ‹€λ₯Έ λ„λ©”μΈμ˜ Serviceλ₯Ό 직접 μ°Έμ‘°ν•˜μ§€ μ•ŠμŒ
  • Facade 계측 ν•„μˆ˜: μ—¬λŸ¬ 도메인 Serviceλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ Facade κ³„μΈ΅μ—μ„œ 처리
  • ν•˜μœ„ λͺ¨λ“ˆμ΄ λ§Žμ„ 경우 bounded contextλ³„λ‘œ νŒ¨ν‚€μ§€ 뢄리

2. Facade νŒ¨ν„΄

λͺ©μ 

λ„λ©”μΈλ³„λ‘œ Serviceλ₯Ό λ‚˜λˆ„λ©΄μ„œ λ°œμƒν•˜λŠ” μ„œλΉ„μŠ€ κ°„ μ°Έμ‘° 문제λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ Facade 계측을 λ„μž…ν•¨.

μ—­ν• 

  • μ—¬λŸ¬ λ„λ©”μΈμ˜ Serviceλ₯Ό μ‘°μœ¨ν•˜μ—¬ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리
  • Controller와 Service μ‚¬μ΄μ˜ 쀑간 κ³„μΈ΅μœΌλ‘œ λ™μž‘
  • νŠΈλžœμž­μ…˜ 경계 μ„€μ • (ν•„μš” μ‹œ @Transactional 적용)

κ΅¬ν˜„ κ·œμΉ™

  • @Facade μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©
  • api/{domain}/facade νŒ¨ν‚€μ§€μ— μœ„μΉ˜
  • μ—¬λŸ¬ λ„λ©”μΈμ˜ Serviceλ₯Ό μ£Όμž…λ°›μ•„ μ‚¬μš© κ°€λŠ₯
  • DTO λ³€ν™˜ 둜직 포함 κ°€λŠ₯

μ˜ˆμ‹œ

@Facade
@RequiredArgsConstructor
public class SetlistFacade {

    private final SetlistService setlistService;
    private final SetlistEditService setlistEditService;
    private final UserService userService;  // λ‹€λ₯Έ λ„λ©”μΈμ˜ Service μ°Έμ‘°

    public SetlistCreateResponseDTO createSetLists(Long userId,
        List<SetlistCreateRequestDTO> requests) {
        User user = userService.findById(userId);  // UserService μ‚¬μš©
        return new SetlistCreateResponseDTO(
            setlistService.createSetLists(user, requests)  // SetlistService μ‚¬μš©
        );
    }
}

3. 도메인 λͺ¨λΈ 섀계

Entity 섀계

  • JPA Entity둜 도메인 λͺ¨λΈ κ΅¬ν˜„
  • λΆˆλ³€μ„±κ³Ό μΊ‘μŠν™”λ₯Ό μ€‘μ‹¬μœΌλ‘œ 섀계
  • Setter μ‚¬μš© μ΅œμ†Œν™” (ν•„μš”ν•œ κ²½μš°μ—λ§Œ @Setter λͺ…μ‹œ - μ‚¬μš© 이유 주석 ν•„μˆ˜)
  • Builder νŒ¨ν„΄ 및 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ μ‚¬μš© ꢌμž₯ (@Builder)
  • μƒμ„±μΌμž (created_at), μˆ˜μ •μΌμž (updated_at) μΆ”κ°€ ν•„μˆ˜
    • JpaAuditing μ‚¬μš©

ν…Œμ΄λΈ” 넀이밍

  • λ³΅μˆ˜ν˜• μ‚¬μš© (예: users, concerts, festivals)
  • μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€(snake_case) 적용: @Table(name = "table_name")

컬럼 넀이밍

  • μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€ 적용 (예: created_at, user_id)
  • λΆˆλ¦¬μ–Έ: is_ 접두사 μ‚¬μš© λΆˆν•„μš” (JPAλŠ” ν•„λ“œλͺ… κ·ΈλŒ€λ‘œ λ§€ν•‘)
  • Enum: @Enumerated(EnumType.STRING) μ‚¬μš© ꢌμž₯

ID 생성 μ „λž΅

  • @GeneratedValue(strategy = GenerationType.IDENTITY) μ‚¬μš©

연관관계

  • μ§€μ—° λ‘œλ”© μš°μ„  μ‚¬μš©: fetch = FetchType.LAZY
  • μ–‘λ°©ν–₯ 연관관계 μ‹œ 연관관계 편의 λ©”μ„œλ“œ μž‘μ„±
  • Cascade νƒ€μž…μ€ μ‹ μ€‘ν•˜κ²Œ μ„€μ •

감사(Auditing) ν•„λ“œ

  • @CreatedDate, @LastModifiedDate μ‚¬μš©
  • @EntityListeners(AuditingEntityListener.class) 적용

4. Repository 넀이밍 κ·œμΉ™

쑰회(Query)

  • findλ₯Ό 기본으둜 μ‚¬μš© (예: findById, findAllByUserId)
  • 단건 쑰회: findBy... ν˜•νƒœλ‘œ Optional λ°˜ν™˜
  • 닀건 쑰회: findAllBy... λ˜λŠ” findBy... ν˜•νƒœλ‘œ List λ°˜ν™˜
  • 쑴재 μ—¬λΆ€ 확인: existsBy... ν˜•νƒœλ‘œ boolean λ°˜ν™˜
  • 카운트: countBy... ν˜•νƒœλ‘œ long λ°˜ν™˜

μ €μž₯, μˆ˜μ •, μ‚­μ œ(Command)

  • μ €μž₯: save μ‚¬μš©
  • μˆ˜μ •: JPA의 Dirty Checking ν™œμš© (별도 λ©”μ„œλ“œ λΆˆν•„μš”)
  • μ‚­μ œ: delete λ˜λŠ” deleteById μ‚¬μš©

Repository ꡬ성

  • RepositoryλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ μ •μ˜ν•˜λ©° JpaRepository 상속
  • μ»€μŠ€ν…€ μΏΌλ¦¬λŠ” @Query μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©
  • RepositoryλŠ” domain/{domain}/infra/repository νŒ¨ν‚€μ§€μ— μœ„μΉ˜

5. Service 넀이밍 κ·œμΉ™

쑰회(Query)

  • get μ‚¬μš©μ„ ꢌμž₯ (예: getUserInfo, getSetlistDetail)
  • null 체크와 μ˜ˆμ™Έ 처리 ν•„μˆ˜
    • 예: repository.findById(id).orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND))
  • 리슀트 쑰회: getAll... ν˜•νƒœ μ‚¬μš© (예: getAllMySetlists)

μ €μž₯, μˆ˜μ •, μ‚­μ œ(Command)

  • 생성: create μ‚¬μš© (예: createSetList)
  • μˆ˜μ •: update λ˜λŠ” patch μ‚¬μš©
  • μ‚­μ œ: delete μ‚¬μš©

Service ꡬ성

  • @Service μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©
  • domain/{domain}/application νŒ¨ν‚€μ§€μ— μœ„μΉ˜
  • νŠΈλžœμž­μ…˜ 관리 ν•„μˆ˜ (μ•„λž˜ μ°Έμ‘°)

6. μ„œλΉ„μŠ€ 계측

νŠΈλžœμž­μ…˜ 관리

  • λͺ¨λ“  μ“°κΈ° μž‘μ—…μ— @Transactional 적용
  • 읽기 μ „μš© λ©”μ„œλ“œλŠ” @Transactional(readOnly = true) μ‚¬μš©
  • νŠΈλžœμž­μ…˜ κ²½κ³„λŠ” Service λ˜λŠ” Facade λ©”μ„œλ“œ λ‹¨μœ„λ‘œ μ„€μ •
  • κΈ°λ³Έ Propagation은 REQUIRED μ‚¬μš©

μ˜μ‘΄μ„± μ£Όμž…

  • μƒμ„±μž μ£Όμž… 방식 μ‚¬μš© (@RequiredArgsConstructor ν™œμš©)
  • μˆœν™˜ μ°Έμ‘° μ ˆλŒ€ κΈˆμ§€ (Facade νŒ¨ν„΄μœΌλ‘œ ν•΄κ²°)

μ˜ˆμ™Έ 처리

  • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™ΈλŠ” μ»€μŠ€ν…€ μ˜ˆμ™Έ 클래슀 μ‚¬μš©
  • ErrorMessage Enum을 ν™œμš©ν•˜μ—¬ μ˜ˆμ™Έ λ©”μ‹œμ§€ 관리

7. DTO와 데이터 λ§€ν•‘

DTO 섀계 원칙

  • λͺ¨λ“  DTOλŠ” λ°˜λ“œμ‹œ record 클래슀둜 μž‘μ„± (ν•„μˆ˜)
  • Request와 Response DTO 뢄리
  • DTOλŠ” λΆˆλ³€(immutable)ν•˜λ©° setter λ©”μ„œλ“œ μ ˆλŒ€ κΈˆμ§€
  • ν•„λ“œ 접근은 record의 μžλ™ 생성 accessor λ©”μ„œλ“œ μ‚¬μš© (예: id())

record 클래슀 μ‚¬μš©

// Request DTO μ˜ˆμ‹œ
public record LoginRequest(
        @NotBlank String provider,
        @NotBlank String idToken
    ) {

}

DTO μœ„μΉ˜

  • API μš”μ²­/응닡 DTO: api/{domain}/dto/request λ˜λŠ” api/{domain}/dto/response
  • Facade λ‚΄λΆ€ DTO: api/{domain}/facade/dto/request λ˜λŠ” api/{domain}/facade/dto/response
  • Domain Service λ‚΄λΆ€ DTO: domain/{domain}/application/dto

Validation

  • Request DTO에 Bean Validation μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš© (@NotNull, @NotBlank λ“±)
  • Controller λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ— @Valid 적용

8. μ»€μŠ€ν…€ μ–΄λ…Έν…Œμ΄μ…˜

@Permission

λͺ©μ 

API μ—”λ“œν¬μΈνŠΈμ— λŒ€ν•œ κΆŒν•œ 기반 μ ‘κ·Ό μ œμ–΄λ₯Ό μˆ˜ν–‰ν•¨.

μ‚¬μš© μœ„μΉ˜

  • Controller λ©”μ„œλ“œμ—λ§Œ 적용 κ°€λŠ₯ (@Target(ElementType.METHOD))

λ™μž‘ 방식

  1. HTTP μš”μ²­μ˜ Authorization ν—€λ”μ—μ„œ JWT 토큰 μΆ”μΆœ
  2. ν† ν°μ—μ„œ μ‚¬μš©μžμ˜ Role 정보 νŒŒμ‹±
  3. λ©”μ„œλ“œμ— μ§€μ •λœ ν—ˆμš© Roleκ³Ό λΉ„κ΅ν•˜μ—¬ μ ‘κ·Ό κΆŒν•œ 검증
  4. κΆŒν•œμ΄ μ—†μœΌλ©΄ FORBIDDEN μ˜ˆμ™Έ λ°œμƒ

속성

  • role: ν—ˆμš©ν•  Role λ°°μ—΄ (κΈ°λ³Έκ°’: Role.ONBOARDING)
    • Role.ONBOARDING: μ˜¨λ³΄λ”© 쀑인 μ‚¬μš©μž
    • Role.GENERAL: 일반 μ‚¬μš©μž
    • Role.ADMIN: κ΄€λ¦¬μž

μ‚¬μš© μ˜ˆμ‹œ

@Permission(role = {Role.GENERAL})
@GetMapping("/user/info")
public ResponseEntity<BaseResponse<UserInfoResponse>> getUserInfo(@UserId Long userId) {
    // Role.GENERAL κΆŒν•œμ„ κ°€μ§„ μ‚¬μš©μžλ§Œ μ ‘κ·Ό κ°€λŠ₯
}

@Permission(role = {Role.ONBOARDING, Role.GENERAL})
@PostMapping("/auth/reissue")
public ResponseEntity<BaseResponse<Token>> reissue(@RefreshToken String refreshToken) {
    // Role.ONBOARDING λ˜λŠ” Role.GENERAL κΆŒν•œμ„ κ°€μ§„ μ‚¬μš©μž μ ‘κ·Ό κ°€λŠ₯
}

API 응닡 μ½”λ“œ μ»¨λ²€μ…˜

API ν‘œμ€€ 응닡 μ½”λ“œ

μ½”λ“œ 응닡λͺ… μ‚¬μš© μš©λ„
200 OK μš”μ²­μ΄ μ •μƒμ μœΌλ‘œ 처리됨 (ApiResponseUtil.success() μ‚¬μš©)
201 Created λ¦¬μ†ŒμŠ€κ°€ μ„±κ³΅μ μœΌλ‘œ 생성됨 (ResponseEntity.created(uri).body() μ‚¬μš©)
204 No Content μš”μ²­ 성곡, λ°˜ν™˜ν•  μ½˜ν…μΈ  μ—†μŒ (ResponseEntity.noContent().build() μ‚¬μš©)
400 Bad Request 잘λͺ»λœ μš”μ²­ (@Valid 검증 μ‹€νŒ¨ λ“±)
401 Unauthorized 인증 ν•„μš” (JWT 토큰 검증 μ‹€νŒ¨)
403 Forbidden κΆŒν•œ μ—†μŒ (@Permission κΆŒν•œ 검증 μ‹€νŒ¨)
404 Not Found λ¦¬μ†ŒμŠ€ μ—†μŒ (Entity 쑰회 μ‹€νŒ¨)
405 Method Not Allowed μ§€μ›ν•˜μ§€ μ•ŠλŠ” HTTP λ©”μ„œλ“œ
409 Conflict λ¦¬μ†ŒμŠ€ μƒνƒœ 좩돌 (쀑볡 생성 μ‹œλ„ λ“±)
422 Unprocessable Entity 의미적 였λ₯˜ (λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™ μœ„λ°˜)
500 Internal Server Error μ„œλ²„ λ‚΄λΆ€ 였λ₯˜ (μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ)

Spring Boot μ—λŸ¬ μ½”λ“œ

ErrorMessage Enum

  • λͺ¨λ“  μ—λŸ¬ μ½”λ“œλŠ” ErrorMessage Enum으둜 관리
  • Enum 이름: UPPER_SNAKE_CASE μ‚¬μš©
  • λ©”μ‹œμ§€: ν•œκ΅­μ–΄λ‘œ μž‘μ„± (ν”„λ‘œμ νŠΈ μ •μ±…)

μ—λŸ¬ λ©”μ‹œμ§€ κ·œμΉ™

  • κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜κ²Œ: μ‚¬μš©μžκ°€ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ λ©”μ‹œμ§€ μž‘μ„±
  • μ‹€ν–‰ κ°€λŠ₯ν•œ 정보: κ°€λŠ₯ν•œ 경우 문제 해결에 도움이 λ˜λŠ” 정보 포함
  • 기술적 세뢀사항 μ œμ™Έ: κ΅¬ν˜„ μ„ΈλΆ€μ‚¬ν•­μ΄λ‚˜ μŠ€νƒ 트레이슀 λ…ΈμΆœ κΈˆμ§€

λΉ„μ¦ˆλ‹ˆμŠ€ μ˜ˆμ™Έ 클래슀

  • ErrorMessageλ₯Ό λ°›λŠ” μ˜ˆμ™Έ 클래슀λ₯Ό 각 상황에 맞게 κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©
  • 곡톡 μ˜ˆμ™Έ: ConfetiException (ν”„λ‘œμ νŠΈλͺ… 기반)
  • νŠΉμ • μ˜ˆμ™Έ: NotFoundException, UnauthorizedException, ConflictException λ“±

GlobalExceptionHandler

  • @RestControllerAdviceλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ—­ μ˜ˆμ™Έ 처리
  • 각 μ˜ˆμ™Έ νƒ€μž…λ³„λ‘œ @ExceptionHandler λ©”μ„œλ“œ μ •μ˜
  • μ˜ˆμ™Έ 정보λ₯Ό request attribute에 μ €μž₯ν•˜μ—¬ λ‘œκΉ… κ°€λŠ₯
  • ApiResponseUtil.failure()λ₯Ό μ‚¬μš©ν•˜μ—¬ μΌκ΄€λœ μ—λŸ¬ 응닡 생성

RDB μŠ€ν‚€λ§ˆ μ»¨λ²€μ…˜

ν…Œμ΄λΈ” 넀이밍

  • μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€(snake_case) 적용: μ†Œλ¬Έμžμ™€ μ–Έλ”μŠ€μ½”μ–΄ μ‘°ν•© (예: user_account)
  • λ³΅μˆ˜ν˜• μ‚¬μš© (예: users, concerts, festivals)

컬럼 넀이밍

  • μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€ 적용 (예: created_at, user_id)
  • λΆˆλ¦¬μ–Έ: is_ 접두사 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ (JPAλŠ” ν•„λ“œλͺ… κ·ΈλŒ€λ‘œ λ§€ν•‘)
  • 약어보닀 전체 단어 μ‚¬μš©: desc λŒ€μ‹  description ꢌμž₯
  • 데이터 νƒ€μž… μ‚¬μš© κΈˆμ§€: 컬럼 이름에 데이터 νƒ€μž… 포함 κΈˆμ§€ (예: text, int)
  • Enum 컬럼: VARCHAR νƒ€μž…μœΌλ‘œ Enum 이름 μ €μž₯ (@Enumerated(EnumType.STRING))

데이터 νƒ€μž…

μžλ™ 증가 μ‹λ³„μž

  • BIGINT + AUTO_INCREMENT (MySQL)
  • JPA: @GeneratedValue(strategy = GenerationType.IDENTITY)

ν…μŠ€νŠΈ 데이터

  • 짧은 ν…μŠ€νŠΈ: VARCHAR(n) (길이 μ œν•œμ΄ λͺ…ν™•ν•œ 경우)
  • κΈ΄ ν…μŠ€νŠΈ: TEXT νƒ€μž… μ‚¬μš© κ°€λŠ₯

νƒ€μž„μŠ€νƒ¬ν”„

  • created_at와 updated_atλŠ” ν•„μˆ˜λ‘œ ꡬ성
  • DATETIME λ˜λŠ” TIMESTAMP νƒ€μž… μ‚¬μš©
  • JPA: @CreatedDate, @LastModifiedDate μ‚¬μš©

연관관계 컬럼

  • μ™Έλž˜ν‚€ 컬럼: {μ°Έμ‘° ν…Œμ΄λΈ”λͺ…}_id ν˜•μ‹ (예: user_id, concert_id)
  • JPA: @JoinColumn(name = "...") λͺ…μ‹œ

인덱슀 넀이밍

  • 일반 인덱슀: idx_{table}_{column} (예: idx_user_email)
  • μœ λ‹ˆν¬ 인덱슀: uidx_{table}_{column}
  • 볡합 인덱슀: idx_{table}_{column1}_{column2}

Redis μ»¨λ²€μ…˜

Redis ꡬ성

  • Redis Sentinel을 μ‚¬μš©ν•œ κ³ κ°€μš©μ„± ꡬ성
  • Master-Slave 볡제 ꡬ쑰
  • Lettuce ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μš©
  • REPLICA_PREFERRED 읽기 μ „λž΅: Replica μš°μ„ , Replica λΆˆκ°€ μ‹œ Masterμ—μ„œ 읽기

μ„€μ •

  • Command Timeout, Connect Timeout, Shutdown Timeout μ„€μ • ν•„μˆ˜
  • μ—°κ²° 검증 ν™œμ„±ν™” (setValidateConnection(true))

μ‚¬μš© μš©λ„

  • Refresh Token 캐싱
  • μ„Έμ…˜ 데이터 μ €μž₯
  • μž„μ‹œ 데이터 캐싱

RedisTemplate μ‚¬μš©

  • Key와 Value λͺ¨λ‘ String 직렬화 μ‚¬μš©
  • μ»€μŠ€ν…€ 직렬화가 ν•„μš”ν•œ 경우 별도 μ„€μ •

Swagger μ»¨λ²€μ…˜

μ •μ±…

Docs μΈν„°νŽ˜μ΄μŠ€ νŒ¨ν„΄ (ν•„μˆ˜)

  • λͺ¨λ“  ControllerλŠ” λ°˜λ“œμ‹œ Docs μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방식 μ‚¬μš©
  • Controller와 API λ¬Έμ„œλ₯Ό λΆ„λ¦¬ν•˜μ—¬ 가독성 ν–₯상
  • μΈν„°νŽ˜μ΄μŠ€μ— Swagger μ–΄λ…Έν…Œμ΄μ…˜ μ •μ˜, ControllerλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—λ§Œ 집쀑

μ–Έμ–΄ κ·œμΉ™

  • API μ—”λ“œν¬μΈνŠΈ μ„€λͺ…은 ν•œκ΅­μ–΄λ‘œ μž‘μ„±
  • λ‚΄λΆ€ μ£Όμ„μ΄λ‚˜ μ½”λ“œ λ‚΄ μ„€λͺ…도 ν•œκ΅­μ–΄ μ‚¬μš© κ°€λŠ₯

OpenAPI μ„€μ • 클래슀

Swagger의 μ „λ°˜μ μΈ 섀정은 SwaggerConfig ν΄λž˜μŠ€μ—μ„œ 관리.

κΈ°λ³Έ μ„€μ •

  • API 정보 (제λͺ©, 버전, μ„€λͺ…, μ—°λ½μ²˜)
  • μ„œλ²„ URL (둜컬 개발, 운영 λ“±)
  • λ³΄μ•ˆ μŠ€ν‚€λ§ˆ (JWT Bearer 인증)

@Permission κΆŒν•œ 정보 μžλ™ μΆ”κ°€

  • addPermissionDescription λ©”μ„œλ“œλ‘œ API μ„€λͺ…에 ν•„μš” κΆŒν•œ μžλ™ μΆ”κ°€
  • 예: πŸ”’ **Required Permissions:** GENERAL

API λ¬Έμ„œ μž‘μ„± κ°€μ΄λ“œ

Docs μΈν„°νŽ˜μ΄μŠ€ νŒ¨ν„΄

1. Docs μΈν„°νŽ˜μ΄μŠ€ μž‘μ„±

api/{domain}/controller/docs/{ControllerName}Docs.java κ²½λ‘œμ— μΈν„°νŽ˜μ΄μŠ€ 생성

2. Controller κ΅¬ν˜„

Controller ν΄λž˜μŠ€μ—μ„œ Docs μΈν„°νŽ˜μ΄μŠ€λ₯Ό implementsν•˜μ—¬ κ΅¬ν˜„

κΈ°λ³Έ 원칙
  • μΈν„°νŽ˜μ΄μŠ€ ν™œμš© ν•„μˆ˜: Controller와 λ¬Έμ„œ 뢄리λ₯Ό μœ„ν•΄ λ°˜λ“œμ‹œ μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©
  • ν•œκ΅­μ–΄ μž‘μ„±: summary와 description은 ν•œκ΅­μ–΄λ‘œ μž‘μ„±
  • 응닡 μŠ€ν‚€λ§ˆ μ •μ˜: 응닡 데이터 클래슀λ₯Ό λͺ…μ‹œν•˜μ—¬ API ν˜ΈμΆœμžκ°€ λ°˜ν™˜κ°’ ꡬ쑰λ₯Ό μ‰½κ²Œ μ΄ν•΄ν•˜λ„λ‘ 함
  • 곡톡 μ—λŸ¬ 응닡: @AuthErrorResponses, @CommonErrorResponses λ“± μ»€μŠ€ν…€ μ–΄λ…Έν…Œμ΄μ…˜ ν™œμš©
μ—λŸ¬ 응닡 처리

곡톡 μ—λŸ¬ 응닡은 μ»€μŠ€ν…€ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ •μ˜ν•˜μ—¬ μž¬μ‚¬μš©μ„± ν–₯상


μ½”λ“œ μŠ€νƒ€μΌ 및 베슀트 ν”„λž™ν‹°μŠ€

λ©”μ„œλ“œ 길이

  • κ°€λŠ₯ν•œ 짧게 μž‘μ„± (30쀄 이내 ꢌμž₯)
  • λ³΅μž‘ν•œ λ‘œμ§μ€ private λ©”μ„œλ“œλ‘œ 뢄리

λ°˜λ“œμ‹œ μ§€μΌœμ•Όν•˜λŠ” 넀이밍 κ·œμΉ™ [[IMPORTANT]] [[MANDATORY]]

  • "λ…Έλž˜"λ₯Ό μ˜λ―Έν•˜λŠ” 경우 song 으둜 ν‘œκΈ°ν•΄μ•Ό 함.
    • 단, Apple Music API와 같은 μ„œλΉ„μŠ€λͺ…μ˜ music ν‚€μ›Œλ“œλŠ” μ˜ˆμ™Έ
  • μ˜ˆμ •λœμ˜ 의미λ₯Ό μ§€λ‹Œ 경우 Upcoming ν‚€μ›Œλ“œκ°€ λ©”μ„œλ“œ λͺ…, λ³€μˆ˜ λͺ…, 클래슀 λͺ…에 λ°˜λ“œμ‹œ λ“€μ–΄κ°€μ•Ό 함.