
HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method로 표현하여 특정한 형태로 전달하는 방식
REST(REpresentational State Transfer)
HTTP 통신에서 어떤 자원에 대한 CRUD 요청을 Resource와 Method
즉 REST란 어떤 자원에 대해 CRUD(CREATE, READ, UPDATE, DELETE) 연산을 수행하기 위해 URI(Resource)로 요청을 보내는 것으로, Get, Post 등의 Method를 사용하여 요청을 보내며 요청을 위한 자원은 특정한 형태로 표현 됨.
ex)
게시글을 작성하기 위해 특정 URI(http://localhost:8080/board)에
POST 방식을 통해 JSON 형태의 데이터를 전달 가능
위와 같이 CRUD 연산에 대한 요청을 할 때 요청을 위한 Resource(자원, URI)와 이에 대한 Method(행위, POST) 그리고 Representation of Resource(자원의 형태, JSON)을 사용하면 표현이 명확해지므로 이를 REST라고 하며, 이러한 규칙을 지켜서 설계된 API를 REST API 또는 RESTful API라고 함
RESTful API 구성요소
- Resource
서버는 Unique한 ID를 가지는 Resource를 가지고 있으며, 클라이언트는 이러한 Resource에 요청을 보냄
이러한 Resource는 URI에 해당합니다.- Method
서버에 요청을 보내기 위한 방식으로 GET, POST, PUT, PATCH, DELETE 존재
CRUD 연산 중에서 처리를 위한 연산에 맞는 Method를 사용하여 서버에 요청을 보내야 함- Representation of Resource
클라이언트와 서버가 데이터를 주고받는 형태로 json, xml, text, rss 등이 존재
최근에는 Key, Value를 활용하는 json을 주로 사용
GET은 어떤 정보를 조회하기 위해 사용하는 방식
- URL에 변수를 포함시켜 요청
- 데이터를 HEADER에 포함하여 전송
- URL에 데이터가 노출되어 보안에 취약
- 캐싱 가능
GET 방식은 간단한데이터를 URL에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계 존재
HTTP 자체는 GET 방식의 URL 길이에 제약을 두진 않지만 브라우저에서 최대 길이 제한
URL 형식에 맞지 않는 파라미터 이름이나 값은 인코딩되어 전달되어야 함
POST방식은 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 사용되는 방식
- URL에 변수(데이터)를 노출하지 않고 요청
- 데이터를 BODY에 포함
- URL에 데이터가 노출되지 않아서 기본 보안은 존재
- 캐싱 불가능
POST 방식은 BODY에 데이터를 넣어서 전송하기에 헤더필드 중 BODY 의 데이터를 설명하는 Content-Type이라는 헤더 필드가 들어가고 어떠한 데이터 타입인지를 명시해주어야 함
BODY에 데이터를 적재하기 때문에 메시지 길이 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로 클라이언트에서 페이지를 요청하고 기다리는 시간이 존재
실제로 POST 방식은 URL에 데이터가 노출되지 않으므로 즐겨찾기나 캐싱이 불가능하지만 쿼리스트링 데이터 뿐만 아니라 라디오 버튼, 텍스트 박스와 같은 객체들 값도 전송 가능
URL(Uniform Resource Locator)
인터넷 상 자원의 위치를 의미 즉 파일의 위치를 의미하는 것과 같음
URI(Uniform Resource Identifier)
인터넷 상의 자원을 식별하기 위한 문자열의 구성으로, URI는 URL을 포함하는 개념임
Uniformed Interface
Stateless
Cacheable
Client-Server Architecture
REST API에서 자원을 가지고 있는 서버, 자원을 요청하는 클라이언트로 구조화 되어있으며 서버는 API를 제공하고 클라이언트는 사용자 인증, CONTEXT(세션, 로그인 정보) 등을 직접 관리하는 등 역할을 구분하여 의존성을 줄임

객체지향은 오로지 협력과 메시지로 구성
협력은 클라이언트가 서버의 서비스를 요청하는 단방향 상호작용
객체는 협력에 참여하는 동안 클라이언트와 서버의 역할을 동시에 수행하는 것이 일반적
Message

Method
디자인 패턴 중 하나로 소프트웨어를 Model, View, Controller 세가지 주요 컴포넌트로 나누어 구조화하는 방법
MVC는 주로 UI를 개발하는데 사용되며 각 컴포넌트가 각자의 영갛ㄹ을 수행하며 시스템을 보다 모듈화하고 확장 가능하게 만듦

MODEL
VIEW
CONTROLLER

DispatchServlet
HandlerMapping
HandlerAdapter
Controller(Handler)
ModelAndView
View Resolver
View
우리가 주로 개발하는 방식 프론트 / 백 협업 방식은 MVC 패턴에 부합하는가?
Spring MVC

클라이언트의 요청이 들어오면 ViewResolver를 통해 클라이언트에게 text/html , jsp 타입 혹은 파일의 경로 타입의 view 응답을 보냄
RESTful API

클라이언트의 요청이 들어오면 MessageConverter를 통해 application/json이나 text/plain등 알맞은 형태로 리턴( HTTP Response )
REST API는 HTTP 프로토콜 상에서 클라이언트가 서버를 호출하여 데이터를 받는 방식을 쉽게 정리한 표준화된 방식으로 @RestController 어노테이션을 통해 쉽게 구현 가능
MVC는 DispatcherServlet을 걸쳐 view를 응답하지만, RESTful Api는 DispatcherServlet을 거치지 않고 json 형식의 데이터를 응답
뇌피셜 :
우리가 주로 이용하는 협업 방식에서 서버와 프론트는 하나의 애플리케이션이 아니며 서버만 분리해서 봤을 때 MODEL과 VIEW를 사용하지 않고 CONTROLLER가 클라이언트 요청에 따라 데이터를 반환해주기만 하면 됨. 즉 MVC프레임워크를 이용하지만 MVC 구조라고 부르기에 부족함이 있음.
관련된 논의 :
https://okky.kr/questions/1408882
https://www.inflearn.com/community/questions/1263068/mvc%EC%99%80-api%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90