diff --git a/src/main/java/myblog/blog/article/controller/ArticleController.java b/src/main/java/myblog/blog/article/controller/ArticleController.java index 07c291e..fff93d2 100644 --- a/src/main/java/myblog/blog/article/controller/ArticleController.java +++ b/src/main/java/myblog/blog/article/controller/ArticleController.java @@ -9,9 +9,9 @@ import myblog.blog.category.service.CategoryService; import myblog.blog.category.dto.*; import myblog.blog.member.auth.PrincipalDetails; import myblog.blog.member.dto.MemberDto; +import myblog.blog.tags.queries.TagsQueries; import myblog.blog.tags.service.TagsService; -import myblog.blog.tags.dto.TagsDto; -import myblog.blog.layout.LayoutDtoFactory; +import myblog.blog.shared.queries.LayoutRenderingQueries; import org.jsoup.Jsoup; @@ -32,7 +32,7 @@ import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.stream.Collectors; -import static myblog.blog.base.utils.MarkdownUtils.*; +import static myblog.blog.shared.utils.MarkdownUtils.*; @Controller @RequiredArgsConstructor @@ -43,7 +43,8 @@ public class ArticleController { private final CategoryService categoryService; private final TempArticleService tempArticleService; - private final LayoutDtoFactory layoutDtoFactory; + private final TagsQueries tagsQueries; + private final LayoutRenderingQueries layoutRenderingQueries; private final ModelMapper modelMapper; @@ -52,9 +53,9 @@ public class ArticleController { */ @GetMapping("article/write") public String getWriteArticleForm(Model model) { - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("categoryInput", getCategoryDtosForForm()); - model.addAttribute("tagsInput", getTagsDtosForForm()); + model.addAttribute("tagsInput", tagsQueries.findAllTagDtos()); model.addAttribute("articleDto", new ArticleForm()); return "article/articleWriteForm"; } @@ -89,9 +90,9 @@ public class ArticleController { .collect(Collectors.toList()); articleDto.setArticleTagList(articleTagStrings); // - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("categoryInput", getCategoryDtosForForm()); - model.addAttribute("tagsInput", getTagsDtosForForm()); + model.addAttribute("tagsInput", tagsQueries.findAllTagDtos()); model.addAttribute("articleDto", articleDto); return "article/articleEditForm"; } @@ -139,7 +140,7 @@ public class ArticleController { articleDto.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(articleDto.getContent()))).text()); } - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("pagingBox", pagingBoxDto); model.addAttribute("articleList", articleDtoList); @@ -167,7 +168,7 @@ public class ArticleController { PagingBoxDto pagingBoxDto = PagingBoxDto.createOf(page, (int)articleList.getTotalElements()); - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxDto); @@ -195,7 +196,7 @@ public class ArticleController { PagingBoxDto pagingBoxDto = PagingBoxDto.createOf(page, (int)articleList.getTotalElements()); - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("articleList", articleList); model.addAttribute("pagingBox", pagingBoxDto); @@ -263,7 +264,7 @@ public class ArticleController { else substringContents = articleDtoForDetail.getContent(); // 4. 모델 담기 - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("article", articleDtoForDetail); model.addAttribute("metaTags",metaTags); model.addAttribute("metaContents",Jsoup.parse(substringContents).text()); @@ -325,17 +326,6 @@ public class ArticleController { throw new IllegalArgumentException("'"+category+"' 라는 카테고리는 존재하지 않습니다."); } - /* -- 아티클 폼에 필요한 태그 dtos - */ - private List getTagsDtosForForm() { - return tagsService - .findAllTags() - .stream() - .map(tag -> new TagsDto(tag.getName())) - .collect(Collectors.toList()); - } - /* - 아티클 폼에 필요한 카테고리 dtos */ diff --git a/src/main/java/myblog/blog/article/domain/Article.java b/src/main/java/myblog/blog/article/domain/Article.java index d9f7b69..59cbff8 100644 --- a/src/main/java/myblog/blog/article/domain/Article.java +++ b/src/main/java/myblog/blog/article/domain/Article.java @@ -3,7 +3,7 @@ package myblog.blog.article.domain; import lombok.Builder; import lombok.Getter; import myblog.blog.article.dto.ArticleForm; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import myblog.blog.category.domain.Category; import myblog.blog.comment.domain.Comment; import myblog.blog.member.doamin.Member; diff --git a/src/main/java/myblog/blog/article/domain/TempArticle.java b/src/main/java/myblog/blog/article/domain/TempArticle.java index df3bd77..4badcbe 100644 --- a/src/main/java/myblog/blog/article/domain/TempArticle.java +++ b/src/main/java/myblog/blog/article/domain/TempArticle.java @@ -1,7 +1,7 @@ package myblog.blog.article.domain; import lombok.Getter; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import javax.persistence.*; diff --git a/src/main/java/myblog/blog/base/config/AppConfig.java b/src/main/java/myblog/blog/base/config/AppConfig.java index eb45292..c819134 100644 --- a/src/main/java/myblog/blog/base/config/AppConfig.java +++ b/src/main/java/myblog/blog/base/config/AppConfig.java @@ -19,9 +19,4 @@ public class AppConfig { .setFieldMatchingEnabled(true); return modelMapper; } - - @Bean - public Gson gson(){ - return new Gson(); - } } diff --git a/src/main/java/myblog/blog/base/config/SecurityConfig.java b/src/main/java/myblog/blog/base/config/SecurityConfig.java index 433ccd8..f461cd2 100644 --- a/src/main/java/myblog/blog/base/config/SecurityConfig.java +++ b/src/main/java/myblog/blog/base/config/SecurityConfig.java @@ -1,7 +1,7 @@ package myblog.blog.base.config; import lombok.RequiredArgsConstructor; -import myblog.blog.exception.LoginFailHandler; +import myblog.blog.shared.exception.LoginFailHandler; import myblog.blog.member.doamin.Role; import myblog.blog.member.service.Oauth2MemberService; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; diff --git a/src/main/java/myblog/blog/log/LogAspect.java b/src/main/java/myblog/blog/base/log/LogAspect.java similarity index 97% rename from src/main/java/myblog/blog/log/LogAspect.java rename to src/main/java/myblog/blog/base/log/LogAspect.java index 7f52ea4..04a8e63 100644 --- a/src/main/java/myblog/blog/log/LogAspect.java +++ b/src/main/java/myblog/blog/base/log/LogAspect.java @@ -1,4 +1,4 @@ -package myblog.blog.log; +package myblog.blog.base.log; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/myblog/blog/log/LogTracer.java b/src/main/java/myblog/blog/base/log/LogTracer.java similarity index 98% rename from src/main/java/myblog/blog/log/LogTracer.java rename to src/main/java/myblog/blog/base/log/LogTracer.java index bf241df..4ab2330 100644 --- a/src/main/java/myblog/blog/log/LogTracer.java +++ b/src/main/java/myblog/blog/base/log/LogTracer.java @@ -1,4 +1,4 @@ -package myblog.blog.log; +package myblog.blog.base.log; import io.sentry.Sentry; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/myblog/blog/log/TraceId.java b/src/main/java/myblog/blog/base/log/TraceId.java similarity index 95% rename from src/main/java/myblog/blog/log/TraceId.java rename to src/main/java/myblog/blog/base/log/TraceId.java index 5870db8..5100297 100644 --- a/src/main/java/myblog/blog/log/TraceId.java +++ b/src/main/java/myblog/blog/base/log/TraceId.java @@ -1,4 +1,4 @@ -package myblog.blog.log; +package myblog.blog.base.log; import lombok.Getter; diff --git a/src/main/java/myblog/blog/log/TraceStatus.java b/src/main/java/myblog/blog/base/log/TraceStatus.java similarity index 87% rename from src/main/java/myblog/blog/log/TraceStatus.java rename to src/main/java/myblog/blog/base/log/TraceStatus.java index 2d79ade..f93d25e 100644 --- a/src/main/java/myblog/blog/log/TraceStatus.java +++ b/src/main/java/myblog/blog/base/log/TraceStatus.java @@ -1,4 +1,4 @@ -package myblog.blog.log; +package myblog.blog.base.log; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/myblog/blog/category/controller/CategoryController.java b/src/main/java/myblog/blog/category/controller/CategoryController.java index 79849e8..820e042 100644 --- a/src/main/java/myblog/blog/category/controller/CategoryController.java +++ b/src/main/java/myblog/blog/category/controller/CategoryController.java @@ -1,8 +1,8 @@ package myblog.blog.category.controller; import lombok.RequiredArgsConstructor; -import myblog.blog.exception.CustomFormException; -import myblog.blog.exception.ListValidator; +import myblog.blog.shared.exception.CustomFormException; +import myblog.blog.shared.exception.ListValidator; import myblog.blog.category.dto.CategoryForView; import myblog.blog.category.dto.CategoryNormalDto; import myblog.blog.category.service.CategoryService; diff --git a/src/main/java/myblog/blog/category/domain/Category.java b/src/main/java/myblog/blog/category/domain/Category.java index dab8cb3..4c980c5 100644 --- a/src/main/java/myblog/blog/category/domain/Category.java +++ b/src/main/java/myblog/blog/category/domain/Category.java @@ -4,7 +4,7 @@ package myblog.blog.category.domain; import lombok.Builder; import lombok.Getter; import myblog.blog.article.domain.Article; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import javax.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/myblog/blog/comment/controller/CommentController.java b/src/main/java/myblog/blog/comment/controller/CommentController.java index 99ebeae..fa16c8d 100644 --- a/src/main/java/myblog/blog/comment/controller/CommentController.java +++ b/src/main/java/myblog/blog/comment/controller/CommentController.java @@ -6,10 +6,9 @@ import myblog.blog.article.service.ArticleService; import myblog.blog.comment.dto.CommentDto; import myblog.blog.comment.dto.CommentForm; import myblog.blog.comment.service.CommentService; -import myblog.blog.exception.CustomFormException; +import myblog.blog.shared.exception.CustomFormException; import myblog.blog.member.auth.PrincipalDetails; import myblog.blog.member.doamin.Member; -import org.springframework.security.core.Authentication; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.Errors; import org.springframework.validation.annotation.Validated; diff --git a/src/main/java/myblog/blog/comment/domain/Comment.java b/src/main/java/myblog/blog/comment/domain/Comment.java index 5c70d2d..ae181f5 100644 --- a/src/main/java/myblog/blog/comment/domain/Comment.java +++ b/src/main/java/myblog/blog/comment/domain/Comment.java @@ -3,7 +3,7 @@ package myblog.blog.comment.domain; import lombok.Builder; import lombok.Getter; import myblog.blog.article.domain.Article; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import myblog.blog.member.doamin.Member; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; diff --git a/src/main/java/myblog/blog/main/MainController.java b/src/main/java/myblog/blog/main/MainController.java index e280a29..707f396 100644 --- a/src/main/java/myblog/blog/main/MainController.java +++ b/src/main/java/myblog/blog/main/MainController.java @@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import myblog.blog.article.dto.ArticleDtoForCardBox; import myblog.blog.article.service.ArticleService; -import myblog.blog.layout.LayoutDtoFactory; +import myblog.blog.shared.queries.LayoutRenderingQueries; import org.jsoup.Jsoup; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Controller; @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; -import static myblog.blog.base.utils.MarkdownUtils.*; +import static myblog.blog.shared.utils.MarkdownUtils.*; @Controller @RequiredArgsConstructor @@ -23,7 +23,7 @@ public class MainController { private final ArticleService articleService; private final ModelMapper modelMapper; - private final LayoutDtoFactory layoutDtoFactory; + private final LayoutRenderingQueries layoutRenderingQueries; /* - 메인 화면 제어용 컨트롤러 */ @@ -35,7 +35,7 @@ public class MainController { .map(article -> modelMapper.map(article, ArticleDtoForCardBox.class)) .collect(Collectors.toList()); // - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); model.addAttribute("popularArticles", popularArticles); return "index"; } diff --git a/src/main/java/myblog/blog/member/doamin/Member.java b/src/main/java/myblog/blog/member/doamin/Member.java index f0e2a18..51d6e33 100644 --- a/src/main/java/myblog/blog/member/doamin/Member.java +++ b/src/main/java/myblog/blog/member/doamin/Member.java @@ -4,7 +4,7 @@ import lombok.Builder; import lombok.Getter; import lombok.Setter; import myblog.blog.article.domain.Article; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import myblog.blog.comment.domain.Comment; import javax.persistence.*; diff --git a/src/main/java/myblog/blog/rss/RssService.java b/src/main/java/myblog/blog/rss/RssService.java index 41184f0..5d2e8d3 100644 --- a/src/main/java/myblog/blog/rss/RssService.java +++ b/src/main/java/myblog/blog/rss/RssService.java @@ -1,19 +1,19 @@ package myblog.blog.rss; import lombok.RequiredArgsConstructor; -import myblog.blog.article.domain.Article; -import myblog.blog.article.service.ArticleService; -import org.jdom2.*; -import org.jdom2.output.*; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import myblog.blog.article.domain.Article; +import myblog.blog.article.service.ArticleService; +import org.jdom2.*; +import org.jdom2.output.*; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; -import static myblog.blog.base.utils.MarkdownUtils.*; +import static myblog.blog.shared.utils.MarkdownUtils.*; /* - rss 서비스 로직 diff --git a/src/main/java/myblog/blog/base/BasicEntity.java b/src/main/java/myblog/blog/shared/BasicEntity.java similarity index 95% rename from src/main/java/myblog/blog/base/BasicEntity.java rename to src/main/java/myblog/blog/shared/BasicEntity.java index 78f6c91..5f88446 100644 --- a/src/main/java/myblog/blog/base/BasicEntity.java +++ b/src/main/java/myblog/blog/shared/BasicEntity.java @@ -1,4 +1,4 @@ -package myblog.blog.base; +package myblog.blog.shared; import lombok.Getter; import org.springframework.data.annotation.CreatedDate; diff --git a/src/main/java/myblog/blog/exception/CustomFormException.java b/src/main/java/myblog/blog/shared/exception/CustomFormException.java similarity index 84% rename from src/main/java/myblog/blog/exception/CustomFormException.java rename to src/main/java/myblog/blog/shared/exception/CustomFormException.java index ade75b8..3af30fa 100644 --- a/src/main/java/myblog/blog/exception/CustomFormException.java +++ b/src/main/java/myblog/blog/shared/exception/CustomFormException.java @@ -1,4 +1,4 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; /* - REST 컨트롤러 상태 메세지 전송용 커스텀 에러 */ diff --git a/src/main/java/myblog/blog/exception/ExceptionController.java b/src/main/java/myblog/blog/shared/exception/ExceptionController.java similarity index 58% rename from src/main/java/myblog/blog/exception/ExceptionController.java rename to src/main/java/myblog/blog/shared/exception/ExceptionController.java index cab4cee..e5898b7 100644 --- a/src/main/java/myblog/blog/exception/ExceptionController.java +++ b/src/main/java/myblog/blog/shared/exception/ExceptionController.java @@ -1,28 +1,23 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import myblog.blog.layout.LayoutDtoFactory; +import myblog.blog.shared.queries.LayoutRenderingQueries; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.context.request.WebRequest; - -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import java.security.Principal; @Controller @RequiredArgsConstructor @Slf4j public class ExceptionController implements ErrorController { - private final LayoutDtoFactory layoutDtoFactory; + private final LayoutRenderingQueries layoutRenderingQueries; @GetMapping("/error") public String errorView(Model model) { - layoutDtoFactory.AddLayoutTo(model); + layoutRenderingQueries.AddLayoutTo(model); return "error"; } diff --git a/src/main/java/myblog/blog/exception/ExceptionControllerAdvice.java b/src/main/java/myblog/blog/shared/exception/ExceptionControllerAdvice.java similarity index 95% rename from src/main/java/myblog/blog/exception/ExceptionControllerAdvice.java rename to src/main/java/myblog/blog/shared/exception/ExceptionControllerAdvice.java index e63792d..d788db2 100644 --- a/src/main/java/myblog/blog/exception/ExceptionControllerAdvice.java +++ b/src/main/java/myblog/blog/shared/exception/ExceptionControllerAdvice.java @@ -1,4 +1,4 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ControllerAdvice; diff --git a/src/main/java/myblog/blog/exception/ExceptionRestControllerAdvice.java b/src/main/java/myblog/blog/shared/exception/ExceptionRestControllerAdvice.java similarity index 93% rename from src/main/java/myblog/blog/exception/ExceptionRestControllerAdvice.java rename to src/main/java/myblog/blog/shared/exception/ExceptionRestControllerAdvice.java index 56001b6..96910c5 100644 --- a/src/main/java/myblog/blog/exception/ExceptionRestControllerAdvice.java +++ b/src/main/java/myblog/blog/shared/exception/ExceptionRestControllerAdvice.java @@ -1,4 +1,4 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/myblog/blog/exception/ListValidator.java b/src/main/java/myblog/blog/shared/exception/ListValidator.java similarity index 95% rename from src/main/java/myblog/blog/exception/ListValidator.java rename to src/main/java/myblog/blog/shared/exception/ListValidator.java index 196b424..d16a61b 100644 --- a/src/main/java/myblog/blog/exception/ListValidator.java +++ b/src/main/java/myblog/blog/shared/exception/ListValidator.java @@ -1,4 +1,4 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/myblog/blog/exception/LoginFailHandler.java b/src/main/java/myblog/blog/shared/exception/LoginFailHandler.java similarity index 97% rename from src/main/java/myblog/blog/exception/LoginFailHandler.java rename to src/main/java/myblog/blog/shared/exception/LoginFailHandler.java index ff88d1e..cedebcb 100644 --- a/src/main/java/myblog/blog/exception/LoginFailHandler.java +++ b/src/main/java/myblog/blog/shared/exception/LoginFailHandler.java @@ -1,4 +1,4 @@ -package myblog.blog.exception; +package myblog.blog.shared.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.AuthenticationServiceException; diff --git a/src/main/java/myblog/blog/layout/LayoutDtoFactory.java b/src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java similarity index 92% rename from src/main/java/myblog/blog/layout/LayoutDtoFactory.java rename to src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java index 92ad52e..757044f 100644 --- a/src/main/java/myblog/blog/layout/LayoutDtoFactory.java +++ b/src/main/java/myblog/blog/shared/queries/LayoutRenderingQueries.java @@ -1,4 +1,4 @@ -package myblog.blog.layout; +package myblog.blog.shared.queries; import lombok.RequiredArgsConstructor; import myblog.blog.category.dto.CategoryForView; @@ -12,7 +12,7 @@ import java.util.List; @Component @RequiredArgsConstructor -public class LayoutDtoFactory { +public class LayoutRenderingQueries { private final CategoryService categoryService; private final CommentService commentService; @@ -26,6 +26,4 @@ public class LayoutDtoFactory { model.addAttribute("category", categoryForView); model.addAttribute("commentsList", comments); } - - } diff --git a/src/main/java/myblog/blog/shared/utils/MapperUtils.java b/src/main/java/myblog/blog/shared/utils/MapperUtils.java new file mode 100644 index 0000000..f946bc2 --- /dev/null +++ b/src/main/java/myblog/blog/shared/utils/MapperUtils.java @@ -0,0 +1,25 @@ +package myblog.blog.shared.utils; + +import com.google.gson.Gson; +import org.modelmapper.ModelMapper; + +public class MapperUtils { + private static final ModelMapper modelMapper; + private static final Gson gson; + + static { + modelMapper = new ModelMapper(); + modelMapper.getConfiguration() + .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) + .setFieldMatchingEnabled(true); + gson = new Gson(); + } + + public static ModelMapper getModelMapper(){ + return modelMapper; + } + + public static Gson getGson(){ + return gson; + } +} diff --git a/src/main/java/myblog/blog/base/utils/MarkdownUtils.java b/src/main/java/myblog/blog/shared/utils/MarkdownUtils.java similarity index 95% rename from src/main/java/myblog/blog/base/utils/MarkdownUtils.java rename to src/main/java/myblog/blog/shared/utils/MarkdownUtils.java index f420e8a..ede2232 100644 --- a/src/main/java/myblog/blog/base/utils/MarkdownUtils.java +++ b/src/main/java/myblog/blog/shared/utils/MarkdownUtils.java @@ -1,4 +1,4 @@ -package myblog.blog.base.utils; +package myblog.blog.shared.utils; import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.parser.Parser; diff --git a/src/main/java/myblog/blog/sitemap/SiteMapService.java b/src/main/java/myblog/blog/sitemap/SiteMapService.java index 973f2d5..8a0f9b8 100644 --- a/src/main/java/myblog/blog/sitemap/SiteMapService.java +++ b/src/main/java/myblog/blog/sitemap/SiteMapService.java @@ -1,14 +1,15 @@ package myblog.blog.sitemap; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; + import myblog.blog.article.domain.Article; -import myblog.blog.article.service.ArticleService; import myblog.blog.category.domain.Category; +import myblog.blog.article.service.ArticleService; import myblog.blog.category.service.CategoryService; import org.jdom2.*; import org.jdom2.output.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/myblog/blog/tags/domain/ArticleTagList.java b/src/main/java/myblog/blog/tags/domain/ArticleTagList.java index e299420..f1b8791 100644 --- a/src/main/java/myblog/blog/tags/domain/ArticleTagList.java +++ b/src/main/java/myblog/blog/tags/domain/ArticleTagList.java @@ -2,7 +2,7 @@ package myblog.blog.tags.domain; import lombok.*; import myblog.blog.article.domain.Article; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import javax.persistence.*; diff --git a/src/main/java/myblog/blog/tags/domain/Tags.java b/src/main/java/myblog/blog/tags/domain/Tags.java index 680fe24..b1c6303 100644 --- a/src/main/java/myblog/blog/tags/domain/Tags.java +++ b/src/main/java/myblog/blog/tags/domain/Tags.java @@ -1,7 +1,7 @@ package myblog.blog.tags.domain; import lombok.*; -import myblog.blog.base.BasicEntity; +import myblog.blog.shared.BasicEntity; import javax.persistence.*; import java.util.*; diff --git a/src/main/java/myblog/blog/tags/dto/TagsDto.java b/src/main/java/myblog/blog/tags/dto/TagsDto.java index c070c9e..9b4c894 100644 --- a/src/main/java/myblog/blog/tags/dto/TagsDto.java +++ b/src/main/java/myblog/blog/tags/dto/TagsDto.java @@ -7,11 +7,8 @@ import lombok.Data; */ @Data public class TagsDto { - private String name; - public TagsDto(){} - public TagsDto(String name) { this.name = name; } diff --git a/src/main/java/myblog/blog/tags/queries/TagsQueries.java b/src/main/java/myblog/blog/tags/queries/TagsQueries.java new file mode 100644 index 0000000..e1aab4d --- /dev/null +++ b/src/main/java/myblog/blog/tags/queries/TagsQueries.java @@ -0,0 +1,28 @@ +package myblog.blog.tags.queries; + +import lombok.RequiredArgsConstructor; +import myblog.blog.shared.utils.MapperUtils; +import myblog.blog.tags.domain.Tags; +import myblog.blog.tags.dto.TagsDto; +import myblog.blog.tags.repository.ArticleTagListsRepository; +import myblog.blog.tags.repository.TagsRepository; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Transactional +@RequiredArgsConstructor +public class TagsQueries { + private final TagsRepository tagsRepository; + private final ArticleTagListsRepository articleTagListsRepository; + + public List findAllTagDtos(){ + List tags = tagsRepository.findAll(); + return tags.stream() + .map(tag -> MapperUtils.getModelMapper().map(tag, TagsDto.class)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/myblog/blog/tags/service/TagsService.java b/src/main/java/myblog/blog/tags/service/TagsService.java index 3df5c9c..e8ea5f7 100644 --- a/src/main/java/myblog/blog/tags/service/TagsService.java +++ b/src/main/java/myblog/blog/tags/service/TagsService.java @@ -1,28 +1,27 @@ package myblog.blog.tags.service; -import com.google.gson.Gson; import lombok.RequiredArgsConstructor; -import myblog.blog.article.domain.Article; -import myblog.blog.tags.domain.*; -import myblog.blog.tags.repository.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import myblog.blog.article.domain.*; +import myblog.blog.tags.domain.*; +import myblog.blog.shared.utils.MapperUtils; +import myblog.blog.tags.repository.*; + import java.util.*; @Service @Transactional @RequiredArgsConstructor public class TagsService { - private final TagsRepository tagsRepository; private final ArticleTagListsRepository articleTagListsRepository; - private final Gson gson; /* - Json 객체로 넘어온 태그들을 파싱해서 신규 태그인경우 저장 */ public void createNewTagsAndArticleTagList(String names, Article article) { - List> tagsDtoArrayList = gson.fromJson(names, ArrayList.class); + List> tagsDtoArrayList = MapperUtils.getGson().fromJson(names, ArrayList.class); for (var tagDto : tagsDtoArrayList) { Tags tag = findOrCreateTagFrom(tagDto); articleTagListsRepository.save(new ArticleTagList(article, tag)); @@ -34,10 +33,6 @@ public class TagsService { .orElseGet(() -> tagsRepository.save(new Tags(tags.get("value")))); } - public List findAllTags(){ - return tagsRepository.findAll(); - } - public void deleteAllTagsWith(Article article){ articleTagListsRepository.deleteByArticle(article); } diff --git a/src/test/kotlin/myblog/blog/rss/RssServiceTests.kt b/src/test/kotlin/myblog/blog/rss/RssServiceTests.kt new file mode 100644 index 0000000..420a287 --- /dev/null +++ b/src/test/kotlin/myblog/blog/rss/RssServiceTests.kt @@ -0,0 +1,76 @@ +package myblog.blog.rss + +import com.nhaarman.mockito_kotlin.whenever +import myblog.blog.article.domain.Article +import myblog.blog.article.service.ArticleService +import myblog.blog.rss.RssService +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +//import org.junit.Test +import org.junit.jupiter.api.extension.ExtendWith +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.junit.MockitoJUnitRunner +import org.mockito.junit.jupiter.MockitoExtension +import java.lang.reflect.Field +import java.time.LocalDateTime +import java.util.* + + +@ExtendWith(MockitoExtension::class) +class RssServiceTests { + + @Mock + lateinit var articleService: ArticleService + @InjectMocks + lateinit var rssService: RssService + + @Test + fun `정상적으로 rssFeed를 가져오는 테스트`() { + // given + whenever(articleService.totalArticle) + .thenReturn(Arrays.asList(buildArticle("테스트용", "1호", 1L), buildArticle("테스트용이에용", "2호", 2L))) + // when + val rssFeed = rssService.rssFeed + // then + firstArticleAssert(rssFeed) + secondArticleAssert(rssFeed) + } + + private fun buildArticle(title: String, content: String, id: Long): Article? { + val article = Article.builder().title(title).content(content).build() + setArticlePrivateFieldId(id, article) + setArticleCreatedTimeStamp(article) + return article + } + + private fun setArticleCreatedTimeStamp(article: Article) { + val clazz = Class.forName("myblog.blog.article.domain.Article").superclass + val field: Field = clazz.getDeclaredField("createdDate") + field.setAccessible(true) + field.set(article, LocalDateTime.now()) + } + + private fun setArticlePrivateFieldId(id: Long, article: Article) { + val clazz = Class.forName("myblog.blog.article.domain.Article") + val field: Field = clazz.getDeclaredField("id") + field.setAccessible(true) + field.set(article, id) + } + + private fun secondArticleAssert(rssFeed: String?) { + assertThat(rssFeed).contains("<![CDATA[테스트용이에용]]>") + .contains("https://www.jiniaslog.co.kr/article/view?articleId=2") + .contains("2호

]]>
") + .contains("https://www.jiniaslog.co.kr/article/view?articleId=2") + } + + private fun firstArticleAssert(rssFeed: String?) { + assertThat(rssFeed).contains("<![CDATA[테스트용]]>") + .contains("https://www.jiniaslog.co.kr/article/view?articleId=1") + .contains("1호

]]>
") + .contains("https://www.jiniaslog.co.kr/article/view?articleId=1") + } + +} \ No newline at end of file diff --git a/src/test/kotlin/myblog/blog/sitemap/SiteMapServiceTests.kt b/src/test/kotlin/myblog/blog/sitemap/SiteMapServiceTests.kt index 60414da..708de4e 100644 --- a/src/test/kotlin/myblog/blog/sitemap/SiteMapServiceTests.kt +++ b/src/test/kotlin/myblog/blog/sitemap/SiteMapServiceTests.kt @@ -3,6 +3,8 @@ package myblog.blog.sitemap import com.nhaarman.mockito_kotlin.whenever import myblog.blog.article.domain.Article import myblog.blog.article.service.ArticleService +import myblog.blog.category.domain.Category +import myblog.blog.category.service.CategoryService import myblog.blog.rss.RssService import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -23,27 +25,27 @@ class SiteMapServiceTests { @Mock lateinit var articleService: ArticleService + @Mock + lateinit var categoryService: CategoryService @InjectMocks - lateinit var rssService: RssService + lateinit var siteMapService: SiteMapService @Test - fun `rss 요청시 성공 테스트`() { + fun `정상적으로 siteMap을 가져오는 테스트`() { // given whenever(articleService.totalArticle) .thenReturn(Arrays.asList(buildArticle("테스트용", "1호", 1L), buildArticle("테스트용이에용", "2호", 2L))) + whenever(categoryService.allCategories) + .thenReturn(Arrays.asList(buildCategory("목 카테고리"))) // when - val rssFeed = rssService.rssFeed + val siteMap = siteMapService.siteMap // then - assertThat(rssFeed).contains("<![CDATA[테스트용]]>") - .contains("https://www.jiniaslog.co.kr/article/view?articleId=1") - .contains("1호

]]>
") - .contains("https://www.jiniaslog.co.kr/article/view?articleId=1") - assertThat(rssFeed).contains("<![CDATA[테스트용이에용]]>") - .contains("https://www.jiniaslog.co.kr/article/view?articleId=2") - .contains("2호

]]>
") - .contains("https://www.jiniaslog.co.kr/article/view?articleId=2") + siteMapRootBuildlAssert(siteMap) + siteMapCategoryUrlBuildAssert(siteMap) + siteMapArticleUrlBuildAssert(siteMap) } + private fun buildCategory(title: String) = Category.builder().title(title).tier(1).build() private fun buildArticle(title: String, content: String, id: Long): Article? { val article = Article.builder().title(title).content(content).build() setArticlePrivateFieldId(id, article) @@ -64,4 +66,18 @@ class SiteMapServiceTests { field.setAccessible(true) field.set(article, id) } + + private fun siteMapRootBuildlAssert(rssFeed: String?) { + assertThat(rssFeed).contains("https://www.jiniaslog.co.kr") + .contains("1.0") + } + + private fun siteMapCategoryUrlBuildAssert(rssFeed: String?) { + assertThat(rssFeed).contains("https://www.jiniaslog.co.kr/article/list?category=목 카테고리&tier=1&page=1") + } + + private fun siteMapArticleUrlBuildAssert(rssFeed: String?) { + assertThat(rssFeed).contains("https://www.jiniaslog.co.kr/article/view?articleId=1") + .contains("https://www.jiniaslog.co.kr/article/view?articleId=2") + } } \ No newline at end of file diff --git a/src/test/kotlin/myblog/blog/tags/service/TagsServiceTests.kt b/src/test/kotlin/myblog/blog/tags/service/TagsServiceTests.kt new file mode 100644 index 0000000..ac231b1 --- /dev/null +++ b/src/test/kotlin/myblog/blog/tags/service/TagsServiceTests.kt @@ -0,0 +1,20 @@ +//package myblog.blog.tags.service +// +//import org.junit.jupiter.api.extension.ExtendWith +//import org.mockito.InjectMocks +//import org.mockito.Mock +//import org.mockito.junit.jupiter.MockitoExtension +//import myblog.blog.tags.repository.ArticleTagListsRepository +// +//@ExtendWith(MockitoExtension::class) +//class TagsServiceTests { +// +// @Mock +// lateinit var tagsRepository: ArticleTagListsRepository +// @Mock +// lateinit var articleTagListsRepository: ArticleTagListsRepository +// @InjectMocks +// lateinit var tagsService: TagsService +// 커밋후 추가 작성 예정 +// +//} \ No newline at end of file