본문 바로가기
public void static main()/Spring

[Spring] @RestController @Controller 차이가뭐야??

by 햄리뮤 2022. 1. 29.
반응형

새롭게 스터디를 시작하면서 오랜만 공부를 시작했는데 Swagger 적용하다가 엇? 계속 오류가 나지뭐야

오마나 아주 기본적인거를 까묵었네 뭐해 이바보야~

 

문제 발생!

Swagger로 실행하는데 콘솔에 이런 에러가 나옴!

그래서 엇 머지머지 나는 그냥 swagger를 실행 하려고했는데 라고 생각하고 읽어보니 list 이름의 view가 없단다...

아니아니 그냥 swagger만 실행해달라구!!!!!!! 

2022-01-29 20:40:47.553 ERROR 14824 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    
: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Could not resolve view with name 'list' in servlet with name 'dispatcherServlet'] with root cause

javax.servlet.ServletException: Could not resolve view with name 'list' in servlet with name 'dispatcherServlet'
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1380) ~[spring-webmvc-5.3.15.jar:5.3.15]

그래서 내 코드를 카만히 살펴보니

@Controller
@Api("Board Controller API")
public class BoardController {

@Controller로 되어있어서 view를 찾나보다 라고 생각 한 후 @RestController로 변경하니 정상적으로 작동!

 

자 이제 RestController와 Controller 어노테이션의 차이를 알아보자!

@Controller

- 전통적인 spring mvc의 컨트롤러인 @Controller는 주로 view를 반환하기 위해 사용된다!

그림으로 살표보자!

1. Client는 URI 형식으로 웹 서비스에 요청을 보냄

2. DispatcherServlet이 그 응답을 받음

3. Handler Mapping을 통해서 Controller의 RequestMapping중 Client가 보낸 URI형식과 같은 메소드를찾음

 

그리고나서 우리가 아는 Controller -> Service -> Dao 를 통해서 DB에 접근!!

 

후에 응답을 다시 DispatcherServlet으로 반환 하고 View를 통해서 사용자에게 보여준다!

 

@Controller가 View를 반환하기 위해서는 ViewResolver가 사용된다.

다시 정리하면 이렇게!

@Controller에서의 Data 처리

Spring MVC 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야함!

이를 통해서 Controller도 Json 형태로 데이터를 반환할 수 있음!

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.

2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트함

3. @ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환한다.


@RestController(Spring Restful Controller)

@RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것이다!

RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것! 

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트한다.
  3. RestController는 해당 요청을 처리하고 데이터를 반환한다.

 

 

 

@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작함! HttpMessageConverter에는 여러 Converter가 등록되어 있고,

반환해야 하는 데이터에 따라 사용되는 Converter가 달라진다.

단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고,

객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며,

데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 된다!

Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다!!

 

정리

@Controller는 View를 반환

@Controller은 뷰에 표시될 데이터가 있는 Model 객체를 만들고 올바른 뷰를 선택하는 일을 담당한다.

@ResponseBody를 사용하여 HTTP Response Body에 데이터를 담아 요청을 완료할 수 있따!

@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller

 

@RestController는 데이터를 반환

@RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @ResponseBody와 동일함!

@Target(value=TYEP)
@Retention(value=RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController

 

다음 두 코드는 Spring MVC에서 동일한 동작을 함!

@Controller
@ResponseBody
public class MVCController{
	logic...
}

@RestController
public class ReftFulController{
	logic...
}

 



오~ 이제 다시 공부 시작!!! 힘내 할께 많다!

오늘도 도움을 주신 블로거분들 완전 감사합니다! 덕분에 정리 잘됨요!

 

 

https://mangkyu.tistory.com/49

 

[Spring] @Controller와 @RestController 차이

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차..

mangkyu.tistory.com

https://dncjf64.tistory.com/288

 

@Controller와 @RestController의 차이점

1.개요 Spring MVC의 @RestController은 @Controller와 @ResponseBody의 조합입니다. Spring 프레임 워크에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 Spring 4.0에서 추가되었습니다. 근본적인 차이점은..

dncjf64.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은

내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

 

반응형

'public void static main() > Spring' 카테고리의 다른 글

[Spring] Hidden Method  (0) 2021.11.23
[Spring] DI (Dependency Injection)  (0) 2021.11.11

댓글