사용된 라이브러리
- Lombok
- Spring boot Framework
목표
1. Spring Controller 에 값을 상속하거나, 혹은 공통적으로 사용되는 Controller 가 존재할까?
2. Controller 의 동작 원리가 어떻게 되는지 알아보자
Spring Controller
스프링 컨트롤러를 만드는 과정은 매우매우 단순하고, 간단하다.
그냥 클래스에 @Controller 만 붙이면 된다.
( 붙이면, Bean 등록해주고, 그 안에서 @RequestMapping ,@GetMapping , @PostMapping, ... etc 등의 Input 을 처리할 수 있도록 된다. 간단하다! )
예전 스프링 3.0 이전에 Annotation Processing 을 지원하지 않는 경우에는, xml 에 직접적으로 컨트롤러 빈을 등록하고 진행했었던 것으로 확인된다.
대부분의 구글링 자료가 3.0 이상의 Annotation Driven 을 통해 동작을 알린다. ( 사실 이전 버전 쓰면 너무 레거시라... )
{ 3.0 이전에 경우에는 Abstract Controller 를 상속 받고.. handler 에 등록을하는 일련의 과정을 거치는 것으로 확인된다. (spring 2.0 documentation ) }
자 간단하게 Spring Boot 의 경우는 Initialize 를 하게 되면 (**main 이 들어가있는 클래스)에 @SpringBootApplication 이라는 어노테이션이 붙게 된다.
해당 어노테이션은 @ComponentScan 메소드를 상속 받게되고, 해당 컴포넌트 스캔은 자신이 있는 패키지로 부터 하위 패키지에 있는 모든 정보를 읽어와서 빈으로 만들어서 등록을 하는 역할을 한다.
위 내용은 모두 스프링을 공부하다보면 나오는 내용으로 해당 포스트에서 다루지 않는다.
자, 기본적인 스프링 프로젝트를 세팅을 진행했다면,
이제 데이터만 반환하는 컨트롤러를 만들어보자 ( View 를 만드는건 생각보다 귀찮다.. )
* ( 요새 프론트는 jsp, thymeleaf 등 보단, 데이터만 완벽하게 분리할 수 있는 프론트 프레임워크가 잘 나와 있으므로 ( ex : react , react native ... ) 데이터만 반환하는 컨트롤러를 만들어본다 )
일반적으로 우리가 Spring 을 사용하면서 만나게 되는 @Controller 어노테이션의 경우 View 를 반환하게끔 설계되어 있다.
따라서,
@Controller 는 MVC 패턴 중, Controller 의 역할을 하여, Model 을 이용하여 변경 후, 해당 Model 을 View 에 대입해 반환해주는 형식이다.

Rest Controller
그럼 @RestController 는?
기존에는 Controller 에 View 를 반환하는 형식이 아닌, 데이터를 반환하는 형식으로 만들 수 있는 어노테이션이 있었다.
그게 바로 Method 에 붙이는 어노테이션 @ResponseBody 로, 반환 형식이, 직렬화 된 데이터를 반환가능하게 만들어져 있다.
( Response Entity 를 반환할 수 도 있다. HttpEntityMethodProcessor 사용 )
Response Entity 를 반환하는 경우에는 Status 를 같이 담아 보낼 수 있는 장점이 있다.
Spring boot 에서는 String type 이 아닌 DTO (RequestResponseBodyMethodProcessor 사용) 타입이여도 자동으로 Serializable 처리를 해준다.
기본적으로 Return Type Handler 에 있는 Message Converter 중 맞는 Converter를 찾아 자동으로 수정해서 진행해준다.
@RestController 의 타겟은 TYPE 으로, Method 가 아닌 클래스에 붙이게 되며, 해당 클래스안의 메소드는 모두 @ResponseBody 가 붙은것과 동일하게 처리가 된다.
그 외의 모든 사항은 Controller 와 동일하게 사용하면 된다.
'Spring' 카테고리의 다른 글
| JWT 를 이용한 권한 검증 및 처리 # jws (0) | 2022.09.15 |
|---|---|
| [번외] [JSP] Include & Forward 방식의 차이 (0) | 2022.01.11 |
| [Spring] RequestMapping & Request Method Mapping (1) | 2022.01.10 |