추가 리아키텍쳐링
This commit is contained in:
@@ -94,6 +94,7 @@ https://www.jiniaslog.co.kr/
|
||||
- AWS / 리눅스 기반 CI/CD 무중단 배포 인프라 구축
|
||||
- JPA, Hibernate를 사용한 도메인 설계
|
||||
- MVC 프레임워크 기반 백엔드 서버 구축
|
||||
- 헥사고날 아키텍처
|
||||
|
||||
## 시스템 아키텍쳐
|
||||

|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
@@ -0,0 +1,7 @@
|
||||
package myblog.blog.shared.application.port.incomming;
|
||||
|
||||
import org.springframework.ui.Model;
|
||||
|
||||
public interface LayoutRenderingUseCase {
|
||||
void AddLayoutTo(Model model);
|
||||
}
|
||||
Reference in New Issue
Block a user