API URI(Uniform Resource Identifier) 설계는 웹 API 개발에서 중요한 부분이다. 잘 설계된 URI는 리소스에 대한 쉬운 접근, 직관적인 경로 이해 및 효율적인 네트워크 통신을 가능하게 한다. URI는 API의 엔드포인트를 식별하며, 리소스 중심의 구조를 따라야 한다. 다음은 API URI 설계의 기본 원칙과 좋은 예시들을 소개한다.
URI 설계의 기본 원칙
- 명확성과 간결성: URI는 간결하고 이해하기 쉬워야 한다. 불필요한 길이나 복잡성은 피하고, 리소스를 명확하게 식별할 수 있어야 한다.
- 리소스 중심: 각 URI는 특정 리소스 또는 리소스 집합에 대응되어야 한다. 리소스는 명사로 표현되며, 동작은 HTTP 메소드(GET, POST, PUT, DELETE)로 표현한다.
- 계층적 구조: 리소스 간의 관계를 계층적으로 표현한다. 예를 들어, /users/123/posts는 사용자 123의 게시물을 나타낸다.
- 가독성: 가능한 한 URI는 읽기 쉬워야 한다. 이는 API의 사용성을 향상시키고, 개발자가 API를 더 쉽게 이해하고 사용할 수 있게 한다.
- 일관성: URI 구조 전체에서 일관성을 유지해야 한다. 예를 들어, 항상 복수형 명사를 사용하거나, 특정 리소스에 대한 접근 방식을 통일한다.
좋은 API URI 예시
- 단일 리소스 조회: /users/123 - 사용자 123의 세부 정보를 조회한다.
- 리소스 집합 조회: /users - 모든 사용자의 목록을 조회한다.
- 리소스 생성: POST 요청을 /users에 보내 새 사용자를 생성한다.
- 리소스 삭제: DELETE 요청을 /users/123에 보내 사용자 123을 삭제한다.
- 리소스 내의 서브 컬렉션 조회: /users/123/posts - 사용자 123의 모든 게시물을 조회한다.
API 버전 관리
API URI 설계 시 버전 관리도 중요하다. URI 경로에 API 버전을 포함시켜, API가 업데이트되어도 이전 버전과의 호환성을 유지할 수 있도록 한다. 예: /v1/users, /v2/users
잘 설계된 API URI는 API의 이해도를 높이고, 개발자가 API를 더 쉽게 통합하도록 돕는다. 이를 통해 API의 유지 보수성, 확장성 및 사용성이 향상된다.
1. GET
GET 메서드는 서버로부터 정보를 조회하는 데 사용된다. 이 메서드는 데이터를 가져오는 데 사용되며, 데이터를 변경하지 않는다. URL에 쿼리스트링을 포함시켜 요청을 구체화할 수 있다.
2. POST
POST 메서드는 서버에 데이터를 제출하여 리소스를 생성하거나 업데이트하기 위해 사용된다. 주로 폼 데이터 제출이나 파일 업로드에 사용되며, 메시지 본문을 통해 데이터를 전송한다.
3. PUT
PUT 메서드는 지정된 URI에 리소스를 생성하거나 업데이트할 때 사용된다. PUT 요청은 명시된 리소스가 존재하면 업데이트하고, 존재하지 않으면 생성한다. 이 메서드는 멱등성을 가지며, 같은 요청을 여러 번 수행해도 결과가 동일하다.
4. DELETE
DELETE 메서드는 지정된 URI의 리소스를 삭제하는 데 사용된다. 이 요청은 해당 리소스를 서버에서 완전히 제거할 수 있도록 요청한다.
5. PATCH
PATCH 메서드는 리소스의 부분적인 업데이트를 수행한다. PUT과 달리 PATCH는 리소스의 전체를 대체하지 않고 일부만을 수정한다. 이 메서드도 멱등성을 가질 수 있지만, 그렇지 않은 경우가 많다.
6. HEAD
HEAD 메서드는 GET 메서드와 동일하게 서버로부터 정보를 요청하지만, 리소스의 본문을 반환하지 않고 헤더 정보만을 반환한다. 이는 메타데이터 확인이나 리소스의 유효성 검사 등에 유용하다.
7. OPTIONS
OPTIONS 메서드는 대상
리소스에 대해 통신 옵션을 설명하는 데 사용된다. 이 메서드를 통해 서버는 대상 리소스에서 지원하는 메서드를 클라이언트에게 알릴 수 있다. 주로 CORS(Cross-Origin Resource Sharing)의 사전 요청 처리에 사용된다.
HTTP 메서드의 안전성(safety)과 멱등성(idempotency)은 웹 통신에서 중요한 개념들이다. 이 두 특성을 이해하는 것은 클라이언트와 서버 간의 효과적인 상호작용을 설계하는 데 필수적이다.
안전성(Safety)
안전한 HTTP 메서드는 서버의 리소스를 수정하지 않는다. 즉, 이 메서드들은 데이터를 읽을 수는 있지만, 데이터를 변경하지는 않는다. 주요 목적은 정보를 얻는 것이며, 서버 상태에 영향을 주지 않아야 한다.
- 예시 메서드:
- GET: 데이터를 조회만 하며, 서버의 데이터를 변경하지 않는다.
- HEAD: GET과 유사하게 작동하지만, 응답 본문을 반환하지 않고 헤더 정보만을 반환한다.
- OPTIONS: 서버에서 어떤 메서드들이 지원되는지를 알아내는 데 사용되며, 서버 상태를 변경하지 않는다.
멱등성(Idempotency)
멱등한 HTTP 메서드는 동일한 요청을 여러 번 수행해도 동일한 효과를 가진다. 즉, 첫 번째 요청 이후의 요청들은 추가적인 변화를 일으키지 않는다. 멱등성은 네트워크 상에서 요청이 중복되거나 재시도되는 상황에서 중요하다.
- 멱등 메서드:
- GET: 여러 번 요청해도 서버 상태에 변화를 주지 않음.
- PUT: 지정된 리소스에 대해 동일한 데이터로 여러 번 요청하면, 첫 번째 요청 이후에는 변화가 없다.
- DELETE: 첫 번째 요청이 리소스를 삭제한 후, 동일한 요청은 리소스가 이미 삭제되었기 때문에 추가적인 효과가 없다.
- HEAD: GET과 같이 여러 번 수행해도 서버 상태에 변화를 주지 않음.
- OPTIONS: 동일하게 여러 번 수행해도 서버 상태에 변화를 주지 않음.
- 비멱등 메서드:
- POST: 같은 데이터로 여러 번 요청을 보내면, 매번 새로운 리소스가 생성될 수 있다. 예를 들어, 게시판에 같은 내용의 글을 여러 번 게시할 수 있다.
- PATCH: 요청에 따라 부분적으로 리소스를 수정하므로, 같은 요청을 여러 번 보내면 최초 상태에 따라 결과가 달라질 수 있다.
HTTP 메서드 중 일부는 캐시 가능하도록 설계되어 있어, 응답을 저장하고 재사용할 수 있는 기능을 제공한다. 캐시 가능한 메서드를 이해하고 올바르게 사용하는 것은 웹 애플리케이션의 성능 향상에 큰 도움이 될 수 있다.
캐시 가능한 HTTP 메서드
- GET
- GET 메서드는 가장 일반적으로 캐시되는 HTTP 메서드이다. 이 메서드는 정보를 검색하는 데 사용되며, 데이터를 변경하지 않기 때문에 응답을 안전하게 캐시할 수 있다.
- 예를 들어, 웹 페이지, 이미지, 동영상과 같은 정적 리소스가 GET 요청을 통해 제공되고, 이러한 요청의 응답은 캐시되어 빠르게 재사용될 수 있다.
- HEAD
- HEAD 메서드는 GET 메서드와 유사하게 동작하지만, 실제 본문을 전송하지 않고 헤더 정보만을 반환한다. HEAD 요청의 응답은 GET 요청의 응답과 같이 캐시될 수 있으며, 주로 리소스의 메타데이터를 확인하는 데 사용된다.
비캐시 가능한 HTTP 메서드
- POST
- POST 메서드는 새로운 데이터를 서버에 제출하여 리소스를 생성하는 데 사용된다. 일반적으로 POST 요청의 결과는 캐시되지 않는다. 왜냐하면 요청 본문에 포함된 데이터에 따라 응답이 달라질 수 있기 때문이다.
- PUT, DELETE, PATCH
- 이 메서드들은 서버의 리소스를 수정하거나 삭제하는 등의 작업을 수행한다. 이러한 요청의 결과는 리소스의 상태를 변경하기 때문에 일반적으로 캐시되지 않는다.
캐시 제어
HTTP 헤더는 캐시 동작을 제어하는 데 중요한 역할을 한다. Cache-Control 헤더를 사용하여 응답이 얼마나 오래 캐시될 수 있는지, 어떤 조건에서 캐시될 수 있는지 등을 지정할 수 있다. 예를 들어, Cache-Control: no-cache는 캐시된 복사본을 사용하기 전에 서버에 검증을 요청하도록 지시한다.
HTTP 메서드의 캐시 가능성을 이해하고 적절하게 활용하면, 애플리케이션의 성능을 크게 향상시키고 사용자 경험을 개선할 수 있다. 캐시 전략을 계획할 때는 각 HTTP 메서드의 특성을 고려하여 적절한 캐시 정책을 수립해야 한다.
'CS' 카테고리의 다른 글
[HTTP | HTTP 웹 기본지식 | HTTP 상태코드] 2,3,4,5xx 상태코드 (0) | 2024.05.22 |
---|---|
[HTTP | HTTP 웹 기본지식 | HTTP 메서드 활용] HTTP API 설계 예시 (0) | 2024.05.22 |
[HTTP | HTTP 웹 기본지식 | HTTP 기본] HTTP 구조 (0) | 2024.05.21 |
[HTTP | HTTP 웹 기본지식 | URI와 웹 브라우저 요청 흐름]URI (0) | 2024.05.21 |
[HTTP | HTTP 웹 기본지식 | 인터넷 네트워크] TCP, UDP (0) | 2024.05.21 |