RESTful API의 실체 해부: 엔드포인트와 리소스에 대한 깊은 탐구

Representational State Transfer (REST)은 API가 작동해야 하는 방식에 대한 지침을 제공하는 소프트웨어 아키텍처 스타일입니다. REST는 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌습니다. REST는 따르면 확장 가능하고 효율적이며 유지 보수가능한 웹 서비스를 만들 수 있도록 하는 원칙과 제약 조건의 집합입니다.

RESTful APIs, 또는 REST APIs,는 웹 서비스를 디자인하고 상호 작용하는 데 REST 아키텍처 스타일을 따르는 API입니다. 두 개 이상의 소프트웨어 또는 애플리케이션 간에 데이터를 통신하고 공유하기 위해 API를 사용하는 것 외에도, RESTful API는 웹 애플리케이션의 효율성, 확장성, 유연성에 기여하여 웹 개발에서 중요한 역할을 합니다. 웹 개발 측면에서 RESTful API의 다른 장점으로는 상태 무상성, 호환성 및 상호 운용성, 통합의 간소화, 개선된 보안, 간결함 등이 있습니다.

RESTful API가 작동하는 데 중요한 두 가지 핵심 개념은: 엔드포인트와 리소스

  • 리소스: 리소스는 식별, 명명 및 조작할 수 있는 모든 정보입니다. API를 통해 노출되는 주요 추상화 요소입니다.

  • 엔드포인트: 엔드포인트는 클라이언트가 API와 상호 작용할 수 있는 리소스 또는 리소스 집합을 나타내는 액세스 포인트 또는 특정 URL(Uniform Resource Locator) 또는 URI입니다.

RESTful 아키텍처의 주요 원칙 또는 REST 제약 조건은 RESTful 아키텍처를 종합적으로 정의하고 이러한 제약 조건을 준수하는 웹 서비스의 설계를 안내합니다. 이러한 원칙은 다음을 포함합니다:

  • 무상태성: 클라이언트에서 서버로의 모든 요청은 요청을 이해하고 처리하는 데 필요한 모든 정보를 포함해야 합니다. 무상태성은 확장성을 향상시키고 서버 구현을 단순화합니다.

  • 일관된 인터페이스: URL에 의한 리소스 식별, 표현에 의한 리소스 조작, 자체 기술 메시지, 그리고 하이퍼미디어를 통한 클라이언트와 애플리케이션 간의 상호작용과 같은 하위 제약 조건은 HATEOAS(Hypermedia as the Engine of Application State)로 알려진 방식으로 일관된 인터페이스를 가능하게 합니다.

  • 클라이언트-서버 아키텍처: RESTful 시스템은 클라이언트와 서버가 네트워크를 통해 통신하는 구조를 따릅니다. 클라이언트는 사용자 인터페이스와 사용자 경험에 책임을 지고, 서버는 요청을 처리하고 리소스를 관리하며 응용 프로그램의 비즈니스 로직을 유지하는 역할을 합니다. 이러한 역할 분리는 확장성과 유연성을 향상시킵니다.

  • 계층화된 시스템: REST 아키텍처에서는 각 계층이 특정 기능을 갖는 여러 계층이 있습니다. 각 계층은 인접한 계층과 상호 작용하여 모듈화와 확장성을 촉진합니다.

  • 코드 온 디맨드: 이 원칙은 클라이언트 응용 프로그램이 서버에서 제공하는 코드를 로드하고 실행할 수 있는 방법을 제공하여 클라이언트의 기능을 향상시킵니다. “코드 온 디맨드”는 유연성을 제공할 수 있지만, 모든 시나리오에 항상 적합하지는 않으며 보안 문제와 클라이언트와 서버 간의 결합도가 증가할 수 있는 가능성으로 인해 적합하지 않을 수 있습니다. “코드 온 디맨드”를 사용할지 여부는 개발 중인 응용 프로그램의 구체적인 요구 사항과 제약 사항에 따라 결정됩니다.

  • 캐시 가능성: 캐시 가능성은 클라이언트가 이전에 검색한 표현을 재사용할 수 있도록하여 서버에 반복적인 요청이 줄어들어 성능을 향상시킵니다.

엔드포인트은 리소스에서 수행되는 기능 또는 작업을 정의합니다. 예를 들어 항목 목록을 가져오거나 새 항목을 만들거나 기존 항목을 업데이트하거나 항목을 삭제하는 것 등이 있습니다. RESTful API는 종종 동일한 리소스에서 다른 작업을 수행하거나 다른 리소스와 작업하기 위해 여러 엔드포인트를 가지고 있습니다.

엔드포인트는 API의 설계에서 중요한 역할을 합니다. 클라이언트가 API와 상호 작용하는 접근점으로 기능을 제공합니다. API 설계에서 중요한 몇 가지 엔드포인트는 다음과 같습니다:

  • 리소스 노출: 엔드포인트는 API에 의해 노출된 리소스 또는 리소스 모음을 정의하며, 각 엔드포인트는 특정 리소스 또는 리소스 집합을 정의하여 클라이언트가 상호 작용할 수 있는 리소스 또는 리소스 집합을 명확하게합니다.

  • 작업 정의: 엔드포인트는 클라이언트가 리소스에서 수행할 수 있는 작업을 지정합니다. GET, POST, PUT, DELETE와 같은 HTTP 메서드가 작업을 정의하는 데 사용됩니다.

  • 모듈화 및 확장성: 엔드포인트는 특정 리소스나 리소스 집합과 관련된 특정 기능을 요약함으로써 모듈화를 촉진합니다. 모듈화는 API의 유지보수성을 향상시키고 확장 가능한 개발을 가능하게 합니다.

  • 명확하고 직관적인 디자인: 엔드포인트에 의미 있는 이름 규칙을 선택함으로써 개발자는 각 엔드포인트의 목적과 기능을 쉽게 이해할 수 있으며, 이는 API의 명확성과 직관성 있는 디자인에 기여합니다.

