Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- UXUI챌린지
- JPA
- UXUI기초정복
- UXUIPrimary
- 오픈챌린지
- 국비지원교육
- 디자인강의
- KDT
- 국비지원취업
- 백엔드 부트캠프
- baekjoon
- 패스트캠퍼스
- 객체지향
- 자바
- 국비지원
- Spring
- 디자인교육
- mysql
- 백준
- Be
- 티스토리챌린지
- 오블완
- Java
- 부트캠프
- OPENPATH
- 백엔드개발자
- 디자인챌린지
- 환급챌린지
- 내일배움카드
- 오픈패스
Archives
- Today
- Total
군만두의 IT 개발 일지
[스터디13] 01. RESTful 웹 서비스 기본사항 본문
목차
이 책은 읽기가 어려운 것 같습니다. 하지만 POST가 리소스 생성뿐만 아니라 읽기 오퍼레이션에도 사용될 수 있다는 것과 같은 새로운 정보들을 얻을 수 있어 유익했습니다.
1장. RESTful 웹 서비스 기본사항
1.1 REST API 소개
- REST(Representational State Transfer)는 2000년 로이 필딩(Roy Fielding)의 박사학위 연구에서 제시한 아키텍처 스타일이다.
- 각 URL은 API 리소스로 작동하기 때문에 엔트포인트로 동사 대신 명사를 사용해야 한다.
- GET, DELETE, POST, PUT, PATCH와 같은 HTTP 메소드는 동작을 실행하기에 동사처럼 사용할 수 있다.
클라이언트-서버 작동 방식
- 클라이언트는 REST API를 호출하고 서버는 응답을 보낸다.
- REST를 이용해 클라이언트가 HTTP 요청과 응답을 사용하여 원격으로(또는 로컬로) 실행 중인 서버(또는 웹 서비스)와 통신한다. HTTP 요청에는 쿼리 매개변수, 헤더, 본문 형식의 페이로드 등이 포함된다.
- 호출된 웹 서버는 성공/실패 표시와 HTTP 응답으로 감싸진 응답 데이터를 보낸다. HTTP 상태 코드는 일반적으로 응답 상태를 나타내며 응답 본문에는 응답 데이터가 포함된다.
- RESTful 웹 서비스는 완전한 클라이언트-서버 분리를 지원한다.
- 서버 애플리케이션의 플랫폼 또는 기술 변경이 클라이언트 애플리케이션에 영향을 주지 않는다.
- 각 부분이 독립적으로 발전할 수 있어 유연성이 향상된다.
REST의 특징
- REST 호출은 스테이트리스(stateless)다.
- REST는 캐시 제어를 사용하므로 REST API를 캐시할 수 있다.
- REST는 주요 컴포넌트(리소스와 URI, HTTP 메소드, HATEOAS)를 사용해서 동작한다.
1.2 리소스와 URI 다루기
- WWW(World Wide Web) 상의 모든 문서는 HTTP 관점에서 리소스로 여겨진다. 리소스는 URI로 표시되며, 서버 상의 고유 리소스를 나타내는 엔드포인트다.
- URI는 웹에서 리소스의 위치, 이름 또는 이 둘을 모두 사용해 리소스를 식별하는 문자열을 의미한다. URL과 URN 두 가지 타입이 있다.
- URL은 리소스의 네트워크 위치를 식별하는 역할을 한다. 식별자일 뿐만 아니라 리소스에 도달하는 방법도 알려준다.
- URN은 urn이라는 스킴으로 시작하는 URI 타입을 의미하며 잘 사용되지 않는다.
# URI 구문
scheme:[//authority]path[?query][#fragment]
# URN 구문
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
URI 컴포넌트 목록
- 스킴(Scheme): 공백 없는 글자 나열에 콜론(:)이 따라온다. 문자로 시작하고 숫자, 문자, 마침표(.), 하이픈(-) 또는 더하기 문자(+)의 조합이 이어서 쓰인다.
- 권한(Authority): 선택적 필드며 //가 앞에 온다. 선택적 하위필드(사용자 정보, 호스트, 포트)로 구성된다.
- 경로(Path): 경로에는 슬래시 문자(/)로 구분된 일련의 세그먼트가 포함된다.
- 쿼리(Query): 선택적 컴포넌트로 물음표(?)가 앞에 온다. 쿼리 컴포넌트는 비계층적 데이터인 쿼리 문자열이다. 쿼리 컴포넌트에서 각 매개변수는 앰퍼샌드(&)로 구분되며 매개변수 값은 등호(=) 연산자를 사용하여 할당한다.
- 프래그먼트(Fragment): 선택적 필드로 해시(#)가 앞에 온다. 프래그먼트 컴포넌트는 부속 리소스를 가리키는 프래그먼트 식별자를 가진다.
1.3 HTTP 메소드와 상태 코드 살펴보기
HTTP 메소드
- POST: 생성(Create) 또는 검색(Search)
- GET: 읽기(Read)
- PUT: 갱신(Update)
- DELETE: 삭제(Delete)
- PATCH: 부분 갱신(Partial update)
HTTP 상태 코드
- 정보성 응답(100~199)
- 성공적인 응답(200~299)
- 리다이렉트(300~399)
- 클라이언트 에러(400~499)
- 서버 에러(500~599)
| 상태 코드 | 설명 |
| 200 OK | 이미 생성된 것 이외의 성공적인 요청 |
| 201 Created | 성공적인 생성 요청 |
| 202 Accepted | 요청을 받았지만 아직 액션을 취하지 않음. 서버가 요청을 수락했지만 일괄 처리와 같이 즉시 응답을 반환할 수 없는 경우에 사용 |
| 204 No Content | 데이터가 없는 성공적인 오퍼레이션 |
| 304 Not Modified | 캐싱(caching)을 사용. 서버가 클라이언트에 리소스가 수정되지 않았다고 응답하는 것으로 클라이언트는 동일한 캐시 리소스를 사용할 수 있음 |
| 400 Bad Request | 입력 매개변수가 올바르지 않거나 누락되었거나 요청 자체가 불완전하여 실패한 오퍼레이션 |
| 401 Unauthorized | 인증되지 않은 요청으로 실패한 오퍼레이션. 명시적으로 인증되지 않은 것(unauthenticated)의 의미 |
| 403 Forbidden | 호출이 인가되지 않아서 실패한 오퍼레이션 |
| 404 Not Found | 요청한 리소스가 존재하지 않아서 실패한 오퍼레이션 |
| 405 Method Not Allowed | 요청한 리소스에 대해 메소드가 허락되지 않아서 실패한 오퍼레이션 |
| 409 Conflict | 중복된 생성 오퍼레이션을 시도하는 경우 실패한 오퍼레이션 |
| 429 Too Many Requests | 사용자가 정해진 시간에 너무 많은 요청(rate limiting)을 보내서 실패한 오퍼레이션 |
| 500 Internal Server Error | 서버 오류로 인해 실패한 오퍼레이션. 일반적인 에러 |
| 502 Bad Gateway | 업스트림 서버(upstream server) 호출이 실패하여 실패한 오퍼레이션. 예를 들어 앞단이 외부 결제 서비스를 호출했으나 그 호출이 실패한 경우 |
| 503 Service Unavailable | 과부하 또는 서비스 실패 등 서버에서 예상하지 못한 일이 발생해 실패한 오퍼레이션 |
1.4 HATEOAS이란?
- RESTful 웹 서비스는 HATEOAS라는 하이퍼미디어를 통해 동적으로 정보를 제공한다.
- 하이퍼미디어는 REST 호출 응답으로 수신하는 콘텐츠의 일부이다. 하이퍼미디어 콘텐츠에는 텍스트, 이미지, 비디오와 같은 다양한 타입의 미디어에 대한 링크가 포함되어 있다.
- 하이퍼미디어 링크는 HTTP 헤더나 응답 본문에 포함될 수 있다.
1.5 REST API 설계 베스트 프랙터스
- 엔드포인트 경로에서 리소스의 이름을 지정할 때 동사형이 아닌 명사형 단어를 사용한다.
- 엔드포인트 경로에서 컬렉션 리소스의 이름을 지정할 때 복수형을 사용한다.
- 하이퍼미디어를 사용한다.
- API 버전 관리를 한다.
- 문서는 쉽게 접근할 수 있어야 하고 각 버전의 최신 내용을 담고 있어야 한다.
- 권장되는 상태 코드를 준수한다.

이 글은 『스프링 6와 스프링 부트 3로 배우는 모던 API 개발』 책의 내용을 바탕으로 작성되었습니다.
Comments