전에 목록까지 구현을 했기 때문에 목록 옆에 자신이 작성한 게시물은 수정하기 버튼이 생기도록 만들어야 하는데, 수정 페이지는 게시물마다 내용이 다르고, ID값을 받아야 하기 때문에 세션을 사용하기보단 URL에 변수를 넣어 컨트롤러에 값을 전달하는 방식을 사용하기로 했다.
[ 타임리프에서 URL에 변수 넣기 ]
타임리프에서 th:href나 th:action 같은 친구들은 url을 사용하기 때문에 url에 변수를 넣어줄 수 있다. 기본 문법은 @{}이고, 중괄호 안에 URL을 추가해주면 된다. 만약 변수를 넣고 싶은 부분이 있다면 {변수명}을 해주면 된다.
th:href="@{/article/articlePage/{id}/view (id=${article.id})}"
나 같은 경우는 {id}로 선언을 한 후에 변수에 값을 정의해주었다.
[ 컨트롤러에서 URL 안의 변수 전달받기 ]
컨트롤러에서는 @PathVariable이라는 어노테이션을 사용하여 URL 안의 변수를 받을 수 있다. 이 때, 변수명을 제대로 지정해주어야 한다. 만약 "~~~.~~" 형식으로 점이 있다면 점 대신에 점 오른쪽의 글자를 대문자로 바꿔주어야 한다.
@GetMapping("/article/articlePage/{articleId}/update")
public String articleUpdateForm(@PathVariable("articleId") Long articleId, Model model) {
[ 기능 구현 ]
전에 했던 내용을 재탕하는 수준이기 때문에 간략히 설명하고 끝내겠다. Get방식에선 빌더로 ArticleUpdateForm에 게시물 ID와 원래 제목, 원래 내용을 넣어준 후 model에 추가해준다. 그 후 웹에서 값을 받아 Post방식으로 넘겨주면 @PathVariable을 통해서 URL의 게시물ID값을 받아주고, HttpServletRequest로 세션을 통해 유저ID값을 받아준다. 그리고 유저 엔티티를 유저ID값을 이용해 조회한 후 유저아이디값과 게시물 테이블의 아이디값이 다를 경우에 홈화면으로 반환한다. 수정한 제목이 다른 게시물의 제목과 같으면 안되기 때문에 중복 체크 처리를 해준다. 그 후 체크박스 체크여부에 따라 공개/비공개를 설정한 후에 빌더로 엔티티를 구성하고 변경감지를 통해 업데이트를 해주고, 게시물 목록으로 들어가도록 반환한다.
@PostMapping("/article/articlePage/{originFormId}/update")
public String articleUpdate(@PathVariable("originFormId") Long articleId,
@Valid @ModelAttribute ArticleUpdateForm form,
BindingResult result,
HttpServletRequest request,
Model model) {
List<Article> compareArt = articleService.findByTitle(form.getUpdateTitle());
if (!compareArt.isEmpty()) {
Article article = articleService.findOne(articleId);
ArticleUpdateForm articleUpdateForm = ArticleUpdateForm.builder()
.id(articleId)
.originTitle(article.getTitle())
.originBody(article.getBody())
.build();
model.addAttribute("updateForm", articleUpdateForm);
result.rejectValue("updateTitle", "sameTitle");
log.info("errorCode = {}", result);
return "article/ArticleUpdate";
}
HttpSession session = request.getSession();
Long userId = (Long) session.getAttribute("Id");
User user = userService.findOne(userId);
Article checkArt = articleService.findOne(articleId);
if (!checkArt.getWriteUser().equals(user.getLoginId())) {
return "redirect:/";
}
ArticleStatus status;
if (form.getStatus()) {
status = ArticleStatus.PRIVATE;
} else {
status = ArticleStatus.PUBLIC;
}
Article article = Article.builder()
.id(articleId)
.title(form.getUpdateTitle())
.body(form.getUpdateBody())
.status(status)
.build();
articleService.updateArticle(article);
Article viewArt = articleService.findOne(articleId);
model.addAttribute("articles", viewArt);
model.addAttribute("user", user);
model.addAttribute("articleList", new ArticleListForm());
return "article/ArticleList";
}
후기
어떤 방식으로 글을 작성해야 보시는 분들에게 도움이 되고, 나중에 내가 볼 때도 보기 편할지 계속 고민하고 바꿔보고 있는데 어떨지 모르겠다. 생략한 부분들은 그 전에 글들 보시면 다 적혀 있으므로 참고 바란다.
'개발일지_development diary > YSit' 카테고리의 다른 글
YSit [14] - 관리자 페이지 구현 & 권한 구현하기 (0) | 2022.12.31 |
---|---|
YSit [13] - 댓글 기능 구현하기 (2) | 2022.12.30 |
YSit [11] - 게시물 작성 / 목록 기능 구현 (0) | 2022.12.28 |
YSit [10] - 세션 사용하여 쿠키 대체하기 (0) | 2022.12.28 |
YSit [9] - 유저 데이터 수정하기, 로그아웃하기 ( 쿠키 사용 ) (0) | 2022.12.27 |