기능 및 지원하는 작업 유형에 따라 분류된 다양한 종류의 엔드포인트가 있습니다. 일부 다른 종류는 다음과 같습니다:

  • 읽기 및 검색 엔드포인트: HTTP GET 방법을 사용하여 서버에서 리소스를 검색하는 데 사용됩니다.

  • 생성 또는 POST 엔드포인트: HTTP POST 방법을 사용하여 서버에 새로운 리소스를 생성하는 데 사용됩니다

  • 삭제 엔드포인트: HTTP DELETE 방법을 사용하여 서버에서 리소스를 삭제하는 데 사용됩니다.

  • 업데이트 또는 PUT 엔드포인트: HTTP PUT 방법을 사용하여 서버의 기존 리소스를 업데이트하는 데 사용됩니다.

  • 검색 또는 쿼리 엔드포인트: HTTP GET 방법을 사용하여 지정된 기준에 따라 리소스 하위 집합을 검색할 수 있습니다.

  • 목록 엔드포인트: HTTP GET 방법을 사용하여 리소스의 컬렉션 또는 목록을 검색합니다.

자원은 식별, 명명 및 조작할 수 있는 모든 정보를 나타내는 주요 추상화입니다. 자원의 예에는 사용자 프로필, 기사 및 응용 프로그램이 다루는 기타 데이터 엔티티가 포함됩니다. 자원은 고유한 URI(Uniform Resource Identifier)로 식별될 수 있습니다. 일반적으로 JSON 또는 XML 형식이며, 각 자원은 표준 HTTP 메서드를 사용하여 생성, 검색, 업데이트 및 삭제할 수 있습니다.

RESTful 아키텍처를 구축하는 기반은 해당 자원을 식별하는 것입니다. API 설계에서 자원을 식별하는 데 대한 주요 지침 중 일부는 다음과 같습니다:

  • 자원 이름에 명사 사용: 자원 이름에 “get” 또는 “retrieve”와 같은 동사 대신 “users” 또는 “products”와 같은 명사를 사용하십시오.

  • 자원 명명 규칙: 자원에 일관된 명명 규칙을 따르십시오. 이해하기 쉽고 기억하기 쉬운 이름을 사용해야 합니다.

  • 자원 집합에 복수 명사 사용: 예를 들어 ‘/users’는 사용자 자원의 집합이고 ‘/products’는 제품 자원의 집합입니다.

  • 문서화: API는 사용자가 사용 가능한 자원을 이해하고 이와 상호 작용하는 방법을 파악할 수 있도록 명확하게 문서화되어야 합니다.

자원과 엔드포인트 간의 관계는 RESTful API의 설계와 기능에 기본적입니다. 그들 사이의 일부 관계는 다음과 같습니다:

  • 엔드포인트는 접근 지점: 엔드포인트는 자원이나 자원 집합에 해당하는 특정 URI 또는 URL입니다. 클라이언트가 자원과 상호 작용할 수 있는 구체적인 접근 지점을 제공합니다.

  • 엔드포인트는 자원을 식별합니다: 엔드포인트는 자원이나 자원 집합을 식별합니다. 예를 들어 사용자를 나타내는 자원이 있는 경우, 엔드포인트는 ‘/users’일 수 있습니다.

  • HTTP 메소드는 작업을 정의합니다: 엔드포인트는 특정 HTTP 메소드(GET, POST, PUT, DELETE 등)와 관련되어 있습니다. 이는 해당 리소스에서 수행할 수 있는 작업을 정의합니다.

  • 리소스 표현: 클라이언트가 상호 작용할 때 엔드포인트는 서버와 리소스의 표현을 교환합니다. 이러한 표현은 JSON 또는 XML과 같은 다양한 형식으로 제공될 수 있으며, 리소스에 대한 상태 또는 정보를 포함합니다. 이 표현은 HTTP 요청 또는 응답의 페이로드입니다.

  • 일관된 인터페이스: 리소스와 엔드포인트 간의 관계는 REST의 일관된 인터페이스 제약 조건을 준수합니다. 리소스와 엔드포인트의 조합은 일관되고 예측 가능한 API 구조를 만듭니다.

  • HATEOAS (애플리케이션 상태의 엔진으로서의 하이퍼미디어): 리소스 표현에 하이퍼미디어 링크를 포함하여 클라이언트가 API를 동적으로 탐색할 수 있게 합니다.

리소스와 엔드포인트 간의 상호 작용은 통합되고 효율적인 아키텍처를 개발하기 위한 RESTful API 설계에서 중요합니다. 개념적 엔티티를 나타내는 리소스는 사용자나 제품과 같은 시스템의 중요 엔티티를 정의합니다. URI로 표현되는 엔드포인트는 클라이언트가 지정된 HTTP 메서드를 통해 이러한 리소스와 상호 작용할 수 있는 게이트웨이 역할을 합니다. RESTful 원칙을 따르면 이 상호 작용 관계는 균일한 인터페이스, 자체 기술적인 통신, 그리고 하이퍼미디어 링크 (HATEOAS)를 통한 동적 탐색을 보장합니다. 리소스와 엔드포인트의 신중한 조정은 기술적인 세부 사항 이상으로, API의 명확성, 확장성, 적응성을 구동하는 디자인 컨셉입니다. 이는 개발자와 사용자 모두에게 매끄럽고 직관적인 경험을 제공하며, 이는 API의 선명성, 확정성, 적응성을 보장합니다.

Source:
https://inioluwa2003.hashnode.dev/demystifying-restful-apis-a-deep-dive-into-endpoints-and-resources