RESTful API는 Representational State Transfer(REST) 원칙을 따르는 API를 의미하며, 클라이언트와 서버 간의 상호작용을 구조화하는 아키텍처 스타일입니다. REST는 리소스를 표현하고 상태를 전달하는 HTTP 프로토콜을 기반으로 한 웹 서비스를 설계하는 방식입니다.
REST 아키텍처는 다음의 주요 원칙을 기반으로 합니다:
클라이언트-서버 구조 (Client-Server Architecture): 클라이언트와 서버는 명확히 분리되어 동작하며, 클라이언트는 사용자 인터페이스를 담당하고 서버는 데이터와 로직을 담당합니다.
상태 비저장성 (Statelessness): 클라이언트의 각 요청은 독립적이며, 서버는 요청 간 상태를 유지하지 않습니다. 모든 요청은 필요한 정보를 포함하여야 하며, 서버는 요청을 처리하고 응답합니다.
캐시 가능성 (Cacheability): 서버의 응답은 캐시될 수 있어야 하며, 이를 통해 클라이언트는 동일한 요청에 대해 서버를 반복적으로 요청하지 않고 성능을 향상시킬 수 있습니다.
계층화된 시스템 (Layered System): 클라이언트는 서버와 직접 상호작용하는 것이 아니라 중간 계층(예: 프록시, 로드 밸런서)을 통해 상호작용할 수 있으며, 이러한 계층화된 구조로 복잡한 시스템을 구축할 수 있습니다.
인터페이스 일관성 (Uniform Interface): 리소스와 상호작용하는 방식이 일관적이어야 하며, 모든 리소스는 고유한 URI로 식별됩니다.
REST는 2000년에 로이 필딩(Roy Fielding)이 그의 박사 논문에서 제시한 개념으로, 당시에는 웹 서비스가 복잡하고 비효율적이라는 문제가 있었습니다. SOAP와 같은 기존 웹 서비스는 구조적으로 복잡하고 확장성이 부족했기 때문에, 이러한 문제를 해결하기 위해 REST가 탄생했습니다. REST는 기존의 HTTP 프로토콜을 최대한 활용하여 단순하고 확장 가능한 아키텍처를 제공함으로써 더 나은 웹 서비스 설계를 가능하게 했습니다.
REST는 점차 웹 API 설계의 표준으로 자리 잡았으며, 특히 웹과 모바일 애플리케이션이 급격히 성장함에 따라 RESTful API가 널리 사용되었습니다. 클라우드 컴퓨팅과 마이크로서비스 아키텍처의 등장으로 인해 REST는 대규모 시스템에서 데이터 교환 및 통합의 핵심 역할을 하게 되었습니다.
RESTful API는 많은 장점을 가지고 있지만, 몇 가지 문제점도 존재합니다:
RESTful API는 다양한 곳에서 사용됩니다:
RESTful API를 제작하는 과정은 간단합니다:
리소스 설계: API가 다룰 리소스를 결정합니다. 예를 들어, '사용자', '게시물', '댓글' 등의 리소스를 생각할 수 있습니다.
URI 설계: 각 리소스는 고유한 URI로 식별되어야 합니다. URI는 명확하고 일관되게 설계되어야 하며, 일반적으로 소문자와 하이픈(-)을 사용합니다.
/users, /posts, /commentsHTTP 메서드 정의: 각 리소스에 대해 적절한 HTTP 메서드를 사용합니다.
GET /users: 모든 사용자 정보 조회POST /users: 새 사용자 생성PUT /users/{id}: 특정 사용자 정보 업데이트DELETE /users/{id}: 특정 사용자 삭제상태 코드 사용: 각 요청의 처리 결과를 알리기 위해 HTTP 상태 코드를 반환합니다.
RESTful API 설계 시 URI는 리소스를 명확하게 나타내고, 일관성을 유지해야 합니다. 주요 규칙은 다음과 같습니다:
소문자 사용: URI는 소문자로 작성합니다. 대문자는 혼동을 일으킬 수 있습니다.
/Users/123/users/123하이픈 사용: URI 내 단어 구분은 하이픈을 사용합니다.
/user_profile/user-profile명사 사용: 리소스를 나타내는 URI는 명사로 작성하며, 동사는 HTTP 메서드로 표현합니다.
/getUser/users복수형 사용: 리소스를 나타내는 URI는 복수형 명사를 사용합니다.
/user/usersHTTP 메서드와 일관성: 적절한 HTTP 메서드를 사용하여 URI의 의미를 명확히 합니다.
GET /posts: 모든 게시물 조회POST /posts: 새 게시물 생성PUT /posts/{id}: 특정 게시물 수정DELETE /posts/{id}: 특정 게시물 삭제GET /users
응답:
[
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
},
{
"id": 2,
"name": "Jane Smith",
"email": "jane@example.com"
}
]
POST /users
요청 본문:
{
"name": "Alice",
"email": "alice@example.com"
}
응답:
{
"id": 3,
"name": "Alice",
"email": "alice@example.com"
}
PUT /users/1
요청 본문:
{
"name": "John Doe Updated",
"email": "johnupdated@example.com"
}
응답:
{
"id": 1,
"name": "John Doe Updated",
"email": "johnupdated@example.com"
}
DELETE /users/1
응답: 204 No Content