[Spring] form태그 하나로 등록, 수정 함께 컨트롤하기

류넹·2024년 3월 21일
1

Spring

목록 보기
44/50

<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가 치환될 위치
	}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글