본문 바로가기

공부기록용

RESTful

RESTful은 Representational State Transfer의 약어로, "표현 상태 전송"을 의미한다.
상태(State)는 클라이언트가 요청하는 자원의 현재 정보를 의미한다.
서버에 저장되어 있는 자원의 모든 속성 값이 바로 그 상태를 의미한다.
클라이언트가 요청을 보내면, 서버는 이 자원의 현재 상태를 클라이언트에게 전송한다(State Transfer)
표현(Representation)은 서버가 자원의 상태를 클라이언트에게 전달하는 방식 또는 형식을 의미한다.
ex. 자원의 상태를 http응답 본문(Body)에 담을 때 사용하는 형식(JSON 또는 XML, HTML 등)이다.
표현에는 자원의 속성 값뿐만 아니라 콘텐츠 타입(Content-Type)과 같은 메타데이터도 포함된다.
표현의 의미에는 데이터의 형식(ex. JSON)과 메타데이터(ex. Content-Type)도 포함되지만 형식의 분리라는 개념도 포함된다.
형식의 분리는 REST는 자원의 상태와 그 상태를 전달하는 형식을 분리하는 것을 뜻한다.
클라이언트와 서버가 자원의 본질적인 데이터(상태, ex. 데이터베이스에 저장되어 있는
특정 pk에 해당하는 하나의 row)와 데이터를 감싸는 포장 방식(표현 방식)에 대해
서로 다른 요구를 할 수 있다는 것이다.
자원의 상태(ex. db에 저장되어 있는 데이터)는 불변(자원의 본질)이며,
이 데이터는 클라이언트가 JSON을 원하든 XML을 원하든 변하지 않지만 표현형식은 가변이다.
표현형식은 클라이언트의 요구에 따라 달라질 수 있다.
서버는 하나의 상태를 가지고 있지만 클라이언트의 Accept헤더에 따라
이 상태를 JSON 형식으로 반환할지, XML 형식으로 반환할지를 결정하여 전송하는 것이다.

REST의 핵심 개념은 uri와 자원(Resource)이다.
uri는 자원의 식별자(자원이 무엇인지를 나타내야 한다)이고,
클라이언트는 이 주소(uri)와 함께 http 메서드를 적용하여 서버와 상호작용한다.
REST에서 S에 해당하는 State는 자원의 상태를 의미한다.

RESTful API에서 클라이언트가 자원의 상태를 변경하는 요청,
자원의 상태를 조회하는 요청을 서버에 전송하고, 서버는 클라이언트의 요청에 따라
응답하는 일련의 과정을 표현 상태 전송이라고 한다.
즉, 클라이언트의 요청을 참고하여 서버는 db에서 자원의 상태를 확인하고,
확인된 자원의 현재 상태를 어떤 형식으로 포장할지(표현) 결정하고,
이 표현을 http 응답 본문을 통해 클라이언트에 전송한다.
클라이언트는 표현(ex. JSON)을 통해 요청한 자원의 현재 상태를 알게 되는 것이다.

API가 RESTful하다는 것은 단순히 HTTP를 사용한다는 것을 넘어
REST를 만든 로이필딩이 제시한 제약조건들을 충실히 구현했다는 것을 의미한다.
제약조건(핵심 원칙)에는
1. 자원 중심의 설계: ex. GET /events/101
--> API가 다루는 모든 대상을 uri로 식별가능하게 설계해야 하며,
uri는 동사가 아닌 명사를 사용해서 자원을 식별해야한다.
RESTful 디자인 원칙에서 중요한 것은 URI의 경로(path)와 HTTP 메서드가 자원과 행위를 명확히 분리하는 것이다.
ex. RESTful한 API: GET /events/101 여기서 자원은 /events/101 이고, 행위는 GET(조회)이다.
uri 경로에 행위(get) 워딩이 포함되어 있으면 RESTful하지 않은 것이다.
2. 균일한 인터페이스: 자원에 대한 모든 상호작용은 HTTP 표준 메서드(GET, POST, PUT, DELETE)를 사용한다.
3. 무상태성: 서버는 클라이언트의 상태 정보를 저장하지 않는다.
4. 표현 상태 전송: 서버는 자원의 상태를 표현 형식으로 전송해야한다.

반응형