20250808 - retrun viewName with binding

창훈·2025년 8월 8일

좋은 질문이에요! return "question_form"처럼 뷰를 다시 렌더링할 때 사용자가 입력한 값이 그대로 남아 있는 이유는 주로 다음과 같은 Spring MVC의 동작 방식과 개발자의 코드 처리 덕분입니다.


🧠 왜 입력값이 유지될까?

입력값이 유지되는 이유는 보통 다음 두 가지 방식 중 하나로 처리되기 때문입니다:


1️⃣ Model에 사용자 입력값을 다시 담아서 뷰에 전달

예를 들어, 사용자가 폼을 제출했는데 권한 문제나 내부 오류로 인해 등록이 실패한 경우, 컨트롤러에서 다음과 같이 처리합니다:

@PostMapping("/question/create")
public String createQuestion(@ModelAttribute QuestionForm questionForm, Model model) {
    if (권한없음 || 내부오류) {
        model.addAttribute("questionForm", questionForm); // 사용자가 입력한 값 유지
        model.addAttribute("errorMessage", "권한이 없습니다.");
        return "question_form"; // 입력값을 포함한 뷰 반환
    }

    // 정상 처리 로직...
}
  • @ModelAttribute로 받은 questionForm 객체는 사용자의 입력값을 담고 있음
  • 이를 다시 model.addAttribute()로 뷰에 넘기면, 템플릿에서 해당 값을 그대로 출력 가능

2️⃣ Thymeleaf나 JSP에서 폼 필드에 바인딩된 값 출력

템플릿에서 다음과 같이 작성되어 있다면, questionForm의 필드 값이 자동으로 채워집니다:

<input type="text" name="title" th:value="${questionForm.title}" />
<textarea name="content" th:text="${questionForm.content}"></textarea>
  • th:valueth:text는 모델에 담긴 객체의 값을 그대로 출력
  • 따라서 사용자가 입력한 값이 사라지지 않고 유지됨

💡 추가 팁: BindingResult를 활용한 검증 오류 처리

입력값 검증 실패 시에도 입력값을 유지하려면 BindingResult를 함께 사용합니다:

@PostMapping("/question/create")
public String createQuestion(@Valid QuestionForm questionForm, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "question_form"; // 검증 실패 시 입력값 유지
    }

    // 등록 처리...
}

Spring은 BindingResult가 오류를 포함하고 있을 경우, 자동으로 입력값을 다시 뷰에 전달해줍니다.


✅ 요약

이유설명
Model에 입력값을 다시 담음컨트롤러에서 사용자 입력값을 뷰로 전달
템플릿에서 값 바인딩${questionForm.title} 등으로 입력값 출력
BindingResult 사용검증 오류 시 자동으로 값 유지

혹시 특정 상황에서 값이 사라지는 문제가 있다면, 코드 예시를 보여주시면 함께 분석해볼 수도 있어요!

profile
한줄소개불가

0개의 댓글