Spring MVC에서 폼 데이터를 처리하는 다양한 방식을 통해 모델을 이해
MVC 패턴 이해
- Model: 데이터와 비즈니스 로직을 담당. 컨트롤러에서 데이터를 준비하여 뷰로 전달.
- View: 사용자 인터페이스(UI)를 담당. Model 데이터를 바탕으로 화면 렌더링.
- Controller: 사용자의 요청을 처리하고, 적절한 데이터를 준비하여 뷰를 반환.
폼 데이터 흐름
- 클라이언트가 HTML 폼 데이터를 전송.
- 컨트롤러가 데이터를 수신하고 처리.
- 데이터를 뷰로 전달하여 사용자에게 결과를 반환.
수업코드
package com.example.model.controller;
import com.example.model.dto.FormTO;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ConfigController {
// 기본 폼 페이지를 반환합니다.
@RequestMapping("/form")
public String form() {
return "form";
}
// HttpServletRequest를 사용하여 폼 데이터를 처리하는 방식
@RequestMapping("/form_ok")
public String form_ok(HttpServletRequest request) {
// 요청 객체에서 폼 데이터를 가져옵니다.
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
// 데이터를 request 객체에 설정하여 뷰에서 사용할 수 있도록 합니다.
request.setAttribute("userid", userid);
request.setAttribute("userpw", userpw);
return "form_ok";
}
// Model 객체를 사용하여 데이터를 전달하는 방식
@RequestMapping("/form_ok2")
public String form_ok2(HttpServletRequest request, Model model) {
// 요청 객체에서 폼 데이터를 가져옵니다.
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
// 데이터를 Model 객체에 추가하여 뷰에서 사용할 수 있도록 합니다.
model.addAttribute("userid", userid);
model.addAttribute("userpw", userpw);
return "form_ok";
}
// ModelAndView를 사용하여 뷰와 데이터를 동시에 설정하는 방식
@RequestMapping("/form_ok3")
public ModelAndView form_ok3(HttpServletRequest request) {
// 요청 객체에서 폼 데이터를 가져옵니다.
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
// ModelAndView 객체를 생성하고 뷰와 데이터를 설정합니다.
ModelAndView modelAndView = new ModelAndView("form_ok");
modelAndView.addObject("userid", userid);
modelAndView.addObject("userpw", userpw);
return modelAndView;
}
// 사용자 정의 객체(FormTO)를 사용하여 데이터를 처리하고 Model 객체에 추가하는 방식
@RequestMapping("/form_ok4")
public String form_ok4(FormTO to, Model model) {
// FormTO 객체에서 데이터를 가져옵니다.
String userid = to.getUserid();
String userpw = to.getUserpw();
// FormTO 객체를 Model 객체에 추가하여 뷰에서 그대로 사용할 수 있도록 설정합니다.
model.addAttribute("to", to);
// form_ok2.jsp를 반환합니다 (기존 form_ok와 다른 뷰를 사용).
return "form_ok2";
}
// @ModelAttribute를 사용하여 데이터를 처리하는 방식
@RequestMapping("/form_ok5")
public String form_ok5(@ModelAttribute("to") FormTO to) {
// FormTO 객체가 자동으로 바인딩되며, 데이터를 뷰에서 바로 사용 가능합니다.
// 필요 시 FormTO 객체 데이터를 수정할 수도 있습니다.
// 예: to.setUserid("new id"); to.setUserpw("123456");
return "form_ok2";
}
}
2. Spring MVC 폼 데이터 처리 방식
2.1 HttpServletRequest
- 개념:
- Servlet API를 사용하여 HTTP 요청 데이터를 직접 처리.
- 폼 데이터는 요청 파라미터로 전달되며, request.getParameter(String key)를 통해 데이터를 읽음.
- 특징:
- 가장 기본적인 방식으로, HTTP 요청 객체를 직접 다룰 수 있음.
- 복잡한 데이터 처리에는 비효율적이며 코드의 가독성이 떨어질 수 있음.
- 예시 상황:
- 초기 단계의 웹 애플리케이션.
- 기본적인 요청/응답 흐름을 이해하기 위한 실습.
2.2 Model
- 개념:
- Spring MVC의 Model 객체를 사용해 데이터를 뷰로 전달.
- 데이터를 뷰에서 접근 가능하도록 키-값 쌍으로 저장.
- 특징:
- 데이터 전달과 뷰 렌더링을 분리하여 코드 가독성을 높임.
- MVC 패턴에서 컨트롤러가 데이터를 준비하고 뷰는 렌더링만 담당.
- 예시 상황:
- 여러 데이터를 뷰로 전달해야 하는 경우.
- 뷰 템플릿(Thymeleaf, JSP 등)에서 데이터를 활용.
2.3 ModelAndView
- 개념:
- ModelAndView는 데이터와 뷰를 동시에 설정할 수 있는 객체.
- 뷰 이름과 데이터를 한 곳에서 관리.
- 특징:
- 유연성이 높아 데이터와 뷰를 명시적으로 제어 가능.
- 단순한 경우에는 Model보다 코드가 복잡할 수 있음.
- 예시 상황:
- 뷰와 데이터를 동적으로 설정해야 하는 경우.
- 뷰의 이름을 조건에 따라 변경할 필요가 있는 경우.
2.4 사용자 정의 객체 (DTO/VO)
- 개념:
- DTO(Data Transfer Object) 또는 VO(Value Object)를 사용해 폼 데이터를 객체로 매핑.
- 컨트롤러에서 객체를 사용해 데이터 전달.
- 특징:
- 데이터 구조를 명확히 정의하여 코드 가독성 향상.
- 데이터 검증과 변환 로직을 DTO 내에서 처리 가능.
- 예시 상황:
- 데이터 필드가 많거나, 폼 데이터가 구조화되어 있을 때.
- 데이터 바인딩 및 유효성 검증이 필요한 경우.
2.5 @ModelAttribute
- 개념:
- Spring MVC에서 폼 데이터를 특정 객체로 자동 매핑.
- 요청 파라미터와 객체의 필드 이름이 일치하면 자동으로 바인딩.
- 특징:
- 명시적인 데이터 바인딩 코드를 줄이고, 데이터 구조 변경 시 유연하게 대응 가능.
- 뷰에서 객체 전체를 활용할 수 있음.
- 예시 상황:
- 대규모 폼 데이터를 처리하거나, 재사용 가능한 객체를 뷰에 전달할 때.
- MVC 패턴에서 Model과 데이터 바인딩을 간소화하고 싶을 때.