REST와 HTTP 메서드

2024. 12. 30. 19:17CS

REST(Representational State Transfer)는 웹에서 사용되는 API 설계 아키텍처 스타일이야.

간단히 말하면, 클라이언트와 서버가 자원을 요청하고 전달하는 방식을 정의한 거야.

 

REST의 핵심 원칙

  1. 자원의 표현 (Resource Representation)
    • 자원은 URI(Uniform Resource Identifier)로 식별돼.
      예: https://example.com/users/123 → 특정 유저 자원을 가리킴.
    • 자원은 JSON, XML, HTML 등 표현 형식으로 전달됨. 요즘은 JSON이 가장 많이 쓰여.
  2. HTTP 메서드를 활용
    • REST는 HTTP 메서드를 사용해서 자원에 대한 동작을 명확히 함.
    • HTTP 주요 메서드:
      • GET: 자원 조회
      • POST: 자원 생성
      • PUT: 자원 전체 수정
      • PATCH: 자원 일부 수정
      • DELETE: 자원 삭제
  3. 무상태성 (Statelessness)
    • 서버는 클라이언트의 상태를 저장하지 않아.
      모든 요청은 독립적이고, 필요한 정보는 요청에 포함돼야 해.
      예: 인증 정보는 매번 요청에 포함해야 함.
  4. 계층적 구조 (Layered System)
    • 클라이언트는 서버와 직접적으로 통신하는지, 프록시를 거치는지 몰라.
      이런 구조는 확장성과 보안성을 높이는 데 도움을 줘.
  5. 캐시 가능 (Cacheable)
    • 응답 데이터는 캐싱될 수 있어야 해.
      클라이언트는 응답에 포함된 캐시 관련 정보를 활용해 요청을 줄일 수 있어.

 

REST API 설계의 좋은 예

  • 자원의 경로는 명사를 사용하고 복수형으로 설계함.
    • GET    /users          → 모든 사용자 조회
    • GET    /users/123      → ID가 123인 사용자 조회
    • POST   /users          → 새로운 사용자 생성
    • PUT    /users/123      → ID가 123인 사용자 수정
    • DELETE /users/123      → ID가 123인 사용자 삭제
  • HTTP 상태 코드를 활용해 요청 결과를 표현함.
    • 200 OK: 성공
    • 201 Created: 생성 성공
    • 400 Bad Request: 잘못된 요청
    • 404 Not Found: 자원 없음
    • 500 Internal Server Error: 서버 오류

 

REST의 장점과 단점

 

장점

  • 표준 HTTP 프로토콜을 사용하므로, 범용적이고 언어 독립적이야.
  • 구조가 단순하고 명확해서 이해하기 쉬워.
  • 캐싱을 활용하면 성능 최적화 가능.

단점

  • 요청마다 인증 정보를 보내야 해서 오버헤드가 있을 수 있어.
  • 복잡한 트랜잭션 처리에는 적합하지 않을 수 있어.
  • 무상태성 때문에 클라이언트가 더 많은 정보를 처리해야 할 때도 있어.

 
 
 

HTTP 메서드 

  • HTTP 메서드는 클라이언트가 서버에게 어떤 작업을 요청하는지 알려주는 역할을 해.
  • HTTP(Hypertext Transfer Protocol)는 웹에서 클라이언트와 서버 간의 데이터 전송을 위한 규약이기 때문에, HTTP 메서드는 웹 서버와 클라이언트 간의 요청과 응답을 처리할 때 기본적으로 사용되는 방법이야.
  • REST API에서는 주로 HTTP 메서드를 활용해서 자원(Resource)에 대해 다양한 작업을 수행하지.
  • 그러나 HTTP 메서드는 REST 방식에만 제한된 것이 아니라 HTTP 통신을 사용하는 모든 상황에서 사용돼! 
    • 웹 페이지 로드 (웹 브라우징): 웹사이트를 방문할 때 대부분 GET 요청을 사용해서 페이지를 가져오지.
    • 파일 업로드: 파일을 서버로 업로드할 때 POST 요청을 사용해서 데이터를 서버에 전송하지.
    • API 요청: REST API는 HTTP 메서드를 사용하지만, SOAP, GraphQL 같은 다른 API 스타일에서도 HTTP 메서드를 사용할 수 있어.

 

주요 HTTP 메서드 정리

1. GET

  • 자원을 조회할 때 사용해.
  • 서버에서 데이터를 가져오지만, 데이터를 변경하지 않아.
  • 예:서버는 ID가 123인 사용자 정보를 반환.
  • 특징: 요청에 Body가 없음, 캐싱이 가능해서 성능 최적화에 유리함.

