공부를 하다가 자주 드는 의문이 있었다.
'REST API와 Spring MVC의 차이는 뭐지? 언제 사용하는거지?'
얼추 알고 있었지만 두루뭉실하게 알고 있던 지식을 정확하게 알고싶어서 글을 작성한다.
우선 GPT에게 물어봤다.
"REST API와 Spring MVC의 차이를 알려줘"
GPT 답변
REST API(Representational State Transfer Application Programming Interface)와 Spring MVC는 웹 애플리케이션 개발에서 주로 사용되는 두 가지 다른 개념입니다. 아래는 REST API와 Spring MVC의 주요 차이점을 설명합니다.
개념 및 목적
REST API: REST는 웹 아키텍처 스타일 중 하나로, 리소스를 나타내는 URI(Uniform Resource Identifier)에 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 상태를 전송하고 조작하는 웹 서비스 디자인 원칙입니다. REST API는 이러한 RESTful 웹 서비스의 인터페이스를 제공하는 것이 목적입니다.
Spring MVC: Spring MVC는 Java 기반의 웹 애플리케이션을 개발하기 위한 프레임워크로, Model-View-Controller 아키텍처 패턴을 기반으로 합니다. 웹 애플리케이션을 개발할 때 사용되며, HTTP 요청을 처리하고 응답을 생성하는 데 중점을 둡니다.
아키텍처
REST API: RESTful 서비스의 아키텍처는 자원(Resource), 표현(Representation), 상태(State), 그리고 행위(Verbs)로 구성됩니다. 자원은 고유한 URI로 식별되며, HTTP 메서드를 사용하여 조작됩니다.
Spring MVC: Spring MVC는 전통적인 웹 애플리케이션의 아키텍처를 따르며, 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성된 MVC 패턴을 사용합니다.
사용되는 언어
REST API: REST는 언어에 독립적이지만, 주로 HTTP를 기반으로 하는 웹 서비스에서 사용됩니다.
Spring MVC: Spring MVC는 Java 기반의 프레임워크로, Java 언어를 사용하여 개발됩니다.
사용 분야
REST API: 주로 분산 시스템에서 자원을 표현하고 상호 작용하기 위해 사용됩니다. 웹 서비스, 모바일 애플리케이션, 클라이언트-서버 간의 통신에 활용됩니다.
Spring MVC: 주로 웹 애플리케이션의 백엔드를 개발하기 위해 사용됩니다. 사용자 인터페이스와의 상호 작용을 관리하고, 데이터 처리 및 비즈니스 로직을 수행합니다.
프로토콜
REST API: HTTP를 주로 사용하며, URI 및 HTTP 메서드를 통해 자원을 식별하고 조작합니다.
Spring MVC: 브라우저와 서버 간의 상호 작용에 주로 HTTP 및 HTTPS를 사용합니다. Spring MVC는 다양한 프로토콜과 통신할 수 있는 다양한 모듈을 제공합니다.
관련성
Spring MVC는 RESTful 웹 서비스를 개발하기 위해 사용될 수 있습니다. Spring 프레임워크는 Spring MVC 모듈을 통해 RESTful 웹 서비스를 쉽게 구축할 수 있는 다양한 기능을 제공합니다. 이는 Spring MVC가 REST API 개발에 사용되는 하나의 방법이라는 의미입니다.
요약하면, REST API는 웹 서비스 디자인 원칙 중 하나로, 자원을 나타내고 조작하기 위한 아키텍처 스타일을 제공합니다. Spring MVC는 Java 기반의 웹 애플리케이션을 개발하기 위한 프레임워크로, 전통적인 MVC 아키텍처를 따르며 주로 백엔드 서버 개발에 사용됩니다.
어느정도 이해가 됐지만 확실한 이해를 위해 그림을 통해 이해해보자.
Spring MVC
클라이언트의 요청이 들어오면 ViewResolver를 통해 클라이언트에게 text/html , jsp 타입 혹은 파일의 경로 타입의 view 응답을 보낸다.
RESTful API
클라이언트의 요청이 들어오면 MessageConverter를 통해 application/json이나 text/plain등 알맞은 형태로 리턴한다. ( http response )
Spring 구현방안 검토
Rest API는 http 프로토콜 위에서 Client가 Server를 호출해서 데이터를 받는 방식을 사용하기 쉽게 정리한 표준화된 방식으로 정리할 수 있을거 같다. (html문서가 아닌 다른 데이터도 조회,수정,삭제가 가능하도록 표준화한 방식)
이런 방식으로 구현 가능한게 @Controller + @ResponseBody로 하면 REST형태로 개발이 가능할 수 있는데, 이걸 하나로 합친것이 @RestController이다.
@Controller + @ResponseBoy = @RestController
둘간의 차이(REST vs Controller)를 정리하면
기존 Spring MVC구조의 @Controller는 컨트롤러의 리턴값이 ViewResolver에 의해서 해석되어서 특정뷰가 html응답으로 전송된다.
반면 @RestController에 의한 호출은 뷰를 리턴하는 것이 목적이 아닌, 데이터를 전송하는 목적으로 응답이 전송되어 진다.
화면을 전환하는 용도라면 Spring MVC구조를 사용하고, 데이터 전송용이라면 Rest로 구현해서 섞어서 쓰면 될것으로 보인다.
단, 모니터링 화면이나 채팅 같이 데이터전송이 자주 되는 구조의 Web어플리케이션은, 데이터를 좀더 효율적으로 전송하려면, Rest API가 아닌 WebSocket을 이용하여 해당 부분의 데이터 송수신을 구현하는 것이 맞다고 생각한다.
웹 애플리케이션과 REST API의 근본적인 차이점은 웹 애플리케이션의 응답은 일반적으로 사람이 보기 위한 용도이기 때문에 (HTML + CSS + JavaScript) 를 응답으로 전송한다.
반면, REST API는 REST 대부분의 클라이언트가 프로그램이기 때문에 JSON 또는 XML 형식으로 데이터를 반환합니다.
결론
MVC는 DispatcherServlet을 걸쳐 view를 응답하지만, RESTful Api는 DispatcherServlet을 거치지 않고 json 형식의 데이터를 응답한다.
화면을 전환하는 용도라면 Spring MVC를 사용하고
단순 데이터 전송용이라면 REST API를 사용하자.