추가 리아키텍쳐링

This commit is contained in:
jinia91
2022-03-28 00:33:22 +09:00
parent 9cef2ddef3
commit 84850a8eb6
9 changed files with 55 additions and 49 deletions

View File

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

View File

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

View File

@@ -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<ArticleResponseForCardBox> popularArticles = articleQueriesUseCase.getPopularArticles();
//
layoutRenderingQueries.AddLayoutTo(model);
layoutRenderingUseCase.AddLayoutTo(model);
model.addAttribute("popularArticles", popularArticles);
return "index";
}

View File

@@ -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> tempArticle = tempArticleService.getTempArticle();
TempArticleResponse tempArticleResponse = new TempArticleResponse();
tempArticleResponse.setContent(tempArticle.orElse(new TempArticle()).getContent());
return tempArticleResponse;
Optional<TempArticle> tempArticle = tempArticleUseCase.getTempArticle();
TempArticleDto tempArticleDto = new TempArticleDto();
tempArticleDto.setContent(tempArticle.orElse(new TempArticle()).getContent());
return tempArticleDto;
}
}

View File

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

View File

@@ -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";
}

View File

@@ -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";
}
}

View File

@@ -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<CommentDtoForLayout> comments = commentQueriesUseCase.recentCommentListForLayout();

View File

@@ -0,0 +1,7 @@
package myblog.blog.shared.application.port.incomming;
import org.springframework.ui.Model;
public interface LayoutRenderingUseCase {
void AddLayoutTo(Model model);
}