form에서 들어오는 데이터를 검증할 때 지금까지는 Validator 만들고 initBinder에 등록했는데, 다른 방법을 사용할 수도 있다.
study/study.html
<form class="col-sm-12 needs-validation" th:action="@{'/study/' + ${study.path} + '/settings/study/path'}"
method="post" novalidate>
<div class="alert alert-warning" role="alert">
스터디 경로를 수정하면 이전에 사용하던 경로로 스터디에 접근할 수 없으니 주의하세요. <br/>
</div>
<div class="form-group">
<input id="path" type="text" name="newPath" th:value="${study.path}" class="form-control"
placeholder="예) study-path" aria-describedby="pathHelp" required>
<small id="pathHelp" class="form-text text-muted">
공백없이 문자, 숫자, 대시(-)와 언더바(_)만 3자 이상 20자 이내로 입력하세요. 스터디 홈 주소에 사용합니다. 예) /study/<b>study-path</b>
</small>
<small class="invalid-feedback">스터디 경로를 입력하세요.</small>
<small class="form-text text-danger" th:if="${studyPathError}" th:text="${studyPathError}">Path Error</small>
</div>
<div class="form-group">
<button class="btn btn-outline-warning" type="submit" aria-describedby="submitHelp">경로 수정</button>
</div>
</form>
StudySettingsController.java
@PostMapping("/study/path")
public String updateStudyPath(@CurrentAccount Account account, @PathVariable String path, String newPath,
Model model, RedirectAttributes attributes) {
Study study = studyService.getStudyToUpdateStatus(account, path);
if (!studyService.isValidPath(newPath)) {
model.addAttribute(account);
model.addAttribute(study);
model.addAttribute("studyPathError", "해당 스터디 경로는 사용할 수 없습니다. 다른 값을 입력하세요.");
return "study/settings/study";
}
studyService.updateStudyPath(study, newPath);
attributes.addFlashAttribute("message", "스터디 경로를 수정했습니다.");
return "redirect:/study/" + getPath(newPath) + "/settings/study";
}
데이터를 @RequestParam newPath 으로 바로 받았다. 사실 @RequestParam 는 생략이 가능하다. 모델 에트리뷰트처럼! form에서 넘어오는 데이터를 form data에 주지 않고 그냥 input에다가 name을 주고 newPath로 받아왔다. 그리고 th:field 대신에 th:value를 사용 🙌
스터디 이름은 중복 체크를 하지 않음
왜 StudySettingsControlller.java 에 위치시키지 않고 StudyController.java 에다가 만들었을까?
@Controller
@RequestMapping("/study/{path}/settings")
@RequiredArgsConstructor
public class StudySettingsController {
...
}
StudySettingsController.java 에 RequestMapping이 /study/{path}/settings 로 기본값을 셋팅해주고 있기 때문에 StudyController.java에 controller를 만들었다.
form ui 때문에 postMapping을 사용하면 이상하게 보여서 일단 getMapping을 사용하였음.
StudySettingsController 와 StudyController 가 모두 Study의 getEncodedPath 를 통해 가져오도록
변경
출처 : 인프런 백기선님의 스프링과 JPA 기반 웹 애플리케이션 개발