반응형
<form>
태그에서 th:action="URL경로"를 지정하지 않은 경우
-<form>
의 th:action 속성값은 주소창의 URL 경로가 된다.
💡 예시
1. html
<form class="border bg-light p-3" method="post" th:object="${postForm}">
<div class="form-group mb-3">
<label class="form-label">제목</label>
<input type="text" th:field="*{title}" class="form-control" />
<div th:errors="*{title}" class="text-danger"></div>
</div>
<div class="form-group mb-3">
<label class="form-label">내용</label>
<textarea rows="5" th:field="*{content}" class="form-control"></textarea>
<div th:errors="*{content}" class="text-danger"></div>
</div>
<div class="text-end">
<button type="submit" class="btn btn-primary">등록하기</button>
</div>
</form>
2. Controller
1) 새 게시글 등록
- 등록화면 요청 : GET방식, /post/create
- 등록 요청 : POST방식
@PreAuthorize("isAuthenticated()") // 로그인하지 않은 상태에서 url로 진입 시, 로그인폼으로 이동
@GetMapping("/create")
public String form(Model model) {
// 등록 오류났을 때 입력해놨던 값 다시 보여주기 위해 입력된 값을 담아놓을 폼 생성
model.addAttribute("postForm", new PostForm());
return "post/form"; // "src/main/resources/templates/post/form.html"
}
@PreAuthorize("isAuthenticated()")
@PostMapping("/create")
public String create(@Valid PostForm postForm, BindingResult errors, Principal principal) {
if (errors.hasErrors()) {
return "post/form";
}
postService.createPost(postForm, principal.getName());
return "redirect:/post/list";
}
2) 게시글 수정
- 수정화면 요청 : GET방식, /post/modify/1001
- 수정 요청 : POST방식
// 상세페이지에서 수정 버튼 클릭
@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String form(@PathVariable("id") Long id, Principal principal, Model model) {
Post post = postService.getPostDetail(id);
// post.getUser().getUsername() : 게시글 작성자 아이디
// principal.getName() : 로그인한 사용자 아이디
if (!post.getUser().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "다른 작성자의 게시글은 수정할 수 없습니다.");
}
PostForm postForm = new PostForm();
postForm.setTitle(post.getTitle());
postForm.setContent(post.getContent());
model.addAttribute("postForm", postForm);
return "post/form"; // "src/main/resources/templates/post/form.html"
}
// 수정폼에서 수정버튼 클릭
@PreAuthorize("isAuthenticated()")
@PostMapping("/modify/{id}") // @Valid와 BindingResult는 항상 바로 옆에 붙어있어야 함. 순서 유지
public String modify(@PathVariable("id") Long id, @Valid PostForm postForm, BindingResult errors, Principal principal) {
if (errors.hasErrors()) {
return "post/form";
}
Post post = postService.getPostDetail(id);
if (!post.getUser().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "다른 작성자의 게시글은 수정할 수 없습니다.");
}
postService.updatePost(postForm, post);
return String.format("redirect:/post/detail?id=%d", id); // %d : 매개변수 id가 치환될 위치
}
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-form태그-하나로-등록-수정-함께-컨트롤하기
'BackEnd > Spring' 카테고리의 다른 글
[Spring JPA] Spring Data JPA의 쿼리 메소드 작성 규칙 (0) | 2025.01.19 |
---|---|
[Spirng JPA] 단방향/양방향 연관관계 (0) | 2025.01.19 |
[Spring JPA] Spring Data JPA의 페이징 처리 (0) | 2025.01.19 |
[Spring] Thymeleaf로 데이터를 출력하는 법, 표현식 유틸리티 객체 (1) | 2025.01.18 |
[Spring] Spring Data JPA 설정 - 정의한 JPA Entity 클래스로 테이블 자동 생성되도록 설정하기 (1) | 2025.01.18 |