리팩토링, 퍼사드 패턴 고려중

This commit is contained in:
jinia91
2022-04-08 20:20:37 +09:00
parent 917c21bbca
commit 3aa18022a1
8 changed files with 99 additions and 119 deletions

View File

@@ -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<ArticleResponseForCardBox> 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<ArticleResponseForCardBox> articleList =
articleQueriesUseCase.getArticlesByTag(tagName, page);
Page<ArticleResponseForCardBox> 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<ArticleResponseForCardBox> articleList =
articleQueriesUseCase.getArticlesByKeyword(keyword, page);
Page<ArticleResponseForCardBox> 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<ArticleResponseByCategory> articleTitlesSortByCategory =
articleQueriesUseCase
HttpServletResponse response, Model model) {
addMemberInfoToModel(principal, model);
var articleResponseForDetail = articleQueriesUseCase.getArticleForDetail(articleId);
articleResponseForDetail.parseAndRenderForView(articleResponseForDetail.getContent());
List<ArticleResponseByCategory> 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;
}
/*
- 쿠키 추가 / 조회수 증가 검토
*/

View File

@@ -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

View File

@@ -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);

View File

@@ -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(),

View File

@@ -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(),

View File

@@ -17,4 +17,6 @@ public class ArticleResponseForCardBox {
private String thumbnailUrl;
private LocalDateTime createdDate;
}

View File

@@ -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<String> tags;
private LocalDateTime createdDate;
public void parseAndRenderForView(String content){
getHtmlRenderer().render(getParser().parse(content));
}
}

View File

@@ -0,0 +1,13 @@
package myblog.blog.shared.utils;
import java.util.List;
public class MetaTagBuildUtils {
static public String buildMetaTags(List<String> tags){
var metaTags = new StringBuilder();
for (String tag : tags) {
metaTags.append(tag).append(", ");
}
return metaTags.toString();
}
}