[Spring] @ResponseBody, @RestController

류넹·2024년 3월 13일
1

Spring

목록 보기
33/50

❓ @ResponseBody

요청핸들러 메소드에 부착 시,
뷰페이지(jsp)로 이동하지 않고 데이터만 반환되도록 해주는 어노테이션

  • 주로 Ajax에 대한 응답을 보낼 때 사용된다. * 화면에 값을 표현할 때
  • 요청핸들러 메소드나 요청핸들러 메소드의 반환타입 앞에 @ResponseBody가 지정되어 있으면, 요청핸들러 메소드가 반환하는 값은 데이터로 취급된다.

  • Spring MVC는 요청핸들러 메소드가 반환하는 값을 응답메시지의 바디부에 포함시켜서 클라이언트에게 응답으로 전달한다.

  • @ResponseBody가 명시된 메소드가 호출된다면, 직렬화 또는 역직렬화에 맞는 MappingJackson2HttpMessageConverter 하위 메소드들이 실행되고,
    내부에 존재하는 ObjectMapper를 이용하여 JSON 또는 객체 형태로 컨버팅된다.
    * 직렬화/역직렬화 참고 링크




💡 예시)

@ResponseBody 어노테이션 부착/미부착 시의 결과가 어떻게 다른지 비교해보자.

1. @ResponseBody 미부착

  • Controller 요청핸들러 메소드 정의
	@GetMapping("/app1")
	public String app1() {
		return "app1";
	}

  • 결과 : app1.jsp 파일을 찾을 수 없다는 오류 페이지가 뜬다.



2. @ResponseBody 부착

  • Controller 요청핸들러 메소드 정의
	@GetMapping("/app2")
	@ResponseBody
	public String app2() {
		return "app2";
	}

  • 결과 : return값에 작성한 문자열이 페이지에 정상적으로 출력된다.



❓ @RestController

  • 컨트롤러 클래스에 @RestController이 지정되어 있으면,
    해당 컨트롤러 클래스의 모든 요청핸들러 메소드데이터를 반환하는 요청핸들러 메소드가 된다.

* 참고이미지)




📌 @ResponseBody의 동작 방식

  • @ResponseBody 어노테이션을 사용하면, 요청핸들러 메소드가 반환하는 값이 HTTP 요청메시지의 바디부에 포함되어 전달된다.
  • Spring MVC는 ViewResolver와 View를 사용하지 않고, HttpMessageConverter를 사용한다.

1. 요청핸들러 메소드의 반환값이 String일 때

  • StringHttpMessageConverter가 사용된다.
@GetMapping("/hello")
@ResponseBody
    // StringHttpMessageConverter가 사용됨
public String hello() {
	return "안녕하세요";
}

1) HandlerAdapter가 요청핸들러 메소드의 @ResponseBody를 확인한다.
응답을 제공할 때 HttpMessageConverter를 사용할 예정이다.

2) 요청핸들러 메소드를 실행한다.

3) 요청핸들러 메소드의 반환값이 String이기 때문에 StringHttpMessageConverter를 사용한다.
StringHttpMessageConvertervoid write(String str, HttpOutputMessage message) 메소드를 실행해서 응답메시지의 바디부에 문자열을 포함시켜서 응답으로 보낸다.



2. 요청핸들러 메소드의 반환값이 객체일 때

  • MappingJackson2HttpMessageConverter가 사용된다.
@GetMapping("/product")
@ResponseBody
    // MappingJackson2HttpMessageConverter가 사용됨
public Product getProduct(@RequestParam("no") int productNo) {
	Product product = productService.getProduct(productNo);
    return product;
}

1) HandlerAdapter가 요청핸들러 메소드의 @ResponseBody를 확인한다.
응답을 제공할 때 HttpMessageConverter를 사용할 예정이다.

2) 요청핸들러 메소드를 실행한다.

3) 요청핸들러 메소드이 반환값이 Product 객체이기 때문에 MappingJackson2HttpMessageConverter를 사용한다.
MappingJackson2HttpMessageConverter자바객체를 JSON 형식의 텍스트로 직렬화한다. 직렬화된 JSON 텍스트를 응답메시지의 바디부에 포함시켜서 응답으로 보낸다.




References

profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글