네트워크/HTTP

RESTful API 종합 가이드: 설계부터 구현까지

shimdh 2025. 3. 4. 09:56
728x90

1. API와 REST 아키텍처의 이해

1.1 API의 개념과 역할

API(Application Programming Interface)는 소프트웨어 시스템 간의 상호작용을 정의하는 규약입니다.

주요 특징

  • 추상화된 인터페이스 제공
  • 시스템 간 독립성 보장
  • 표준화된 데이터 교환 방식
  • 보안과 접근 제어 기능

1.2 REST 아키텍처의 기본 원칙

REST(Representational State Transfer)는 로이 필딩(Roy Fielding)이 2000년 박사학위 논문에서 제안한 아키텍처 스타일입니다.

핵심 제약 조건

  1. 클라이언트-서버 구조

    • 관심사의 분리
    • 독립적인 진화 가능
    • 확장성 향상
  2. 무상태성(Statelessness)

    • 각 요청은 완전한 정보 포함
    • 세션 정보 불필요
    • 서버 확장성 증가
  3. 캐시 가능성(Cacheability)

    • 응답은 캐시 가능 여부 명시
    • 클라이언트 측 캐시 활용
    • 서버 부하 감소
  4. 계층화 시스템(Layered System)

    • 중간 계층 추가 가능
    • 보안, 로드 밸런싱 구현
    • 레거시 시스템 캡슐화
  5. 통일된 인터페이스(Uniform Interface)

    • 리소스 식별
    • 표현을 통한 리소스 조작
    • 자기 서술적 메시지
    • HATEOAS (Hypermedia as the Engine of Application State)

2. RESTful API 설계 원칙과 모범 사례

2.1 리소스 명명 규칙

  • 명사 사용

    • /users (O)
    • /getUsers (X)
  • 계층 구조 표현

    • /users/{id}/orders
    • /departments/{id}/employees
  • 복수형 사용

    • /products
    • /categories

2.2 HTTP 메서드의 적절한 활용

GET

GET /api/products           # 제품 목록 조회
GET /api/products/123      # 특정 제품 조회
GET /api/products?category=electronics&sort=price   # 필터링과 정렬

POST

POST /api/products
Content-Type: application/json

{
    "name": "스마트폰",
    "price": 1000000,
    "description": "최신형 스마트폰",
    "category": "electronics",
    "specifications": {
        "color": "black",
        "storage": "256GB",
        "screen": "6.7inch"
    }
}

PUT

PUT /api/products/123
Content-Type: application/json

{
    "name": "고급 스마트폰",
    "price": 1200000,
    "status": "in_stock"
}

PATCH

PATCH /api/products/123
Content-Type: application/json

{
    "price": 1100000
}

DELETE

DELETE /api/products/123

2.3 상태 코드의 올바른 사용

성공 응답

  • 200 OK: 요청 성공
  • 201 Created: 리소스 생성 성공
  • 204 No Content: 성공했지만 반환할 컨텐츠 없음

클라이언트 오류

  • 400 Bad Request: 잘못된 요청
  • 401 Unauthorized: 인증 필요
  • 403 Forbidden: 권한 없음
  • 404 Not Found: 리소스 없음
  • 409 Conflict: 리소스 충돌

서버 오류

  • 500 Internal Server Error: 서버 내부 오류
  • 502 Bad Gateway: 게이트웨이 오류
  • 503 Service Unavailable: 서비스 이용 불가

3. 고급 RESTful API 기능

3.1 페이지네이션

GET /api/products?page=2&size=20

응답 예시:

{
    "items": [...],
    "pagination": {
        "currentPage": 2,
        "totalPages": 10,
        "totalItems": 198,
        "itemsPerPage": 20
    }
}

3.2 필터링과 검색

GET /api/products?category=electronics&minPrice=500000&maxPrice=1500000
GET /api/products?search=smartphone&brand=samsung

3.3 정렬

GET /api/products?sort=price:desc,name:asc

3.4 관계 처리

GET /api/orders/123?include=customer,items

4. 보안과 인증

4.1 인증 방식

  • JWT (JSON Web Tokens)

    GET /api/secure-resource
    Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
  • OAuth 2.0

    GET /api/oauth/authorize?
      response_type=code&
      client_id=CLIENT_ID&
      redirect_uri=CALLBACK_URL&
      scope=read,write

4.2 CORS 처리

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

5. 성능 최적화

5.1 캐싱 구현

Cache-Control: max-age=3600
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

5.2 압축

Accept-Encoding: gzip, deflate
Content-Encoding: gzip

5.3 부분 응답

GET /api/products/123?fields=id,name,price

6. 버전 관리

6.1 URI 버전닝

/api/v1/products
/api/v2/products

6.2 헤더 기반 버전닝

Accept: application/vnd.company.api-v1+json

7. 에러 처리

7.1 표준화된 에러 응답

{
    "status": 400,
    "code": "INVALID_INPUT",
    "message": "제품 가격은 0보다 커야 합니다",
    "details": {
        "field": "price",
        "value": -100,
        "constraint": "positive"
    },
    "timestamp": "2024-02-09T12:00:00Z"
}

결론

RESTful API는 현대 웹 서비스의 핵심 구성 요소입니다. 위에서 설명한 설계 원칙과 모범 사례를 따르면 확장 가능하고, 유지보수가 용이하며, 사용하기 쉬운 API를 구축할 수 있습니다. 특히 다음 사항들을 항상 고려해야 합니다:

  • 명확한 리소스 모델링
  • 적절한 HTTP 메서드 사용
  • 일관된 명명 규칙
  • 효과적인 에러 처리
  • 적절한 보안 메커니즘
  • 성능 최적화

이러한 원칙들을 준수하면서도 실제 요구사항과 제약사항에 맞게 유연하게 적용하는 것이 중요합니다.

728x90