It's Ward

[Spring] @Controller와 @RestController 동작 방식 및 차이점 본문

Java/Spring

[Spring] @Controller와 @RestController 동작 방식 및 차이점

I'm ward 2022. 6. 21. 18:45

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 아래와 같이 두개로 구분된다.

@Cotroller : 전통적인 Spring MVC 컨트롤러
@RestController : RESTful 웹서비스의 컨트롤러 // @RequestMapping + @Cotroller

RESTful 웹서비스에 관한 내용은 아래 포스팅에 이해가 잘 되도록 설명되어있다.

https://kimseunghyun76.tistory.com/18

 

RESTful 웹서비스란 무언가?

 웹 서비스의 새로운 패러다임 REST(Representational State Transfer) 1) REST란 (ROA는 RESTful 아키텍처) Web Service는 몇년간 이 세계를 구원할 기술로 각광을 받아왔다. 웹서비스하면 주위의 누구에게라도..

kimseunghyun76.tistory.com

 

어떻게 동작하는가?

1. @Cotroller 로 View 반환하기

@Cotroller는 모델이 객체를 만들어 담고 View를 반환하기 위해 사용한다.

아래 사진은 mustache를 사용한다는 가정으로 만든 도식화된 사진이다.

 

1. Client가 URI 형식으로 웹 서비스에 요청(Request) 한다.

2. Dispacter Servlet이 Hadler Mapping을 통해 해당하는 Cotroller가 있는지 찾는다.

3. Handler Adapter를 통해 해당 Cotroller에 데이터를 요청한다.

4. Cotroller는 요청을 처리한 후 View 이름을 반환한다. 

5. ModelAndView에 View 네임과 모델(모델이 있다면) 을 담아  Dispacter Servlet에 전달한다.

6. Dispacter Servlet은 View Resolver를 통해 해당하는 View를 찾아 Client에 반환(Responese)한다.

이렇게 하면 View Resolver가  resources/templates/hello.mustache 을 찾아 화면에 보여주게된다.

 

2. @Cotroller 로 Data반환하기

@Cotroller로 View 뿐만이 아니라, Data를 반환해야 하는 경우에는 @ResponseBody 어노테이션을 활용하여, Json 형식으로 데이터를 반환 할 수 있다.

1. Client가 URI 형식으로 웹 서비스에 요청(Request) 한다.

2. Dispacter Servlet이 Hadler Mapping을 통해 해당하는 Cotroller가 있는지 찾는다.

3. Handler Adapter를 통해 해당 Cotroller에 데이터를 요청한다.

4. Cotroller는 요청을 처리한 후 ResponseEntity를 ResponseBody에 담아 Dispacter Servlet에 전달한다.

5. Dispacter Servlet은 Client에 ResponseEntity 데이터를  Json Serialize하여 반환(Responese)한다.

 

Controller지만 데이터가 반환된 것을 확인할 수 있다.



2. @RestController로 Data반환하기

@RestController는 @ResponseBody 와 @Controller가 합쳐져 있다고 생각하면된다. 정말 동일하게 작동되며, @ResponseBody 를 명시적으로 필요한 컨트롤러마다 계속 입력해야 했다면, @RestController하나로 해결할 수 있다.

1. Client가 URI 형식으로 웹 서비스에 요청(Request) 한다.

2. Dispacter Servlet이 Hadler Mapping을 통해 해당하는 Cotroller가 있는지 찾는다.

3. Handler Adapter를 통해 해당 Cotroller에 데이터를 요청한다.

4. Cotroller는 요청을 처리한 후 ResponseEntity를 Dispacter Servlet에 전달한다.

5. Dispacter Servlet은 Client에 ResponseEntity 데이터를  Json Serialize하여 반환(Responese)한다.

아래 예제는 ResponseEntity 를 사용하지않아 객체를 그대로 반환하게 되는데, 문제는 클라이언트가 예상하는 HTTPstatus 를 설정할 수 없어 실제로 사용할 때에는 상황에 맞는 ResponseEntity를 사용하여야 한다. 

 

그렇다면 어디에 RestController를 사용해야하는건가? 라는 의문이 자연스럽게 들게되는데.. 웹페이지는 View를 잘 보여주면 되는게 아니였던가???

해당 의문은 아래 포스팅을 보고 이해할 수 있었다.

https://shyvana.tistory.com/7

 

REST API 를 쓰는이유

1. REST API의 탄생 REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다. 로이 필딩은 HTTP의 주요 저자 중 한 사람..

shyvana.tistory.com

 

마치며 ...

해당 블로그 포스팅 전에는 Cotroller와 RestCotroller를 들으면 아~ 맞아 하고 이해하는 수준이였다면, 지금은 설명을 할 수 있을 정도로 이해하였다. 또한 추가로 공부해야할 것들이 생겼다.

RESTful /  RESTful 웹서비스 ,REST API

HTTP Status의 RestController 적용(ResponseEntity 사용방법) 에 대해 공부하도록 하겠다. 

 

참고한 자료

https://dncjf64.tistory.com/288

https://hyojaedev.tistory.com/6

https://mangkyu.tistory.com/49

https://develop-log-sj.tistory.com/29

Comments