diff --git a/README.md b/README.md index 3158a80..bc3b625 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ https://www.jiniaslog.co.kr/ - AWS / 리눅스 기반 CI/CD 무중단 배포 인프라 구축 - JPA, Hibernate를 사용한 도메인 설계 - MVC 프레임워크 기반 백엔드 서버 구축 +- 헥사고날 아키텍처 ## 시스템 아키텍쳐 ![image](https://github.com/jinia91/blogBackUp/blob/main/img/57d1dfd7-22c1-4a5f-b6d5-ef635ae49307.png?raw=true) 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 d07c7fb..0a05e44 100644 --- a/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java +++ b/src/main/java/myblog/blog/article/adapter/incomming/ArticleController.java @@ -1,26 +1,23 @@ package myblog.blog.article.adapter.incomming; -import lombok.RequiredArgsConstructor; - import myblog.blog.article.application.port.incomming.ArticleUseCase; import myblog.blog.article.application.port.incomming.TempArticleUseCase; import myblog.blog.article.application.port.incomming.ArticleQueriesUseCase; import myblog.blog.article.application.port.incomming.TagsQueriesUseCase; import myblog.blog.category.appliacation.port.incomming.CategoryQueriesUseCase; -import myblog.blog.category.appliacation.port.incomming.CategoryUseCase; +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.category.appliacation.port.incomming.response.CategoryViewForLayout; 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 myblog.blog.shared.queries.LayoutRenderingQueries; - +import lombok.RequiredArgsConstructor; import org.jsoup.Jsoup; - import org.springframework.data.domain.*; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; @@ -44,11 +41,11 @@ public class ArticleController { private final TempArticleUseCase tempArticleUseCase; private final TagsQueriesUseCase tagsQueriesUseCase; private final CategoryQueriesUseCase categoryQueriesUseCase; - private final LayoutRenderingQueries layoutRenderingQueries; + private final LayoutRenderingUseCase layoutRenderingUseCase; @GetMapping("article/write") String getArticleWriteForm(Model model) { - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("categoryInput", categoryQueriesUseCase.findCategoryByTier(2)); model.addAttribute("tagsInput", tagsQueriesUseCase.findAllTagDtos()); model.addAttribute("articleDto", new ArticleForm()); @@ -76,7 +73,7 @@ public class ArticleController { @GetMapping("/article/edit") String updateArticle(@RequestParam Long articleId, Model model) { ArticleResponseForEdit articleDto = articleQueriesUseCase.getArticleForEdit(articleId); - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("categoryInput", categoryQueriesUseCase.findCategoryByTier(2)); model.addAttribute("tagsInput", tagsQueriesUseCase.findAllTagDtos()); model.addAttribute("articleDto", articleDto); @@ -120,7 +117,7 @@ public class ArticleController { articleDto.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(articleDto.getContent()))).text()); } - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("pagingBox", pagingBoxHandler); model.addAttribute("articleList", articleDtoList); @@ -161,7 +158,7 @@ public class ArticleController { PagingBoxHandler pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxHandler); @@ -185,7 +182,7 @@ public class ArticleController { PagingBoxHandler pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements()); - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxHandler); @@ -237,7 +234,7 @@ public class ArticleController { else substringContents = articleResponseForDetail.getContent(); // 4. 모델 담기 - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("article", articleResponseForDetail); model.addAttribute("metaTags",metaTags); model.addAttribute("metaContents",Jsoup.parse(substringContents).text()); diff --git a/src/main/java/myblog/blog/article/adapter/incomming/MainController.java b/src/main/java/myblog/blog/article/adapter/incomming/MainController.java index 2e6bcdc..f42c79d 100644 --- a/src/main/java/myblog/blog/article/adapter/incomming/MainController.java +++ b/src/main/java/myblog/blog/article/adapter/incomming/MainController.java @@ -1,12 +1,11 @@ package myblog.blog.article.adapter.incomming; -import lombok.RequiredArgsConstructor; - import myblog.blog.article.application.port.incomming.response.ArticleResponseForCardBox; import myblog.blog.article.application.port.incomming.ArticleQueriesUseCase; -import myblog.blog.shared.queries.LayoutRenderingQueries; -import org.jsoup.Jsoup; +import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase; +import lombok.RequiredArgsConstructor; +import org.jsoup.Jsoup; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -19,7 +18,7 @@ import static myblog.blog.shared.utils.MarkdownUtils.*; public class MainController { private final ArticleQueriesUseCase articleQueriesUseCase; - private final LayoutRenderingQueries layoutRenderingQueries; + private final LayoutRenderingUseCase layoutRenderingUseCase; /* - 메인 화면 제어용 컨트롤러 */ @@ -28,7 +27,7 @@ public class MainController { // Dto 전처리 List popularArticles = articleQueriesUseCase.getPopularArticles(); // - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); model.addAttribute("popularArticles", popularArticles); return "index"; } diff --git a/src/main/java/myblog/blog/article/adapter/incomming/TempArticleController.java b/src/main/java/myblog/blog/article/adapter/incomming/TempArticleController.java index 693e987..bdb323f 100644 --- a/src/main/java/myblog/blog/article/adapter/incomming/TempArticleController.java +++ b/src/main/java/myblog/blog/article/adapter/incomming/TempArticleController.java @@ -1,11 +1,11 @@ package myblog.blog.article.adapter.incomming; -import lombok.RequiredArgsConstructor; +import myblog.blog.article.application.port.incomming.TempArticleUseCase; +import myblog.blog.article.application.port.incomming.TempArticleDto; import myblog.blog.article.domain.TempArticle; -import myblog.blog.article.application.TempArticleService; -import myblog.blog.article.application.port.incomming.response.TempArticleResponse; -import org.springframework.web.bind.annotation.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import java.util.Optional; /* @@ -15,15 +15,15 @@ import java.util.Optional; @RequiredArgsConstructor public class TempArticleController { - private final TempArticleService tempArticleService; + private final TempArticleUseCase tempArticleUseCase; /* - 임시 아티클 저장 요청 */ @PostMapping("/article/temp/autoSave") - public String autoSaveTemp(@RequestBody TempArticleResponse tempArticleResponse){ + public String autoSaveTemp(@RequestBody TempArticleDto tempArticleDto){ - tempArticleService.saveTemp(new TempArticle(tempArticleResponse.getContent())); + tempArticleUseCase.saveTemp(new TempArticle(tempArticleDto.getContent())); return "저장성공"; } @@ -32,11 +32,11 @@ public class TempArticleController { */ @GetMapping("/article/temp/getTemp") public @ResponseBody - TempArticleResponse getTempArticle(){ + TempArticleDto getTempArticle(){ - Optional tempArticle = tempArticleService.getTempArticle(); - TempArticleResponse tempArticleResponse = new TempArticleResponse(); - tempArticleResponse.setContent(tempArticle.orElse(new TempArticle()).getContent()); - return tempArticleResponse; + Optional tempArticle = tempArticleUseCase.getTempArticle(); + TempArticleDto tempArticleDto = new TempArticleDto(); + tempArticleDto.setContent(tempArticle.orElse(new TempArticle()).getContent()); + return tempArticleDto; } } diff --git a/src/main/java/myblog/blog/article/application/port/incomming/response/TempArticleResponse.java b/src/main/java/myblog/blog/article/application/port/incomming/TempArticleDto.java similarity index 58% rename from src/main/java/myblog/blog/article/application/port/incomming/response/TempArticleResponse.java rename to src/main/java/myblog/blog/article/application/port/incomming/TempArticleDto.java index 6797848..5c6888d 100644 --- a/src/main/java/myblog/blog/article/application/port/incomming/response/TempArticleResponse.java +++ b/src/main/java/myblog/blog/article/application/port/incomming/TempArticleDto.java @@ -1,4 +1,4 @@ -package myblog.blog.article.application.port.incomming.response; +package myblog.blog.article.application.port.incomming; import lombok.Getter; import lombok.Setter; @@ -7,6 +7,6 @@ import lombok.Setter; */ @Getter @Setter -public class TempArticleResponse { +public class TempArticleDto { private String content; } diff --git a/src/main/java/myblog/blog/infra/ExceptionController.java b/src/main/java/myblog/blog/infra/ExceptionController.java index 7ae844f..181a3c8 100644 --- a/src/main/java/myblog/blog/infra/ExceptionController.java +++ b/src/main/java/myblog/blog/infra/ExceptionController.java @@ -1,8 +1,8 @@ package myblog.blog.infra; +import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase; + import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import myblog.blog.shared.queries.LayoutRenderingQueries; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -10,14 +10,13 @@ import org.springframework.web.bind.annotation.GetMapping; @Controller @RequiredArgsConstructor -@Slf4j public class ExceptionController implements ErrorController { - private final LayoutRenderingQueries layoutRenderingQueries; + private final LayoutRenderingUseCase layoutRenderingUseCase; @GetMapping("/error") public String errorView(Model model) { - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); return "error"; } diff --git a/src/main/java/myblog/blog/member/adapter/incomming/MemberController.java b/src/main/java/myblog/blog/member/adapter/incomming/MemberController.java index 4a1322e..2149046 100644 --- a/src/main/java/myblog/blog/member/adapter/incomming/MemberController.java +++ b/src/main/java/myblog/blog/member/adapter/incomming/MemberController.java @@ -1,7 +1,8 @@ package myblog.blog.member.adapter.incomming; +import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase; + import lombok.RequiredArgsConstructor; -import myblog.blog.shared.queries.LayoutRenderingQueries; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -10,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam; @Controller @RequiredArgsConstructor public class MemberController { - private final LayoutRenderingQueries layoutRenderingQueries; + private final LayoutRenderingUseCase layoutRenderingUseCase; /* - 회원 로그인 폼 조회 @@ -20,7 +21,7 @@ public class MemberController { if(error!=null&&error.equals("duplicatedEmail")){ model.addAttribute("errMsg","이미 가입된 이메일입니다."); } - layoutRenderingQueries.AddLayoutTo(model); + layoutRenderingUseCase.AddLayoutTo(model); return "login"; } } diff --git a/src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java b/src/main/java/myblog/blog/shared/application/LayoutRenderingQueries.java similarity index 84% rename from src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java rename to src/main/java/myblog/blog/shared/application/LayoutRenderingQueries.java index f1ef729..29ef119 100644 --- a/src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java +++ b/src/main/java/myblog/blog/shared/application/LayoutRenderingQueries.java @@ -1,18 +1,19 @@ -package myblog.blog.shared.queries; +package myblog.blog.shared.application; + +import myblog.blog.category.appliacation.port.incomming.CategoryQueriesUseCase; +import myblog.blog.comment.application.port.incomming.CommentQueriesUseCase; +import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase; +import myblog.blog.category.appliacation.port.incomming.response.CategoryViewForLayout; +import myblog.blog.comment.application.port.incomming.response.CommentDtoForLayout; import lombok.RequiredArgsConstructor; -import myblog.blog.category.appliacation.port.incomming.CategoryQueriesUseCase; -import myblog.blog.category.appliacation.port.incomming.response.CategoryViewForLayout; -import myblog.blog.comment.application.port.incomming.CommentQueriesUseCase; -import myblog.blog.comment.application.port.incomming.response.CommentDtoForLayout; import org.springframework.stereotype.Component; import org.springframework.ui.Model; - import java.util.List; @Component @RequiredArgsConstructor -public class LayoutRenderingQueries { +public class LayoutRenderingQueries implements LayoutRenderingUseCase { private final CommentQueriesUseCase commentQueriesUseCase; private final CategoryQueriesUseCase categoryQueriesUseCase; @@ -20,6 +21,7 @@ public class LayoutRenderingQueries { /* - 레이아웃에 필요한 모델 담기 */ + @Override public void AddLayoutTo(Model model) { CategoryViewForLayout categoryViewForLayout = categoryQueriesUseCase.getCategoryViewForLayout(); List comments = commentQueriesUseCase.recentCommentListForLayout(); diff --git a/src/main/java/myblog/blog/shared/application/port/incomming/LayoutRenderingUseCase.java b/src/main/java/myblog/blog/shared/application/port/incomming/LayoutRenderingUseCase.java new file mode 100644 index 0000000..ef33504 --- /dev/null +++ b/src/main/java/myblog/blog/shared/application/port/incomming/LayoutRenderingUseCase.java @@ -0,0 +1,7 @@ +package myblog.blog.shared.application.port.incomming; + +import org.springframework.ui.Model; + +public interface LayoutRenderingUseCase { + void AddLayoutTo(Model model); +}