본문 바로가기
Framework/Spring Framework

[SpringFramework] RESTful방식의 @RestController 와 @ResponseBody란?

by 원동호 2018. 8. 5.
반응형

몇달전 본인은 프로젝를 진행하면서  클래스를 하나를 Controller로 두고Controller클래스 내에 view return하는 메소드, RESTful방식으로 return 하는 메소드를 짬뽕해서 사용했다.

결과적으로 이런방식으로 하니 프로젝트가 커질수록 컨트롤러가 복잡하고 헷갈리는 참사가발생했다....

 

이후 프로젝트를 다시 처음부터 하면서 RESTful방식에 대해 더 공부하게되었다.

 

RESTful 어디서 많이는 들어봤지만 뭔지는 모르는 나에게는 애매하고 생소한 단어였다.

 

검색도 해보고 자료도 찾아보면서 정리를 해본다.

 


 

@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에 직접 작성되게 된다.

 

 


 

원리

 

그래서 스프링은 어떤 원리로 JSON을 return하거나 text/plain 타입을 return 할까?

 

@ResponseBody 어노테이션은 값을 리턴할 타입을 보고 알맞은 MessageConverter 인터페이스를 상속받고있다.

 

자주사용하는 application/json형태로 바꿔주는 MappingJackson2HttpMessageConverter을 알아보자.

 

위의 MessageConverter을 사용하기위해서는 com.fasterxml.jackson.core라는 라이브러리를 추가해주어야한다.

 

com.fasterxml.jackson.core의 의존성으로는 3가지가있는데

  1. jackson-core 
  2. jackson-annotations
  3. jackson-databind 

이렇게 세가지 모듈이있다. 

본인은 어떤 모듈을 사용해야 JSON을 사용할수있을지 몰라 세가지 다 추가해주었지만,

 

중요한점은 마지막모듈인 jackson-databind 모듈이 상위 2가지 모듈의 의존성을 포함하기때문에.

마지막 모듈만 추가해주면 JSON을 사용할 수 있다.

 

아무생각없이 사용했는데 구글의 힘은 대단하다..

 

spring-boot기반에서는 MessageConverter를 자동으로 셋팅해준다고한다.

본인은 spring기반이므로

패스!

 

spring 3.1이하의 버전의경우에는 pom.xml에서 라이브러리도 입력을해주고, MessageConverter Bean도 따로 등록을 해주어야 동작을 했지만, 

이후 버전에서는 json 라이브러리가 클래스패스에 존재하고 , 

servlet-context.xml에 <annotation-driven/>를 입력만 해주면 디폴트 MessageConverter가 자동으로 등록이 된다고한다!

 

도움이 되셨다면 하트 및 댓글 부탁드립니다♥

 

출처 : https://wckhg89.github.io/archivers/understanding_jackson , http://mkil.tistory.com/204

 

 

 

반응형

댓글