새소식

반응형
Java/Spring Boot

@Controller, @RestController

  • -
728x90
반응형

Spring 에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller 와 @RestController 가 있습니다.

일반적인 Spring MVC의 컨트롤러인 @Controller 와 Restful 방식의 컨트롤러인 @RestController 의

주요한 차이점은 HTTP Response Body가 생성되는 방식이다.

 

@Controller 와 @RestController 는 용도의 차이라고 생각하면 된다.

옛날에는 jsp 나 html 과 같이 view에 데이터를 담아 전달했기 때문에 @Controller를 사용했다.

하지만 최근에는 백엔드와 프론트엔드를 분리하면서 백엔드쪽에선 Rest API를 통해 Json 데이터만 전달하고

프론트엔드는 백엔드에서 넘어온 Json 데이터를 화면에 보여주는 방식이기 때문에 @ResponseBody 어노테이션이

자동으로 붙는 @RestController 를 사용하게 됐다.

 

자세한 설명은 아래와 같다.

 

@Controller

1. @Controller 어노테이션 사용하여 View 전달

일반적인 Spring MVC의 컨트롤러인 @Controller 어노테이션은 주로 가공된 데이터와 함께 View를 전달하기 위해

사용한다. View 와 함께 데이터를 전달하기 위해선 Model 객체를 사용한다.

1. 사용자가 요청이 들어오고 Front Controller 인 Dispatcher Servlet이 모든 요청을 받는다.

2. 요청받은 Dispatcher Servlet은 적절한 Controller 에게 요청을 넘길 Handler Mapping 에게 요청을 넘긴다.

3. 요청받은 Handler Mapping 은 요청에 대한 적절한 Controller 에게 요청을 전달한다.

4. Controller 는 요청한 내용에 따라 적절한 Service 에게 요청을 넘긴다.

5. Service 는 비즈니스 로직을 수행한 후 가공된 데이터를 다시 Controller 에게 넘긴다.

6. Controller 는 View Name 과 함께 가공된 데이터를 담아 반환한다.

7,8,9. DispatcherServlet은 Controller 로부터 넘어온 View Name을 ViewResolver를 통해 해당하는 View를 사용자에게

반환한다.

 

@Controller
public class TestController {

    @RequestMapping(value="/test/view")
    public String returnView(Model model){
        model.addAttribute("test_data", 123);
        return "/test/viewTest";
    }
}

위와 같이 Controller 는 데이터와 함께 View를 반환하기 위해 Model 객체를 사용했다.

 

2. @Controller 어노테이션을 사용하여 Json 데이터 반환하기

@Controller 어노테이션을 사용하면서 Json 데이터를 반환 해야할 때가 있다. 이때 사용하는게 @ResponseBody

어노테이션을 사용한다. @ResponseBody 어노테이션을 붙여줄 경우 View 를 반환하는게 아닌 Josn 형태로 데이터를

반환한다.

1. 사용자가 요청이 들어오고 Front Controller 인 Dispatcher Servlet이 모든 요청을 받는다.

2. 요청받은 Dispatcher Servlet은 적절한 Controller 에게 요청을 넘길 Handler Mapping 에게 요청을 넘긴다.

3. 요청받은 Handler Mapping 은 요청에 대한 적절한 Controller 에게 요청을 전달한다.

4. Controller 는 요청한 내용에 따라 적절한 Service 에게 요청을 넘긴다.

5. Service 는 비즈니스 로직을 수행한 후 가공된 데이터를 다시 Controller 에게 넘긴다.

6. Controller 는 가공된 데이터를 HTTP Body에 담아 반환한다.

7. 반환되는 데이터는 Json 형태의 데이터다.

 

@Controller
public class TestController {
    @RequestMapping(value="/test/view")
    @ResponseBody
    public Map<String, Obect> returnView(){
        Map<String, Object> map = new Map<String, Object>();
        map.put("test_data", 123);
        return map;
    }
}

 

@RestController

1. @RestController 어노테이션을 사용하여 Json 데이터 반환하기

@RestController 는 @Controller 어노테이션에 @ResponseBody 가 추가된 것입니다. 

위와같이 @ResponseBody 어노테이션이 자동으로 입력되기 때문에 반환되는 데이터는 Json 형태의 데이터입니다.

 

 

 

@RestController
public class TestController {
    @RequestMapping(value="/test/view")
    public Map<String, Obect> returnView(){
        Map<String, Object> map = new Map<String, Object>();
        map.put("test_data", 123);
        return map;
    }
}

 

위와 같이 RestController를 설정 해줄경우 @ResponseBody를 쓰지않아도 자동등록 되기 때문에 Json 형태로 데이터 

반환이 가능합니다.

 

2. @RestController 어노테이션을 사용하면서 View 와 함께 데이터 넘기기

@RestController 어노테이션을 사용하면서 View 를 넘기고 싶을땐 ModelAndView 를 사용한다.

@RestController
public class TestController {
    @RequestMapping(value="/test/view")
    public ModelAndView  returnView(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("/test/viewTest");
        mav.addObject("test_data", 123);
        return mav;
    }
}

위와 같이 ModelAndView 를 통해 @RestController 어노테이션을 사용하면서 View 및 데이터를 넘길 수 있다.

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.