메뉴 건너뛰기

@Controller와 @RestController의 차이점

김지훈 2024.07.19 15:05 조회 수 : 31

 

1. @Controller

[ @Controller 실행과정 ]

@Controller 개요.png

 

 

 

ClientHTTP 프로토콜(= URI 형식)로 웹 서비스에 요청을 보낸다.

Dispatcher Servlet(= Web Application Server, Tomcat)이 요청을 위임할 Controller를 찾는다(= Handler Mapping).

Handler Mapping을 통해 요청을 위임할 Controller를 찾았으면 Handler Adapter를 통해 Controller 선택한다.

(Handler Mapping Handler Adpater Spring에서 자동으로 등록한다.)

Controller는 요청을 받고 처리된 View Name(밑에 예제에서 나오는 getMain() 메서드의 return )Handler Adapter에 반환한 후 Dispatcher Servlet에 전달한다.

Dispatcher Servlet View Resolver를 통해 View Name에 해당하는 View를 찾아 Client에게 반환한다.

Dispatcher Servlet : HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러

 

[ @Controller의 특징 ]

View(= JSP)를 반환하기 위해 사용한다.

특정 View로 데이터(= )를 전달 시 Model객체를 사용하여 View에 넘긴다.

Spring MVC(= Model, View, Controller)에서 요청을 처리하고 View Resolver를 활용하여 실제 View를 반환한다.

 

 

[ Spring MVC 개념 ]

- MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴으로 애플리케이션의 개발 영역을 MVC(Model, View, Controller)로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식이다.

- Model

: 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업을 하며, 처리한 작업의 결과 데이터를 클라이언트에게 응답을 돌려주어야 하는데, 이때 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라 한다.

- View

: Model을 이용하여 웹 브라우저와 같은 애플리케이션의 화면에 보이는 리소스(Resource)를 제공하는 역할을 한다.

- View의 역할

HTML 페이지 출력

PDF, Excel 등의 문서 형태로 출력

JSON 등 특정 형식의 포맷으로 변환

- Controller

: 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)로써 Model View의 중간에서 상호작용을 해주는 역할을 한다.

: 클라이언트 측의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면, Model 데이터를 View로 전달하는 역할을 한다.

 

- MVC패턴의 구조

MVC패턴 구조.png

[ @Controller 예시 ]

[MainController.java]

@Controller

public class MainContoller {

      @GetMapping(value="/main.do")

      public String getMain(Model model)  {

            model.addAttribute("name", "apple");

            return "main";

      }

}

 

[main.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

<h1>${name}</h1>

</body>

 

</html>

 

[웹에서 localhost:8080/main.do 입력 시]

 

 

2. @RestController

 

[ @RestController 실행과정 ]

 

@RestController 개요.png

Client HTTP 프로토콜(= URI 형식)로 웹 서비스에 요청을 보낸다.

Dispatcher Servlet이 요청을 위임할 Controller를 찾는다(= Handler Mapping).

Handler Mapping을 통해 요청을 위임할 Controller를 찾았으면 Handler Adapter를 통해 Controller 선택한다.

Controller는 요청을 처리한 객체를 Handler Adapter에 반환한 후 Dispatcher Servlet에 전달한다.

Dispatcher Servlet으로 반환된 객체는 JSON으로 Serialize되어 Client에게 반환된다.

Serialize : 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술이다.

 

[ @RestController 특징 ]

@RestController = @Controller + @ResponseBody

@Controller처럼 View를 반환하는 것이 아닌 객체를 반환한다.

객체를 반환하면 결과를 XML 또는 JSON 형식으로 반환한다.

 

[MainController.java]

@RestController

public class MainController {

    @GetMapping(value="/main.do")

    public String getMain()  {

        return "내용 그대로 출력된다.";

    }

}

 

[웹에서 localhost:8080/main.do 입력 시]

 

3. @Controller @RestController의 차이점

- @Controller는 클래스를 Spring MVC Controller로 표시하는데 사용되는데, @RestController

RESTful 웹 서비스에서 사용되는 특수 컨트롤러이다.

- @Controller View의 이름을 반환하지만, @RestController는 모든 메서드가 객체로 반환된다.

RESTful 웹 서비스 : ‘REST API를 제공하는 웹 서비스

REST API : REST를 기반으로 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며,

서로 정보를 교환가능 하도록 하는 것

 

REST : HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것