[Spring]ResponseEntity

[Spring]ResponseEntity

ResponseEntity를 배우기 전에 먼저 Controller와 RestController의 차이점을 알고 가보겠습니다.

| Spring MVC Controller와 Restful Web Service Controller의 차이점

-가장 큰 차이점은 HTTP Response Body가 생성되는 방식입니다.

| 기존 MVC Controller

view 기술을 사용

주로 view(화면)을 return 합니다.

| Restful 웹 서비스 Controller

객체를 반환하기만 하면 객체 데이터는 JSON/XML 형식 의 HTTP 응답을 직접 작성합니다.

Data를 return하는 것이 주 용도입니다.

대표적인 Controller 입니다.

import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/hi/*") public class Controller { @RequestMapping("/hello") public String Hello(){ return "hello"; } }

Controller를 통한 view(hello.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> hello world

간략한 Spring MVC의 흐름(work Flow)

1.client는 URI 형식으로 web service에 요청(request)를 보냅니다.

2.요청(request)는 Handler Mapping과 그 type을 찾는 DispatcherServlet에 의해 인터셉트 됩니다.

3.요청(request)는 Controller에 의해 처리되고 응답은 DispatcherServlet으로 리턴된 후 DispatcherServlet은 View로 디스패치 됩니다.

Spring MVC WorkFlow는 모델앤 뷰(ModelAndView) 객체가 Controller에서 Client로 전달되는 것을 알 수 있습니다.

단,@ResponseBody 어노테이션을 사용하면 View를 return하지 않고 Controller에서 직접 Data를 return할 수 있습니다.

(Spring 4.0 version 부터는 @RestController 어노테이션을 통해 더 쉽게 사용할 수 있습니다.)

@ResponseBody

Spring 3.x MVC Restful Web Service Work Flow

@ResponseBody를 통한 예시

@RequestMapping("/hi/*") public class hello { @RequestMapping("/sendVO") //@ResponseBody <- 메서드 상단 또는 리턴타입 앞에 어노테이션 추가할 수 있습니다. public @ResponseBody BoardVO Hello(){ BoardVO vo = new BoardVO(); vo.setBno(1); vo.setWriter("testuser"); vo.setContent("testContent"); vo.setTitle("testtitle"); vo.setUserName("user"); return vo; } }

브라우저 화면

@ResponseBody을 사용하면, Spring은 HTTP 응답에 리턴 값을 자동으로 변환해줍니다.

대신에 컨트롤러 클래스의 각 메서드에 @ResponseBody 어노테이션을 작성해줘야 합니다.

| @RestController

Spring 4.x MVC Restful Web Service Work Flow

RestController(RestController)

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.spring02.model.board.dto.BoardVO; @RestController @RequestMapping("/basic/*") public class ControllerRest { // json객체 리턴 @RequestMapping("/sendVO2") public BoardVO sendVO2(){ BoardVO vo = new BoardVO(); vo.setBno(1); vo.setWriter("DoubleS"); vo.setContent("게시글 내용입니다"); vo.setRecnt(1); vo.setTitle("게시글 1"); vo.setUserName("DoubleS"); return vo; } // json 객체 배열 리턴 @RequestMapping("/sendList") public List sendList(){ // ArrayList 객체 생성 List items = new ArrayList<>(); for(int i=1; i <=10; i++){ BoardVO vo = new BoardVO(); //vo 객체 생성 vo.setBno(i); vo.setWriter("DoubleS"+i); vo.setContent("게시글 내용입니다"+i); vo.setRecnt(i); vo.setTitle("게시글"+i); vo.setUserName("DoubleS"+i); items.add(vo); // 리스트에 vo추가 } return items; // 리스트를 리턴함 } // json객체를 map에 저장하여 @RequestMapping("/sendMap") public Map sendMap(){ // Map Map map = new HashMap(); for(int i=1; i <=10; i++){ BoardVO vo = new BoardVO(); //vo 객체 생성 vo.setBno(i); vo.setWriter("DoubleS"+i); vo.setContent("게시글 내용입니다"+i); vo.setRecnt(i); vo.setTitle("게시글"+i); vo.setUserName("DoubleS"+i); map.put(i, vo); // 맵에 vo추가 } return map; } }

브라우저 화면

Spring4.0에서는 @RestController 어노테이션을 선언해주면

컨트롤러 클래스의 각 메서드마다 @ResponseBody을 추가할 필요가 없어졌고, 모든 메서드는 @ResponseBody 애노테이션이 기본으로 작동이 됩니다.

| ResponseEntity

RestController는 별도의 View를 제공하지 않는 형태로 서비스를 실행하기 때문에, 때로는 결과데이터가 예외적인 상황에서 문제가 발생할 수 있습니다.

ResponseEntity는 개발자가 직접 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스로 개발자는 404나 500같은 HTTP 상태 코드를 전송하고 싶은 데이터와 함께 전송할수 있기 때문에 좀더 세밀한 제어가 필요한 경우 사용할 수 있습니다.

// ResponseEntity : 데이터 + http status code @RequestMapping("/sendMap2") public ResponseEntity> sendMap2(){ // Map //Map map = new HashMap(); Map map = new HashMap(); for(int i=1; i <=10; i++){ BoardVO vo = new BoardVO(); //vo 객체 생성 vo.setBno(i); vo.setWriter("DoubleS"+i); vo.setContent("게시글 내용입니다"+i); vo.setRecnt(i); vo.setTitle("게시글"+i); vo.setUserName("DoubleS"+i); map.put(i, vo); // 맵에 vo추가 } // 리턴시 map과 상태메시지를 함께 전송 return new ResponseEntity<>(map, HttpStatus.INTERNAL_SERVER_ERROR); } @RequestMapping("/sendErrorAuth") public ResponseEntity sendListAuth(){ return new ResponseEntity<>(HttpStatus.BAD_REQUEST); }

from http://2ham-s.tistory.com/279 by ccl(A) rewrite - 2020-03-11 23:54:25

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

Spring Web Form