From 3aa18022a10fdc2968483b431b021ea9193adc75 Mon Sep 17 00:00:00 2001 From: jinia91 Date: Fri, 8 Apr 2022 20:20:37 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81,=20?= =?UTF-8?q?=ED=8D=BC=EC=82=AC=EB=93=9C=20=ED=8C=A8=ED=84=B4=20=EA=B3=A0?= =?UTF-8?q?=EB=A0=A4=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/incomming/ArticleController.java | 140 ++++++------------ .../article/application/ArticleService.java | 36 ++--- .../port/incomming/ArticleUseCase.java | 8 +- ...Request.java => ArticleCreateCommand.java} | 6 +- ...itRequest.java => ArticleEditCommand.java} | 6 +- .../response/ArticleResponseForCardBox.java | 2 + .../response/ArticleResponseForDetail.java | 7 + .../blog/shared/utils/MetaTagBuildUtils.java | 13 ++ 8 files changed, 99 insertions(+), 119 deletions(-) rename src/main/java/myblog/blog/article/application/port/incomming/request/{ArticleCreateRequest.java => ArticleCreateCommand.java} (81%) rename src/main/java/myblog/blog/article/application/port/incomming/request/{ArticleEditRequest.java => ArticleEditCommand.java} (82%) create mode 100644 src/main/java/myblog/blog/shared/utils/MetaTagBuildUtils.java diff --git a/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java b/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java index 30a3244..8c9279a 100644 --- a/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java +++ b/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java @@ -7,16 +7,16 @@ import myblog.blog.article.application.port.incomming.TagsQueriesUseCase; import myblog.blog.category.appliacation.port.incomming.CategoryQueriesUseCase; import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase; -import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest; -import myblog.blog.article.application.port.incomming.request.ArticleEditRequest; +import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand; +import myblog.blog.article.application.port.incomming.request.ArticleEditCommand; import myblog.blog.article.application.port.incomming.response.ArticleResponseByCategory; import myblog.blog.article.application.port.incomming.response.ArticleResponseForCardBox; -import myblog.blog.article.application.port.incomming.response.ArticleResponseForDetail; import myblog.blog.article.application.port.incomming.response.ArticleResponseForEdit; import myblog.blog.category.appliacation.port.incomming.response.CategoryViewForLayout; import myblog.blog.member.application.port.incomming.response.PrincipalDetails; import lombok.RequiredArgsConstructor; +import myblog.blog.shared.utils.MetaTagBuildUtils; import org.jsoup.Jsoup; import org.springframework.data.domain.*; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -51,18 +51,15 @@ public class ArticleController { model.addAttribute("articleDto", new ArticleForm()); return "article/articleWriteForm"; } - /* - - 아티클 작성 post 요청 - */ + @PostMapping("article/write") @Transactional String writeArticle(@Validated ArticleForm articleForm, - @AuthenticationPrincipal PrincipalDetails principal, - Errors errors, Model model) { - if (errors.hasErrors()) { - getArticleWriteForm(model); - } - Long articleId = articleUseCase.writeArticle(ArticleCreateRequest.from(articleForm,principal.getMemberId())); + @AuthenticationPrincipal PrincipalDetails principal, + Errors errors, Model model) { + if (errors.hasErrors()) getArticleWriteForm(model); + var command = ArticleCreateCommand.from(articleForm, principal.getMemberId()); + Long articleId = articleUseCase.writeArticle(command); articleUseCase.backupArticle(articleId); tempArticleUseCase.deleteTemp(); return "redirect:/article/view?articleId=" + articleId; @@ -79,19 +76,14 @@ public class ArticleController { model.addAttribute("articleDto", articleDto); return "article/articleEditForm"; } - /* - - 아티클 수정 요청 - */ @PostMapping("/article/edit") @Transactional String editArticle(@RequestParam Long articleId, @ModelAttribute ArticleForm articleForm) { - articleUseCase.editArticle(ArticleEditRequest.from(articleId, articleForm)); + var command = ArticleEditCommand.from(articleId, articleForm); + articleUseCase.editArticle(command); return "redirect:/article/view?articleId=" + articleId; } - /* - - 아티클 삭제 요청 - */ @PostMapping("/article/delete") @Transactional String deleteArticle(@RequestParam Long articleId) { @@ -107,34 +99,24 @@ public class ArticleController { @RequestParam int tier, @RequestParam int page, Model model) { - PagingBoxHandler pagingBoxHandler = + var pagingBoxHandler = PagingBoxHandler.createOf(page, getTotalArticleCntByCategory(category, categoryQueriesUseCase.getCategoryViewForLayout())); - - List articleDtoList = - articleQueriesUseCase.getArticlesByCategory(category, tier, pagingBoxHandler.getCurPageNum()); - - for(ArticleResponseForCardBox articleDto : articleDtoList){ + var articleDtoList = articleQueriesUseCase.getArticlesByCategory(category, tier, pagingBoxHandler.getCurPageNum()); + for(var articleDto : articleDtoList){ articleDto.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(articleDto.getContent()))).text()); } - layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("pagingBox", pagingBoxHandler); model.addAttribute("articleList", articleDtoList); - return "article/articleList"; } private int getTotalArticleCntByCategory(String category, CategoryViewForLayout categorys) { - - if (categorys.getTitle().equals(category)) { - return categorys.getCount(); - } else { - for (CategoryViewForLayout categoryCnt : - categorys.getCategoryTCountList()) { - if (categoryCnt.getTitle().equals(category)) - return categoryCnt.getCount(); - for (CategoryViewForLayout categoryCntSub : categoryCnt.getCategoryTCountList()) { - if (categoryCntSub.getTitle().equals(category)) - return categoryCntSub.getCount(); + if (categorys.getTitle().equals(category)) return categorys.getCount(); + else { + for (var categoryCnt : categorys.getCategoryTCountList()) { + if (categoryCnt.getTitle().equals(category)) return categoryCnt.getCount(); + for (var categoryCntSub : categoryCnt.getCategoryTCountList()) { + if (categoryCntSub.getTitle().equals(category)) return categoryCntSub.getCount(); } } } @@ -143,51 +125,36 @@ public class ArticleController { /* - 태그별 게시물 조회하기 */ - @Transactional @GetMapping("article/list/tag/") String getArticlesListByTag(@RequestParam Integer page, @RequestParam String tagName, Model model) { - Page articleList = - articleQueriesUseCase.getArticlesByTag(tagName, page); - + Page articleList = articleQueriesUseCase.getArticlesByTag(tagName, page); for(ArticleResponseForCardBox article : articleList){ article.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(article.getContent()))).text()); } - - PagingBoxHandler pagingBoxHandler = - PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); - + var pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxHandler); - return "article/articleListByTag"; } /* - 검색어별 게시물 조회하기 */ - @Transactional @GetMapping("article/list/search/") String getArticlesListByKeyword(@RequestParam Integer page, @RequestParam String keyword, Model model) { - Page articleList = - articleQueriesUseCase.getArticlesByKeyword(keyword, page); - + Page articleList = articleQueriesUseCase.getArticlesByKeyword(keyword, page); for(ArticleResponseForCardBox article : articleList){ article.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(article.getContent()))).text()); } - - PagingBoxHandler pagingBoxHandler = - PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); - + var pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxHandler); - return "article/articleListByKeyword"; - } /* - 아티클 상세 조회 @@ -202,49 +169,40 @@ public class ArticleController { String readArticle(@RequestParam Long articleId, @AuthenticationPrincipal PrincipalDetails principal, @CookieValue(required = false, name = "view") String cookie, - HttpServletResponse response, - Model model) { - // 1. 로그인 여부에 따라 뷰단에 회원정보 출력 여부 결정 - if (principal != null) { - model.addAttribute("member", principal.getMember()); - } else { - model.addAttribute("member", null); - } - - /* - 2.화면단을 위한 처리 - */ - ArticleResponseForDetail articleResponseForDetail = articleQueriesUseCase.getArticleForDetail(articleId); - articleResponseForDetail.setContent(getHtmlRenderer().render(getParser().parse(articleResponseForDetail.getContent()))); - - List articleTitlesSortByCategory = - articleQueriesUseCase + HttpServletResponse response, Model model) { + addMemberInfoToModel(principal, model); + var articleResponseForDetail = articleQueriesUseCase.getArticleForDetail(articleId); + articleResponseForDetail.parseAndRenderForView(articleResponseForDetail.getContent()); + List articleTitlesSortByCategory = articleQueriesUseCase .getArticlesByCategoryForDetailView(articleResponseForDetail.getCategory()); - - // 3. 메타 태그용 Dto 전처리 - StringBuilder metaTags = new StringBuilder(); - for (String tag : articleResponseForDetail.getTags()) { - metaTags.append(tag).append(", "); - } - - String substringContents = null; - if(articleResponseForDetail.getContent().length()>200) { - substringContents = articleResponseForDetail.getContent().substring(0, 200); - } - else substringContents = articleResponseForDetail.getContent(); - - // 4. 모델 담기 + String metaTags = MetaTagBuildUtils.buildMetaTags(articleResponseForDetail.getTags()); + String substringContents = getSubStringContentsFrom(articleResponseForDetail.getContent()); layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("article", articleResponseForDetail); model.addAttribute("metaTags",metaTags); model.addAttribute("metaContents",Jsoup.parse(substringContents).text()); model.addAttribute("articlesSortBycategory", articleTitlesSortByCategory); - - // 5. 조회수 증가 검토 및 증가 if(needToAddHitThroughCheckingCookie(articleId, cookie, response)) articleUseCase.addHit(articleId); - return "article/articleView"; } + + private void addMemberInfoToModel(PrincipalDetails principal, Model model) { + if (principal != null) { + model.addAttribute("member", principal.getMember()); + } else { + model.addAttribute("member", null); + } + } + + private String getSubStringContentsFrom(String content) { + String substringContents = null; + if(content.length()>200) { + substringContents = content.substring(0, 200); + } + else substringContents = content; + return substringContents; + } + /* - 쿠키 추가 / 조회수 증가 검토 */ diff --git a/src/main/java/myblog/blog/article/application/ArticleService.java b/src/main/java/myblog/blog/article/application/ArticleService.java index 250cdf5..ab3bf53 100644 --- a/src/main/java/myblog/blog/article/application/ArticleService.java +++ b/src/main/java/myblog/blog/article/application/ArticleService.java @@ -2,8 +2,8 @@ package myblog.blog.article.application; import lombok.RequiredArgsConstructor; -import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest; -import myblog.blog.article.application.port.incomming.request.ArticleEditRequest; +import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand; +import myblog.blog.article.application.port.incomming.request.ArticleEditCommand; import myblog.blog.article.application.port.incomming.ArticleUseCase; import myblog.blog.article.application.port.incomming.TagUseCase; import myblog.blog.category.appliacation.port.incomming.CategoryUseCase; @@ -35,32 +35,32 @@ public class ArticleService implements ArticleUseCase { @Override @CacheEvict(value = {"layoutCaching", "layoutRecentArticleCaching","seoCaching"}, allEntries = true) - public Long writeArticle(ArticleCreateRequest articleCreateRequest) { - Member writer = memberQueriesUseCase.findById(articleCreateRequest.getMemberId()); - Category category = categoryUseCase.findCategory(articleCreateRequest.getCategory()); - Article newArticle = new Article(articleCreateRequest.getTitle(), - articleCreateRequest.getContent(), - articleCreateRequest.getToc(), + public Long writeArticle(ArticleCreateCommand articleCreateCommand) { + Member writer = memberQueriesUseCase.findById(articleCreateCommand.getMemberId()); + Category category = categoryUseCase.findCategory(articleCreateCommand.getCategory()); + Article newArticle = new Article(articleCreateCommand.getTitle(), + articleCreateCommand.getContent(), + articleCreateCommand.getToc(), writer, - articleCreateRequest.getThumbnailUrl(), + articleCreateCommand.getThumbnailUrl(), category); articleRepositoryPort.save(newArticle); - tagUseCase.createNewTagsAndArticleTagList(articleCreateRequest.getTags(), newArticle); + tagUseCase.createNewTagsAndArticleTagList(articleCreateCommand.getTags(), newArticle); return newArticle.getId(); } @Override @CacheEvict(value = {"layoutCaching", "layoutRecentArticleCaching","seoCaching"}, allEntries = true) - public void editArticle(ArticleEditRequest articleEditRequest) { - Article article = articleRepositoryPort.findById(articleEditRequest.getArticleId()) + public void editArticle(ArticleEditCommand articleEditCommand) { + Article article = articleRepositoryPort.findById(articleEditCommand.getArticleId()) .orElseThrow(() -> new IllegalArgumentException("NotFoundArticleException")); - Category category = categoryUseCase.findCategory(articleEditRequest.getCategoryName()); + Category category = categoryUseCase.findCategory(articleEditCommand.getCategoryName()); tagUseCase.deleteAllTagsWith(article); - tagUseCase.createNewTagsAndArticleTagList(articleEditRequest.getTags(), article); - article.edit(articleEditRequest.getContent(), - articleEditRequest.getTitle(), - articleEditRequest.getToc(), - articleEditRequest.getThumbnailUrl(), category); + tagUseCase.createNewTagsAndArticleTagList(articleEditCommand.getTags(), article); + article.edit(articleEditCommand.getContent(), + articleEditCommand.getTitle(), + articleEditCommand.getToc(), + articleEditCommand.getThumbnailUrl(), category); } @Override diff --git a/src/main/java/myblog/blog/article/application/port/incomming/ArticleUseCase.java b/src/main/java/myblog/blog/article/application/port/incomming/ArticleUseCase.java index 13a9395..ba9430b 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/ArticleUseCase.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/ArticleUseCase.java @@ -1,14 +1,14 @@ package myblog.blog.article.application.port.incomming; -import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest; -import myblog.blog.article.application.port.incomming.request.ArticleEditRequest; +import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand; +import myblog.blog.article.application.port.incomming.request.ArticleEditCommand; import myblog.blog.article.domain.Article; import java.util.List; public interface ArticleUseCase { - Long writeArticle(ArticleCreateRequest articleCreateRequest); - void editArticle(ArticleEditRequest articleEditRequest); + Long writeArticle(ArticleCreateCommand articleCreateCommand); + void editArticle(ArticleEditCommand articleEditCommand); void deleteArticle(Long articleId); void addHit(Long articleId); void backupArticle(Long articleId); diff --git a/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateRequest.java b/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateCommand.java similarity index 81% rename from src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateRequest.java rename to src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateCommand.java index 0283cab..27ad14d 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateRequest.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleCreateCommand.java @@ -6,7 +6,7 @@ import myblog.blog.article.adapter.incomming.ArticleForm; @Getter @AllArgsConstructor -public class ArticleCreateRequest { +public class ArticleCreateCommand { private Long memberId; private String title; private String content; @@ -15,8 +15,8 @@ public class ArticleCreateRequest { private String category; private String tags; - static public ArticleCreateRequest from(ArticleForm articleForm, Long memberId){ - return new ArticleCreateRequest(memberId, + static public ArticleCreateCommand from(ArticleForm articleForm, Long memberId){ + return new ArticleCreateCommand(memberId, articleForm.getTitle(), articleForm.getContent(), articleForm.getToc(), diff --git a/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditRequest.java b/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditCommand.java similarity index 82% rename from src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditRequest.java rename to src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditCommand.java index ecbece7..a7a2d07 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditRequest.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/request/ArticleEditCommand.java @@ -6,7 +6,7 @@ import myblog.blog.article.adapter.incomming.ArticleForm; @Getter @AllArgsConstructor -public class ArticleEditRequest { +public class ArticleEditCommand { private Long articleId; private String title; @@ -16,8 +16,8 @@ public class ArticleEditRequest { private String categoryName; private String tags; - static public ArticleEditRequest from(Long articleId, ArticleForm articleForm){ - return new ArticleEditRequest(articleId, + static public ArticleEditCommand from(Long articleId, ArticleForm articleForm){ + return new ArticleEditCommand(articleId, articleForm.getTitle(), articleForm.getContent(), articleForm.getToc(), diff --git a/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForCardBox.java b/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForCardBox.java index 19e27a0..8f0f47a 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForCardBox.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForCardBox.java @@ -17,4 +17,6 @@ public class ArticleResponseForCardBox { private String thumbnailUrl; private LocalDateTime createdDate; + + } diff --git a/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForDetail.java b/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForDetail.java index 1d98161..b765572 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForDetail.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/response/ArticleResponseForDetail.java @@ -6,6 +6,9 @@ import lombok.Setter; import java.time.LocalDateTime; import java.util.List; +import static myblog.blog.shared.utils.MarkdownUtils.getHtmlRenderer; +import static myblog.blog.shared.utils.MarkdownUtils.getParser; + /* - 아티클 상세조회용 DTO */ @@ -21,4 +24,8 @@ public class ArticleResponseForDetail { private String category; private List tags; private LocalDateTime createdDate; + + public void parseAndRenderForView(String content){ + getHtmlRenderer().render(getParser().parse(content)); + } } diff --git a/src/main/java/myblog/blog/shared/utils/MetaTagBuildUtils.java b/src/main/java/myblog/blog/shared/utils/MetaTagBuildUtils.java new file mode 100644 index 0000000..81cd0f4 --- /dev/null +++ b/src/main/java/myblog/blog/shared/utils/MetaTagBuildUtils.java @@ -0,0 +1,13 @@ +package myblog.blog.shared.utils; + +import java.util.List; + +public class MetaTagBuildUtils { + static public String buildMetaTags(List tags){ + var metaTags = new StringBuilder(); + for (String tag : tags) { + metaTags.append(tag).append(", "); + } + return metaTags.toString(); + } +}