Model
= 데이터를 템플릿으로 전달하는 역할
= 컨트롤러에서 생성된 데이터를 뷰로 전달, 뷰에서 그 데이터를 출력하거나 활용할 수 있게 하는 역할. 즉, HTML이나 Thymeleaf 템플릿에서 데이터를 표시할 수 있게 해 준다.
1. Model 기본 예시
public class UserController {
@GetMapping("/userForm")
public String showForm(Model model) {
UserDTO userDTO = new UserDTO();
userDTO.setUserId("testUser");
userDTO.setUserName("홍길동");
model.addAttribute("userDTO", userDTO); // 모델에 데이터 추가
return "userForm"; // userForm.html을 렌더링
}
}
2. Thymeleaf 템플릿에서 데이터를 출력하는 예시
<!-- userForm.html -->
<form action="/updateUser" method="post">
<label for="userId">ID: </label>
<input type="text" id="userId" name="userId" value="${userDTO.userId}"><br>
<label for="userName">Name: </label>
<input type="text" id="userName" name="userName" value="${userDTO.userName}"><br>
<button type="submit">Update</button>
</form>
userDTO 객체가 모델에 추가${userDTO.userId}와 ${userDTO.userName}을 사용해 데이터를 출력, 폼에 값 채우기ModelAttributes
= 폼 데이터를 바인딩하고 자동으로
Model에 데이터를 추가하는 역할
= 컨트롤러 메소드의 매개변수나 반환 값을 모델에 자동으로 바인딩, 모델에 특정 객체를 추가하는 역할. 주로 1) 폼 데이터를 자동으로 객체에 매핑할 때 사용되며, 2) 요청에서 전달된 파라미터 값을 해당 객체의 필드에 매핑해줍니다.
폼에서 전송된 파라미터 = UserDTO 클래스의 필드 이름 시, 값이 자동으로 userDTO 객체에 채워짐 ex) 폼에서 데이터 전송 후 자동으로 DTO에 매핑
<form action="/user/update" method="post">
<input type="text" name="userId" value="testUser">
<input type="text" name="userName" value="홍길동">
<input type="password" name="userPwd" value="password123">
<button type="submit">수정</button>
</form>
userDTO.setUserId("testUser");
userDTO.setUserName("홍길동");
userDTO.setUserPwd("password123");
@ModelAttribute 로 매핑된 객체는 자동으로 Model 객체에도 추가JSP나 Thymeleaf 같은 템플릿 엔진에서 해당 객체에 쉽게 접근 可 @PostMapping("/update")
public String update(@ModelAttribute UserDTO userDTO, Model model) {
model.addAttribute("userDTO", userDTO); // 자동으로 모델에 추가
return "user/profile";
}
템플릿에서 userDTO 객체에 접근 가능
<p>User ID: ${userDTO.userId}</p>
<p>User Name: ${userDTO.userName}</p>
@ModelAttribute는 컨트롤러 메소드 외에도 메소드 위에 선언할 수 있고, 이 경우 해당 객체는 해당 요청이 처리되기 전에 모델에 추가되어 템플릿에서 사용할 수 있게 됨@ModelAttribute("user")
public UserDTO addUserToModel() {
return new UserDTO();
} @ModelAttribure 동작 방식UserDTO 객체는 해당 컨트롤러 메소드의 매개변수로 전달/**
* 개인 정보 수정을 위한 요청
* 비밀번호를 한 번 더 입력하는 페이지로 Forwarding
* @return
*/
@GetMapping("/mypage")
public String mypage() {
return "user/pwdCheck";
}
@PostMapping("/pwdCheck")
public String pwdCheck(
@RequestParam(name="userId") String userId,
@RequestParam(name="userPwd") String userPwd,
Model model
) {
log.info("id: {}, pwd: {}", userId, userPwd);
UserDTO userDTO = userService.pwdCheck(userId, userPwd); // userDTO에 받은 userId와 userPwd 저장
if(userDTO != null) { // 개인 정보 수정 화면으로 이동
model.addAttribute("userDTO", userDTO);
return "user/myInfoUpdate";
}
return "redirect:/";
}
/**
* 수정 처리 요청
* @return
*/
@PostMapping("/update")
public String update(
@ModelAttribute UserDTO userDTO
) {
log.info("==== {}", userDTO.toString());
boolean result = userService.update(userDTO); //
if(result) {
return "redirect:/user/logout"; // 개인 정보 수정 시 로그아웃 실시 - secutiryConfig에 설정돼 있음
}
return "redirect:/"; // ???
}