[Spring] @Controller vs @RestController

jinni·2022년 11월 29일
0

Spring

목록 보기
1/4
post-thumbnail

우리가 흔히 사용하는 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다.

참고

  1. client는 URI 형식으로 웹 서비스에 요청을 보냄.
  2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾음.
  3. HandlerMapping을 통해 해당 요청을 Controller로 위임.
  4. Controller는 해당 요청 처리 후, ViewName에 반환.
  5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 client에게 반환.

컨트롤러는 뷰에 표시될 데이터가 있는 Model 객체를 만들고 View를 선택하는 일을 담당.

Controller로 Data 반환

우리는 Controller를 사용하면서 Data를 반환해야할 일이 종종 있다. 컨트롤러에서 데이터를 반환해주기 위해서는 @ResponseBody 어노테이션을 활용해주어야 한다. 해당 어노테이션을 통해 JSON 형태로 데이터를 반환할 수 있다.

참고

작동 방식은 위에 나온 방식의 3번까지가 동일하다.

  1. Controller는 요청을 처리 후, 객체를 반환.
  2. 반환된 객체는 JSON으로 Serialize(직렬화) 진행 후, client에게 반환.
// 아래 2개는 똑같은 내용.
@Controller
@ResponseBody
public class Controller {
		...
}

@RestController
public class RestController {
		...
}

@RestController

요 녀석은 @Controller + @ResponseBody 으로 이루어진 어노테이션이다. 그럼 우리는 위에서 읽은 내용으로 어느 정도 유추할 수 있게 된다. 그렇다. 이녀석의 용도는 JSON 형태로 객체를 반환해주는 역할을 한다. (View 대신에 객체로 반환됨)

최근 REST API를 개발 시, 사용하며 객체를 ResponseEntity로 감싸서 반환해준다. 작동 방식은 Controller로 Data 반환에서의 방식과 동일하다.

클라이언트가 웹에 요청을 보낼 때는 보통 서버에서 날라오는 응답 결과에 대해 예상한다. 하지만, RestController를 그냥 사용하게 되면 HttpStatus를 설정해줄 수가 없다. 그렇기 때문에 우리는 ResponseEntity로 감싸서 반환해주어야 한다.

그렇지만, 꼭 감싸줄 필요는 없다. 객체를 따로 만들어놓고 인자로 넣어서 메시지와 함께 HttpStatus로 날려줘도 된다~~ 근데 뭐가 맞는 지는 모르겠다.
나는 과제를 하면서 이렇게 했기 때문

그래서 Controller 따로 RestController 따로 분리해도 된다.

정리하자면, 용도의 차이

참고: https://mangkyu.tistory.com/49

profile
조금씩 천천히 꾸준하게

0개의 댓글