Programming/Spring

@Controller와 @RestController의 차이

사랑우주인 2021. 1. 31. 03:40

@RestController의 동작방식

 

@RestController 는 @Controller 어노테이션과 @ResponseBody 어노테이션을 합쳐놓은 어노테이션이다. 클래스 상단에 @RestController 어노테이션을 선언하면 Method마다 @ResponseBody를 붙여 주지 않아도 된다.

 

즉 

 

 

동일한 동작을 한다고 말할 수 있다.

 

@Controller와 @RestController 방식의 차이점을 알아보자.

 

  • 스프링 Controller는 일반적으로 View Page 이름을 리턴해주어 사용자에게 뷰페이지를 출력하게 해준다. 그림을 보면 어떤 흐름으로 동작하는지 볼 수 있다.

 

 

사용자의 요청이 오면 등록된 ViewResolver를 통해 사용자에게  text/html 타입의 응답을 보내주게 된다.

@Controller public class testController { @Autowired MemberService mservice; // ViewResolver를 통해 사용자에게 text/html 컨텐츠 타입을 리턴 @RequestMapping("/yeah2") public String test1(){ return "test"; }

 

  • 그에반해 @RestController 에서 return 되는 값은 View Page를 통해 출력되는 것이 아니라 HTTP ResponseBody에 직접 쓰여지게 된다.

 

 

사용자의 요청이 오면 MessageConverter를 통해서 application/json, text/plain 등 알맞는 형태로 리턴되게 된다.

@RestController
public class HomeController2 {

	@Autowired
	MemberService mservice;
	private static Logger logger = LoggerFactory.getLogger(HomeController2.class);

	@RequestMapping(value="/register",method=RequestMethod.GET)
	public List<MemberVO> register() throws Exception {
   //MappingJackson2HttpMessageConverter 를 통해서 application/json 컨텐츠 타입을 리턴
		return mservice.selectMember();
	}
    @RequestMapping(value="/register",method=RequestMethod.GET)
	public String texttest() throws Exception {
   // StringHttpMessageConverter 를 통해서 text/plain 컨텐츠 타입을 리턴
		return "text test";
	}

JSON return

text return

 


 

결론

 

 

일반적은 Spring MVC @Controller와 RESTful 컨트롤러인 @RestController의 차이점은 HTTP Response Body가 생성되는 방식이다.

 

@Controller 는 View Page를 반환하지만, @RestController는 객체(VO,DTO)를 반환하기만 하면, 객체데이터는 application/json 형식의 HTTP ResponseBody에 직접 작성되게 된다.