ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - 응답 메시지를 만드는 방법 (정적 리소스, 뷰 템플릿, HTTP API 메시지 바디에 직접 입력)
    Spring/Spring MVC 2022. 1. 29. 23:04
    반응형

     

     

    응답 메시지를 만드는 방법

    • 정적 리소스
      - 정적 HTML, CSS, javascript를 제공
    • 뷰 템플릿
      - 동적 HTML을 제공(뷰 템플릿을 사용한다)
    • HTTP API, 메시지 바디에 직접 입력
      - HTTP API를 제공하는 경우 HTML이 아니라 데이터를 전달해야 하므로
        HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다.

     

     

    정적 리소스

     

    • 스프링 부트는 클래스 패스의 아래와 같은 디렉터리 안에 있는 정적 리소스를 제공한다.
      /static, /public, /resources, /META-INF/resources
    • str/main/resources는 리소스를 보관하는 곳이고, 또한 클래스패스의 시작 경로이다.
      따라서 다음 디렉토리에 리소스를 넣어두면 스프링 부트가 정적 리소스로 서비스를 제공한다.

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        hello Sprring MVC
    </body>
    </html>

    hellospringmvc.html 리소스 경로
    /hellospringmvc.html URL 요청

     

     클라이언트가 정적 리소스인 hellospringmvc.html을 요청하면 스프링 부트가 내장 톰캣을 통하여 자동으로 정적 리소스를 찾아 응답 메시지를 보내준다. str/main/resources는 클래스패스의 시작 경로이기 때문에 요청 URL은 localhost:8080/hellospringmvc.html 이 된다.


     

     

    뷰 템플릿

     

    • 뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어 전달
    • 일반적으로 동적 HTML을 요청 메시지로 보내기 위해 사용
    • 스프링 부트는 기본 뷰 템플릿 경로를 제공
           spring.thymeleaf.prefix=classpath:/templates/
           spring.thymeleaf.suffix=.html
    • Controller를 통한 Mapping이 되어야 한다.
    • ModelAndView, Model을 이용

     

    뷰 템플릿 생성

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p th:text="${data}">empty</p>
    </body>
    </html>

    뷰 템플릿 경로


     

    ModelAndView을 이용한 동적 HTML 응답 메시지 처리

     

    • ModelAndView 객체에 동적 HTML 경로를 설정
    • ModelAndView 타입을 리턴하여 해당 경로에 있는 동적 HTML을 응답 메시지로 보낸다.

     

    @Controller
    public class ResponseViewController {
    
        @RequestMapping("/response-view-v1")
        public ModelAndView responseViewV1() {
        
            ModelAndView mv = new ModelAndView("response/hello")
                    .addObject("data", "ModelAndView hello!");
                    
            return mv;
        }
    }

    응답 결과


     

     

    Model을 이용한 동적 HTML 응답 메시지 처리

     

    • String을 반환하면 뷰 리졸버가 실행되어 해당 동적 HTML을 찾아 응답 메시지로 보낸다.

     

    @Controller
    public class ResponseViewController {
    
        @RequestMapping("/response-view-v2")
        public String responseViewV2(Model model) {
        
            model.addAttribute("data", "Model hello!!");
            
            return "response/hello";
        }
    }

    응답 결과


     

     

    HTTP API, 메시지 바디에 직접 입력

     HTTP API를 제공하는 경우에는 HTML이 아닌 데이터를 전달하기 때문에 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어서 보낸다.

     

    • HttpServletResponse 이용 - String
    • ResponseEntity<String> 이용 - String
    • @Responsebody 이용 - String
    • ResponseEntity<T> 이용 - JSON
    • @Responsebody 이용 - JSON

     

    HttpServletResponse 이용 - String

     

    • HttpServletResponse 객체를 이용하여 HTTP 메시지 바디에 데이터를 실어서 보낸다.

     

    @Slf4j
    @Controller
    public class ResponseBodyController {
    
        @GetMapping("/response-body-string-v1")
        public void responseBodyV1(HttpServletResponse response) throws IOException {
            response.getWriter().write("ok");
        }
    
    }

    응답 결과


     

     

    ResponseEntity<String> 이용 - String

     

    • HttpEntity를 상속받은 ResponseEntity는 HTTP 메시지의 헤더, 바디의 정보를 조회할 수 있으며
      HTTP 응답 코드를 설정할 수 있다.
    • HTTP 메시지 컨버터를 통해 HTTP 메시지 바디에 데이터를 실어서 보낸다

     

    @Slf4j
    @Controller
    public class ResponseBodyController {
    
        @GetMapping("/response-body-string-v2")
        public ResponseEntity<String> responseBodyV2() {
            return new ResponseEntity<>("ok", HttpStatus.OK);
        }
    }

    응답 결과


     

     

    @Responsebody 이용 - String

     

    • HTTP 메시지 컨버터를 통해 HTTP 메시지 바디에 데이터를 실어서 보낸다

     

    @Slf4j
    @Controller
    //@RestController
    public class ResponseBodyController {
    
        @ResponseBody
        @GetMapping("/response-body-string-v3")
        public String responseBodyV3() {
        
            return "@ResponseBody ok";
        }
    
    }

    응답 결과


     

     

    ResponseEntity<T> 이용 - JSON

     

    • HTTP 메시지 컨버터를 통해 ResponseEntity를 JSON 형식으로 응답 메시지 바디에 실어서 보낸다.

     

    @Slf4j
    @Controller
    public class ResponseBodyController {
    
        @GetMapping("/response-body-json-v1")
        public ResponseEntity<UserData> responseBodyJsonV1() {
            UserData userData = new UserData();
            userData.setUsername("userA");
            userData.setAge(20);
            return new ResponseEntity<>(userData, HttpStatus.OK);
        }
    }

    응답 결과


     

     

    @Responsebody 이용 - JSON

     

    • HTTP 메시지 컨버터를 통해 해당 객체를 JSON 형식으로 응답 메시지 바디에 실어서 보낸다.
    • @ResponseStatus 애노테이션을 통해 응답 코드 설정 가능

     

    @Slf4j
    @Controller
    public class ResponseBodyController {
    
        @ResponseStatus(HttpStatus.OK)
        @ResponseBody
        @GetMapping("/response-body-json-v2")
        public UserData responseBodyJsonV2() {
            UserData userData = new UserData();
            userData.setUsername("userA");
            userData.setAge(20);
            return userData;
        }
    }

    응답 결과

     

     

     

    참고
    @RestController는 ( @Controller + @ResponseBody ) 와 같다.

     

     

     

     

    반응형

    댓글

Designed by Tistory.