59일차 (1) - 스프링 (Request Handling, Response Handling)

Yohan·2024년 5월 16일
0

코딩기록

목록 보기
86/156
post-custom-banner

스프링 MVC의 주요 컴포넌트

DispatcherServlet

  • 스프링 MVC의 핵심 컴포넌트로, 클라이언트의 요청을 받아들이고 적절한 핸들러에게 요청을 전달합니다. 또한, 컨트롤러에서 반환된 결과를 HTTP 응답으로 변환하여 클라이언트에게 반환합니다.

HandlerMapping

  • DispatcherServlet이 클라이언트의 요청을 받았을 때, 요청을 처리할 핸들러(Controller)를 찾아주는 역할을 합니다.

Controller

  • 클라이언트의 요청을 처리하고, 요청에 대한 비즈니스 로직을 실행하여 결과를 반환합니다.

ViewResolver

  • Controller에서 반환한 결과를 보여줄 View를 찾아주는 역할을 합니다.

View

  • Controller에서 반환한 결과를 실제로 화면에 출력하는 역할을 합니다.

스프링 MVC의 구성 요소

Model

Controller에서 생성된 결과를 담는 객체입니다. View에서 출력할 데이터를 담아서 전달됩니다.

View

Controller에서 생성된 Model을 출력하기 위한 템플릿 역할을 합니다.

Controller

클라이언트의 요청을 받아 Model 객체를 생성하고, 생성된 Model을 View에 전달합니다.


스프링의 큰 흐름

  • 스프링은 DispatcherServlet을 중심으로 요청을 받고 -> 적절한 핸들러(Controller)에게 전달하여 요청을 처리 -> 그 결과를 View로 변환 -> 변환된 View는 응답으로 클라이언트에게 전달

Request Handling (요청 처리)

// 1. 요청 처리
@Controller
@RequestMapping("/spring/chap01/*")
public class BasicController {
    // 디테일한 URL
    // URL : /spring/chap01/hello
    @RequestMapping("/hello")
    public String hello() {
        System.out.println("hello 요청");

        // /WEB-INF/views/hello.jsp
        return "hello"; // hello.jsp로 포워딩
    }
 }
  • 요청 처리에 대한 형태. @Controller 를 명시함으로써 클라이언트의 요청을 처리하는 부분임을 알 수 있다.
  • @RequestMapping 을 통해 URL에 대한 매핑 지정
    • 바깥쪽에 있는 부분은 전체 URL, 안쪽 부분은 * 부분에 대한 URL 매핑
  • View의 이름을 반환한다. (jsp)

요청 파라미터 (Query String) 읽기

  • URL에 붙어있거나 form태그에서 전송된 데이터

1. HttpServletRequest 사용

  • request.getParameter를 통해서 요청 파라미터를 읽을 수 있다.
    @RequestMapping("/person")
    public String person(HttpServletRequest request) {
        System.out.println("/person!!!");
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "";
    }

2. @RequestParam 사용

	// /spring/chap01/major?stu=kim&major=business&grade=3
    @RequestMapping("/major")
    public String major(
            // @RequestParam 생략가능
            // url에 major라고 쓰는것 나는 mj라고 부르겠다 -> 생략 불가능
            @RequestParam String stu,
            @RequestParam("major") String mj,
            int grade) {

        System.out.println("stu = " + stu);
        System.out.println("major = " + mj);
        System.out.println("grade = " + grade);

        return "";
    }

3. 커맨드 객체 (RequestDTO) 사용해서 요청 파라미터 한 번에 읽어오기

  • 요청 파라미터가 많을 때 따로 클래스를 만들어서 getter, setter로 불러와서 사용
// ex) /spring/chap01/order?orderNum=22&goods=구두&amount=3&price=20000...
    @RequestMapping("/order")
    public String order(OrderDto order) {

        System.out.println("주문번호 = " + order.getOrderNum());
        System.out.println("주문상품명 = " + order.getGoods());
        System.out.println("주문개수 = " + order.getAmount());
        System.out.println("주문가격 = " + order.getPrice());

        return "";
    }
  • dto
package com.study.springstudy.springmvc.chap01;

public class OrderDto {

    private int orderNum;
    private String goods;
    private int amount;
    private int price;

    // getter, setter 생략
}

Response Handling (응답 처리)

  • Spring MVC에서 JSP로 Model이나 ModelAndView를 통해 데이터를 전달

1. Model

@Controller
public class ResponseController {

    // JSP파일로 포워딩할 때 데이터 전달하기
    // 1. Model 객체 사용
    @RequestMapping("/hobbies")
    public String hobbies(Model model) {

        model.addAttribute("name", "김철수");
        model.addAttribute("hobbies", List.of("축구", "수영", "영화보기"));

        model.addAttribute("major", "경영학");

        return "mvc/hobbies";
    }
 }
  • /hobbies 라는 URL로 매핑
  • 김철수 라는 데이터를 name이라는 속성으로 View에 전달, List도 hobbies라는 이름으로, 경영학이라는 데이터를major로 전달한다.
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<body>

    <h1>[${name}] 취미 목록</h1>
    <ol>
        <%-- for (String h : hList) --%>
        <c:forEach var="h" items="${hobbies}">
            <%-- 이건 주석입니다 --%>
            <li>${h}</li>
        </c:forEach>
    </ol>
    
    <h2>나의 전공: ${major}</h2>

</body>
</html>
  • 위처럼 ${}에 넣어서 사용할 수 있다.

2. ModelAndView

    // 2. ModelAndView 객체 사용하기
    @RequestMapping("/hobbies2")
    public ModelAndView hobbies2() {
        ModelAndView mv = new ModelAndView("mvc/hobbies");

        mv.addObject("name", "박영희");
        mv.addObject("hobbies", List.of("멍때리기", "맛집가기"));
        mv.addObject("major", "컴퓨터 과학");

        return mv;
    }
  • /hobbies2 라는 URL로 매핑
  • Model과 마찬가지로 addObject를 통해 View로 전달하고있다.

profile
백엔드 개발자
post-custom-banner

0개의 댓글