Backend/Spring

@Controller와 @RestController의 차이점

해로몬 2024. 11. 21. 17:39

전통적인 Spring MVC의 **“@Controller”**와 Restful 웹서비스의 **”@RestController”**는 Spring Framework에서 사용되는 애너테이션으로, 둘 다 컨트롤러 역할을 하는 클래스에 붙이지만 작동 방식에 중요한 차이점이 있습니다.

 

  • 어노테이션 간단 비교:
    • @Controller = 웹 페이지 반환용 컨트롤러.
    • @RestController = 데이터(JSON/XML) 반환용 컨트롤러 (@Controller + @ResponseBody).

1.@Controller

[View 반환하기]

주로 View를 반환하기 위해 사용합니다.

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
  3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후에 ViewName을 반환한다.
  5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

[ Data반환하기]

하지만 Spring MVC의 컨트롤러를 사용하면서 Data를 반환해야 하는 경우도 있습니다.

데이터 반환을 위해 “@ResponseBody” 어노테이션을 활용해줍니다.

이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
  3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후에 객체를 반환한다.
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

[예시 코드]

@Controller
public class ViewController {
		@ResponseBody //Data 반환
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring!");
        return "hello"; // "hello.jsp" 또는 "hello.html" 등의 View를 렌더링
    }
}


2.@RestController

@RestController는 @Controller에 @ResponseBody가 추가된 것입니다.

RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다. 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환합니다.

[예시 코드]

@RestController
public class RestAPIController {
    @RequestMapping("/hello")
    public String hello() {
        return "Hello, Spring!"; // HTTP 응답 본문에 "Hello, Spring!"을 작성
    }

    @RequestMapping("/json")
    public Map<String, String> json() {
        Map<String, String> response = new HashMap<>();
        response.put("message", "Hello, Spring!");
        return response; // JSON 형태로 반환
    }
}

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. DispatcherServlet이 요청을 처리할 대상을 찾는다.
  3. HandlerAdapter을 통해 요청을 Controller로 위임한다.
  4. Controller는 요청을 처리한 후에 객체를 반환한다.
  5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

차이점 요약

특성 @Controller @RestController

주요 목적 View 반환 (HTML, JSP 등 렌더링) 데이터 반환 (JSON, XML 등)
기본 동작 반환 값은 View 이름으로 해석 반환 값은 HTTP 응답 본문에 직접 전달
템플릿 엔진 연동 가능 (Thymeleaf, JSP 등) 불가능
REST API 구현 불편 (추가로 @ResponseBody 필요) 간편 (기본적으로 JSON 반환)
예제 반환 값 View 이름 (예: hello.jsp) JSON 문자열 또는 객체 (예: {"key":"value"})
적합한 상황 HTML 페이지를 랜더링 하는 경우 API 데이터를 반환하는 경우

 

 

[참고]

Spring Web MVC - Controller

Building a RESTful Web Service

https://mangkyu.tistory.com/49

'Backend > Spring' 카테고리의 다른 글

[기록]JSP로 페이징 구현  (0) 2024.11.22
[board_기록] 답글이 있는 게시판 만들기  (0) 2024.11.22
Spring Web  (0) 2024.11.20
MyBatis : MapperXML  (0) 2024.11.19
MyBatis : SqlSession  (0) 2024.11.19