[Spring] Model과 ModelAttribute의 사용

ma0·2024년 9월 10일

JSP

목록 보기
2/7

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>

  • 1에서 userDTO 객체가 모델에 추가
  • 2에서 ${userDTO.userId}${userDTO.userName}을 사용해 데이터를 출력, 폼에 값 채우기



ModelAttributes

= 폼 데이터를 바인딩하고 자동으로 Model에 데이터를 추가하는 역할

= 컨트롤러 메소드의 매개변수나 반환 값을 모델에 자동으로 바인딩, 모델에 특정 객체를 추가하는 역할. 주로 1) 폼 데이터를 자동으로 객체에 매핑할 때 사용되며, 2) 요청에서 전달된 파라미터 값을 해당 객체의 필드에 매핑해줍니다.

주요 기능

  1. 폼 데이터 바인딩
    = 클라이언트(.HTML)로부터 전송된 데이터를 자동으로 UserDTO 객체에 바인딩
    => 폼에서 전송된 파라미터 = 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");

  1. 모델에 객체 추가
    = @ModelAttribute 로 매핑된 객체는 자동으로 Model 객체에도 추가
    => JSPThymeleaf 같은 템플릿 엔진에서 해당 객체에 쉽게 접근 可

ex)
@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>

  1. 미리 설정된 모델 데이터 초기화
    = @ModelAttribute는 컨트롤러 메소드 외에도 메소드 위에 선언할 수 있고, 이 경우 해당 객체는 해당 요청이 처리되기 전에 모델에 추가되어 템플릿에서 사용할 수 있게 됨
    @ModelAttribute("user")
    public UserDTO addUserToModel() {
      return new UserDTO();
    }

@ModelAttribure 동작 방식

  1. 스프링은 HTTP 요청이 들어오면 요청 파라미터(예: userId=..., userName=...)를 읽어들이고, 이 파라미터들을 해당 객체(UserDTO)의 필드에 자동으로 매핑
  2. 매핑이 완료된 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:/";	// ???
	}
profile
우당탕탕 개발 간잽 일기 - 간잽이 수백 번이면 전문가일지도?

0개의 댓글