[Spring] 기초 Spring 5주차-2

Yuri·2025년 1월 22일

Spring

목록 보기
7/21

🧑‍🏫 목표

  • HTTP 요청 및 응답 데이터의 처리 방식을 학습한다.
  • 실습을 통해 CRUD 기능을 포함한 프로젝트를 개발하며, 실제 애플리케이션에서 HTTP 통신과 데이터 처리를 적용하는 방법을 익힌다.

Server에서 Client로 Data를 전달하는 방법 3가지

  1. 정적 리소스
    • 정적인 HTML, CSS, JS, Image 등을 변경 없이 그대로 반환한다.
  2. View Template
    • SSR(Server Side Rendering)을 사용할 때 View가 반환된다.
  3. HTTP Message Body
    • 응답 데이터를 직접 Message Body에 담아 반환한다.

정적 리소스

  • Spring Boot의 정적 리소스 경로
    • 아래 경로들에 정적 리소스가 존재하면 서버에서 별도의 처리 없이 파일 그대로 반환된다.
    1. /static
    2. /public
    3. /META-INF/resources
    4. src/main/resources
      • /static → 🌱 Spring 자동 생성

View Template

Spring에서는 Thymeleaf, JSP와 같은 템플릿 엔진을 사용해 View Template을 작성할 수 있고, View Template은 서버에서 데이터를 받아 이를 HTML 구조에 맞게 삽입한 후, 최종적으로 클라이언트에게 전송되는 HTML 문서로 변환하여 사용자에게 동적으로 생성된 웹 페이지를 제공한다.

📌 View Template

  • View Template은 Model을 참고하여 HTML 등이 동적으로 만들어지고 Client에 응답된다.
  • Spring Boot는 기본적으로 View Template 경로(src/main/resources/templates)를 설정한다.
  • build.gradle에 Thymeleaf 의존성을 추가하면 ThymeleafViewResolver와 필요한 Spring Bean들이 자동으로 등록된다.
  1. @Controller의 응답으로 String을 반환하는 경우
    • @ResponseBody 가 없으면 View Resolver가 실행되며 View를 찾고 Rendering한다.
@Controller
public class ViewTemplateController {
	
	@RequestMapping("/response-view")
  public String responseView(Model model) {
      // key, value
      model.addAttribute("data", "sparta");

      return "thymeleaf-view";
  }
	
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <h1>Thymeleaf</h1>
    <h2 th:text="${data}"></h2>
</body>
</html>
  • @ResponseBody 가 있으면 HTTP Message Body에 return 문자열 값이 입력된다.
  1. 반환 타입이 void인 경우
    • 잘 사용하지 않는다.
    • @Controller + (@ResponseBody, HttpServletResponse, OutputStream)과 같은 HTTP Message Body를 처리하는 파라미터가 없으면 RequestMapping URL을 참고하여 View Name으로 사용한다.
	// thymeleaf-view.html 과 Mapping된다.
    @RequestMapping("/thymeleaf-view")
    public void responseViewV2(Model model) {
        model.addAttribute("data", "sparta");
    }

HTTP Message Body(응답)

REST API를 만드는 경우 Server에서 Client로 HTML을 전달하는 방식이 아닌 HTTP Message Body에 직접 Data를 JSON 형식으로 담아 전달한다.

⛔️ 정적 리소스, View Template도 HTTP Message Body에 담겨 전달된다. HTTP 응답 데이터 안의 정적 HTML, View Template을 보고 브라우저가 화면에 그려주는 것이다.

  1. HttpServletResponse 사용
@GetMapping("/v1/response-body")
    public void responseBodyV1(
            HttpServletResponse response
    ) throws IOException {
        // HttpServletResponse 객체를 사용한다.
        response.getWriter().write("data");
    }
  1. ResponseEntity<> 사용
@GetMapping("/v2/response-body")
    public ResponseEntity<String> responseBodyV2() {

        return new ResponseEntity<>("data", HttpStatus.OK);
    }

HttpStatus Enum 상태 코드를 전달할 수 있다.

  1. @ResponseBody(TEXT, JSON) 사용
	// TEXT 데이터 통신
    @ResponseBody
    @GetMapping("/v3/response-body-text")
    public String responseBodyText() {

        return "data"; // HTTP Message Body에 "data"
    }
// JSON 데이터 통신
    @ResponseBody
    @GetMapping("/v3/response-body-json")
    public Tutor responseBodyJson() {

        Tutor tutor = new Tutor("wonuk", 100);

        return tutor; // HTTP Message Body에 Member Object -> JSON
    }
  • View를 사용하는 것이 아닌 HTTP Message Converter를 통해 HTTP Message Body를 직접 입력할 수 있다. → ResponseEntity와 같음
  • @ResponseStatus 를 사용하여 상태 코드를 지정할 수 있다.
  1. ResponseEntity<Object>(JSON)
@ResponseBody
    @GetMapping("/v5/response-body")
    public ResponseEntity<Tutor> responseBody() {

        Tutor tutor = new Tutor("wonuk", 100);

        return new ResponseEntity<>(tutor, HttpStatus.OK);
    }
  • ResponseEntity<>두 번째 파라미터에 Enum을 사용하여 상태 코드를 바꿀 수 있다.
  • HTTP Message Converter를 통하여 JSON 형태로 변환되어 반환된다.
  • 동적으로 응답 코드를 변경할 수 있다.

정리

  • 요청
    • @RequestParam, @ModelAttribute, @RequestBody
  • 응답
    • 정적 리소스, View Template(@Controller), @ResponseBody, ResponseEntity
profile
안녕하세요 :)

0개의 댓글