티스토리 뷰

스프링으로 개발을 해본 사람이라면 @Controller와 @RestController 어노테이션을 둘 다 접해본 경험이 있을 것이다.

나 또한 프론트와 백엔드가 합쳐진 웹 개발을 할 때는 @Controller를, 백엔드 개발을 할 때는 @RestController를 사용해봤다.

 

Restful API를 개발할 떄(백엔드 개발을 할 때는)는 @RestController를 사용한다기에 @RestContoller를 사용했는데, 그렇다면 @Controller와 @RestController의 차이점은 무엇일까?

 

 

@Controller와 @ResponseBody가 합쳐진 @RestController

@RestController가 뭐가 다른지는 어노테이션을 까보면 확실히 알 수 있다.

@RestController 어노테이션을 까보면 아래와 같이 코딩되어 있다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
	...
}

 

 

RestController위에 보면 어노테이션 @Controller와 @ResponseBody가 둘 다 붙어 있다.

즉, @RestController는 간단히 설명하면 @Controller와 @ResponseBody가 합쳐진 것이라고 생각하면 된다.

 

 

@ResponseBody란

그러면 @Controller와 @RestController의 큰 차이점은 @ResponseBody가 붙어 있느냐 안 붙어 있느냐의 차이인데 그렇다면 @ResponseBody는 무엇일까?

@ResponseBody 어노테이션에 대한 설명은 아래와 같다.

Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods. As of version 4.0 this annotation can also be added on the type level in which case it is inherited and does not need to be added on the method level.

 

 

한글로 간단하게 해석해보면(뒤에 버전 4.0 어쩌구 하는거 빼고) @ResponseBody 어노테이션을 붙이면 해당 메소드의 반환 값을 웹 즉, http 응답 body에 넣어준다는 것이다.

이게 왜 필요하고 @ResponseBody 어노테이션을 붙이지 않을 경우 반환 값은 어떻게 되는 것인가?

 

 

@ResponseBody를 붙이지 않고 @Controller를 사용했을 경우 아래와 같이 컨트롤러는 자신을 호출했던 클라 쪽으로 View와 Model을 별도로 반환한다. 

즉, 보여줄 화면인 View와 그 화면에서 사용할 데이터인 Model을 반환하는 것이다.

 

 

하지만 백엔드만 따로 개발하는 경우에는 뷰를 굳이 클라(프론트) 쪽으로 보내주지 않아도 된다.

즉, 데이터만 클라에서 사용할 수 있게 보내주면 되는데 이 때 @ResponseBody가 필요한 것이다.

@ResponseBody를 사용하면 응답 값의 body에 컨트롤러에서 반환했던 객체가 json 형태로 들어가게 된다.

그러면 클라에서는 json 형태로 데이터를 받아서 마음대로 사용할 수 있다. 컨트롤러에서는 따로 뷰에 대해서는 생각하지 않아도 된다.

 

 

이를 위해서 @RestController가 생기기 전에는 @Contoller와 @ResponseBody를 같이 사용했다.

하지만 @RestContoller가 생기면서 이제 그 둘을 굳이 번거롭게 같이 쓰지 않아도 됐다.

만일 해당 컨트롤러에 뷰를 반환해야하는 것과 데이터만 반환해야하는 메소드가 섞여 있다면 @RestController가 아니라 클래스 자체에 @Controller를 붙여 빈을 생성하고 데이터를 반환해야하는 메소드에만 @ResponseBody를 붙이면 된다.

@Controller
@RequestMapping("/test")
public class TestController {
	...
	
      @GetMapping("/view")
      public String returnView() {
          return "view"; // view.jsp
      }

      @GetMapping("/data")
      @ResponseBody
      public Map<String, Object> returnData() throws Exception {
          Map<String, Object> data = new HashMap<>();
          data.put("name", "Lee");
          data.put("value", 0);

          return data;
      }

      ...
}

 

 

하지만 보통은 그렇게 컨트롤러를 짜지 않는다. 즉, 이제는 데이터만 반환하면 되는 컨트롤러이면 @RestController로 해당 객체를 생성하면 된다.

 

 

정리하면...

@RestController는 @Controller와 @ResponseBody를 합친 어노테이션이다. 따라서 @RestController를 사용한 객체에 별도로 메소드에 @ResponseBody를 붙일 필요가 없다.

json으로 데이터를 응답 메시지 body에 붙여서 반환할 컨트롤러이면 @Contoller와 @ResponseBody를 같이 사용하지 말고 @RestController를 사용하자.

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함