2. POST

  • 새로운 자원을 생성할 때 사용해.
  • 주로 클라이언트가 서버에 데이터를 전송하여 새로 추가함.
  • 예:서버는 새로운 사용자 데이터를 저장하고, 생성된 자원의 ID를 반환할 수 있어.
  • 특징: 요청에 Body를 포함, 같은 요청을 반복하면 자원이 중복 생성될 수 있어(idempotent하지 않음).

3. PUT

  • 자원을 완전히 대체하거나 업데이트할 때 사용해.
  • 자원의 전체를 수정하므로, 누락된 필드는 삭제될 수 있어.
  • 예:ID가 123인 사용자의 정보를 완전히 대체.
  • 특징: 요청에 Body를 포함, 같은 요청을 반복해도 결과가 같음(idempotent).

4. PATCH

  • 자원의 일부만 수정할 때 사용해.
  • PUT과 달리 전체가 아닌 일부 속성만 변경 가능.
  • 예:ID가 123인 사용자의 이메일만 업데이트.
  • 특징: PUT보다 효율적이며, 수정하려는 데이터만 전송.

5. DELETE

  • 자원을 삭제할 때 사용해.
  • 예:ID가 123인 사용자를 삭제.
  • 특징: 요청에 Body를 포함하지 않음, 요청을 반복해도 결과는 같음(idempotent).

 

그 외 메서드 (잘 쓰이진 않지만 알아두면 좋아)

6. HEAD

  • GET과 유사하지만, 응답 본문(Body)이 없음.
  • 요청한 자원이 존재하는지 확인하거나, 메타데이터(헤더)만 필요할 때 사용.
  • 예: 웹사이트 상태 체크.

7. OPTIONS

  • 서버가 지원하는 HTTP 메서드 목록을 반환.
  • API가 어떤 작업을 허용하는지 확인할 때 사용.

8. TRACE

  • 요청이 서버에 도달했는지 추적할 때 사용.
  • 보안 이슈 때문에 거의 사용되지 않아.

9. CONNECT

  • 클라이언트와 서버 간의 터널링을 설정할 때 사용.
  • 주로 HTTPS 연결을 위해 프록시 서버에서 사용.

 

RESTful API 설계에서 URI와 HTTP 메서드의 조합

RESTful API 설계에서는

URI를 사용해서 특정 자원을 식별하고,

HTTP 메서드를 통해 그 자원에 대해 어떤 작업을 할지 결정해.

 

RESTful API 설계에서는 HTTP 메서드와 URI를 조합해서 명확하고 직관적인 API를 만들 수 있어.

메서드 URI 설명
GET /users 모든 사용자 조회
GET /users/123 ID가 123인 특정 사용자 조회
POST /users 새로운 사용자 생성
PUT /users/123 ID가 123인 특정 사용자 전체 수정
PATCH /users/123 ID가 123인 특정 사용자 일부 수정
DELETE /users/123 ID가 123인 특정 사용자 삭제
 

참고: URI와 URL

  • URI (Uniform Resource Identifier)
    • URI는 자원의 고유 식별자야.
    • URI는 자원을 식별할 수 있는 방법을 제공해. 자원이 어디에 있는지, 어떻게 접근할 수 있는지까지는 포함하지 않아.
  • URL (Uniform Resource Locator)
    • URL은 URI의 한 종류로, 자원의 위치와 접근 방법까지 포함해.
    • 즉, URL은 자원의 위치(주소)와 그 자원에 접근하기 위한 방법(예: HTTP, FTP 등)을 포함한 URI야.
    • 모든 URL은 URI이지만, 모든 URI가 URL은 아냐. URL은 URI의 구체적인 형태라고 생각하면 돼. 
  • 차이점
    • URI는 자원의 식별자에 초점을 맞춰, "이 자원이 무엇인지" 알려줘.
    • URL은 자원의 위치와 접근 방법까지 포함해서, "이 자원을 어떻게 찾을 수 있을지" 알려줘.
URI: 고유 식별자  URL: 위치와 접근 방법을 포함한 식별자 
/users/123

"ID가 123인 사용자"라는 자원을 식별하는 방법
https://example.com/users/123

"https" 프로토콜
을 사용해, 
"example.com" 서버에서 
"users/123" 자원에 접근하겠다
/products/456 

"제품 ID가 456인 제품"을 식별하는 방법
http://example.com/products/456

HTTP 프로토콜을 사용하여 
"example.com" 서버에서
"456번 제품"에 접근하겠다 
/images/logo.png

"logo.png"라는 이미지를 식별하는 방법
ftp://files.example.com/images/logo.png

FTP 프로토콜
을 사용해서 
"files.example.com" 서버에서 
"images/logo.png" 이미지를 다운로드하겠다