요르딩딩

[Spring 분석] @Controller, @RestController 본문

[Web]/[Spring]

[Spring 분석] @Controller, @RestController

요르딩딩 2021. 3. 27. 23:06
728x90

Spring MVC의 컨트롤러 @Controller와 Restful 웹서비스의 컨트롤러 @RestController의 차이점은 

HTTP Response Body가 생성되는 방식입니다.

 

1. @Controller (Spring MVC Controller)

* 주로 View를 반환하기 위해 사용합니다. (화면만, 데이터만, 화면+데이터 반환가능)
* Data를 반환하는 경우도 있고, 이럴경우 @ResponseBody 어노테이션을 활용하면 됩니다.

[Contorller - View]

Client > Dispatcher Servlet > Handler Mapping > Controller > View > Dispatcher Servlet > Client

 

1. 클라이언트는 URI형식으로 웹서비스에 Request를 보냅니다.

2. 해당 Request를 받은 Dispatcher Servlet은 Mapping되는 Handler와 Type를 찾습니다.

3. Controller가 Request를 처리한 후에 응답을 Dispatcher Servlet으로 반환합니다.

4. Dispatcher Servlet은 View를 사용자에세 반환합니다.

 

+ @Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링합니다.

@Controller
@RequestMapping("/company")
public class companyController {

    @Resource(name = "companyService")
    private CompanyService companyService;

    @GetMapping(value = "/infomationView")
    public String infomationView(Model model, @RequestParam(value = "companyName", required = true) String userName){
        Company company = companyService.retrieveUserInfo(companyName);
        model.addAttribute("company", company);
        return "/company/companyInfoView";
    }

infomationView함수는 View를 전달해주고 있기 때문에 String을 반환값으로 정했습니다.

 

[Contorller - Data]

Client > Dispatcher Servlet > Handler Mapping > Controller > Client

 

1. 클라이언트는 URI형식으로 웹서비스에 Request를 보냅니다.

2. 해당 Request를 받은 Dispatcher Servlet은 Mapping되는 Handler와 Type를 찾습니다.

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

 

+ @RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다.

HttpMessageConvert에는 여러 Converter가 등록되어 있고, 반화해야하는 Data에 따라 사용되는 Converter가 변경됩니다. 단순 문자열인 경우에는 StringMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, Data의 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.  Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환타입 정보들을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리합니다.

 

@Controller
@RequestMapping("/company")
public class companyController {

    @Resource(name = "companyService")
    private CompanyService companyService;
    
    @PostMapping(value = "/infomation")
    public @ResponseBody company infomation(@RequestBody Company company){
        return userService.retrieveUserInfo(company);
    }

 

infomation함수는 Company라는 데이터를 반환하고자 하고, Company를 Json으로 반환하기 위해 @ResponseBody라는 어노테이션을 붙여주고 있습니다. 

 

2. @RestController(Spring Restful Controller)

주로 Json형태로 객체 데이터를 반환합니다. (데이터만 반환가능)
(Spring MVC Controller에 @ResponseBody가 추가된것입니다.)

[RestContorller]

Client > Dispatcher Servlet > Handler Mapping > RestController > Client

 

1. 클라이언트는 URI형식으로 웹서비스에 Request를 보냅니다.

2. 해당 Request를 받은 Dispatcher Servlet은 Mapping되는 Handler와 Type를 찾습니다.

3. RestController는 해당 요청을 처리하고 Data를 반환한다.

 

@RestController
@RequestMapping("/company")
public class companyController {

    @Resource(name = "companyService")
    private CompanyService companyService;

    @PostMapping(value = "/infomation1")
    public Company infomation1(@RequestBody Company company){
        return companyService.retrieveCompanyInfo(company);
    }

    @PostMapping(value = "/infomation2")
    public ResponseEntity<User> infomation2(@RequestParam(value = "companyName", required = true) String userName){
        Company company = companyService.retrieveCompanyInfo(companyName);

        if(company == null){
            return ResponseEntity.noContent().build()
        }

        return ResponseEntity.ok(company)
    }

infomation1의 메소드는 User 데이터를 그대로 반환하고 있습니다.

이렇게 처리하는 것 보다 infomation2처럼 결과 데이터와 상태코드를 함께 제어하여 반환하는 것이 좋습니다. 

 

@Controller와 @RestController는 용도의 차이라고 생각하면 될거 같습니다.

예전에는 @Controller에서 jsp나 html과 같은 View를 전달해 주었기 때문에 사용해 왔지만,

최근에는 프론트엔드, 백엔드를 따로두고, @RestController를 백엔드에서 json으로 Data만 편리하게 전달하기위해 사용합니다. 

즉, Rest API에서는@controller @restcontroller 선언한 두 개의 클레스 만들고,
@Controller 클레스는 view만 처리하고
@Restcontroller 클레스는 Data 처리에 사용한다고 생각하면 될거 같습니다.

728x90
Comments