From 14fc5699481198e70e5b5738f268f0b1f295cf32 Mon Sep 17 00:00:00 2001 From: HoeSeong123 Date: Wed, 7 Aug 2024 15:59:33 +0900 Subject: [PATCH 01/12] =?UTF-8?q?refactor(codezap):=20RequiredArgsConstruc?= =?UTF-8?q?tor=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/service/CategoryService.java | 19 ++++++------------- .../template/service/TemplateService.java | 17 ++--------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/backend/src/main/java/codezap/category/service/CategoryService.java b/backend/src/main/java/codezap/category/service/CategoryService.java index ce779b954..c156b17d5 100644 --- a/backend/src/main/java/codezap/category/service/CategoryService.java +++ b/backend/src/main/java/codezap/category/service/CategoryService.java @@ -12,29 +12,22 @@ import codezap.global.exception.CodeZapException; import codezap.member.domain.Member; import codezap.member.dto.MemberDto; -import codezap.member.repository.MemberJpaRepository; import codezap.member.repository.MemberRepository; import codezap.template.repository.TemplateRepository; +import lombok.RequiredArgsConstructor; @Service +@RequiredArgsConstructor public class CategoryService { private final CategoryRepository categoryRepository; private final TemplateRepository templateRepository; - private final MemberRepository memberJpaRepository; - - public CategoryService(CategoryRepository categoryRepository, TemplateRepository templateRepository, - MemberJpaRepository memberJpaRepository - ) { - this.categoryRepository = categoryRepository; - this.templateRepository = templateRepository; - this.memberJpaRepository = memberJpaRepository; - } + private final MemberRepository memberRepository; @Transactional public Long create(CreateCategoryRequest createCategoryRequest, MemberDto memberDto) { String categoryName = createCategoryRequest.name(); - Member member = memberJpaRepository.fetchById(memberDto.id()); + Member member = memberRepository.fetchById(memberDto.id()); validateDuplicatedCategory(categoryName, member); Category category = new Category(categoryName, member); return categoryRepository.save(category).getId(); @@ -51,7 +44,7 @@ public FindAllCategoriesResponse findAll() { @Transactional public void update(Long id, UpdateCategoryRequest updateCategoryRequest, MemberDto memberDto) { - Member member = memberJpaRepository.fetchById(memberDto.id()); + Member member = memberRepository.fetchById(memberDto.id()); validateDuplicatedCategory(updateCategoryRequest.name(), member); Category category = categoryRepository.fetchById(id); validateAuthorizeMember(category, member); @@ -65,7 +58,7 @@ private void validateDuplicatedCategory(String categoryName, Member member) { } public void deleteById(Long id, MemberDto memberDto) { - Member member = memberJpaRepository.fetchById(memberDto.id()); + Member member = memberRepository.fetchById(memberDto.id()); Category category = categoryRepository.fetchById(id); validateAuthorizeMember(category, member); diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index d6ff48adf..09f7fe501 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -34,8 +34,10 @@ import codezap.template.repository.TemplateRepository; import codezap.template.repository.TemplateTagRepository; import codezap.template.repository.ThumbnailSnippetRepository; +import lombok.RequiredArgsConstructor; @Service +@RequiredArgsConstructor public class TemplateService { public static final int FIRST_ORDINAL = 1; @@ -48,21 +50,6 @@ public class TemplateService { private final TemplateTagRepository templateTagRepository; private final MemberRepository memberRepository; - public TemplateService(ThumbnailSnippetRepository thumbnailSnippetRepository, - TemplateRepository templateRepository, SnippetRepository snippetRepository, - CategoryRepository categoryRepository, TagRepository tagRepository, - TemplateTagRepository templateTagRepository, - MemberRepository memberRepository - ) { - this.thumbnailSnippetRepository = thumbnailSnippetRepository; - this.templateRepository = templateRepository; - this.snippetRepository = snippetRepository; - this.categoryRepository = categoryRepository; - this.tagRepository = tagRepository; - this.templateTagRepository = templateTagRepository; - this.memberRepository = memberRepository; - } - @Transactional public Long createTemplate(CreateTemplateRequest createTemplateRequest, MemberDto memberDto) { Member member = memberRepository.fetchById(memberDto.id()); From ec0d95acfdd19c3f8aa36961ca98eaa6a04c999c Mon Sep 17 00:00:00 2001 From: HoeSeong123 Date: Wed, 7 Aug 2024 16:03:49 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor(template):=20snippet=EA=B3=BC=20?= =?UTF-8?q?=EC=96=91=EB=B0=A9=ED=96=A5=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/codezap/template/domain/Template.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index e3faf2060..6cfd1c656 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -1,5 +1,8 @@ package codezap.template.domain; +import java.util.List; +import java.util.Objects; + import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -7,6 +10,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import codezap.category.domain.Category; import codezap.global.auditing.BaseTimeEntity; @@ -37,6 +41,9 @@ public class Template extends BaseTimeEntity { @ManyToOne(optional = false) private Category category; + @OneToMany(mappedBy = "template") + private List snippets; + public Template(Member member, String title, String description, Category category) { this.member = member; this.title = title; @@ -49,4 +56,12 @@ public void updateTemplate(String title, String description, Category category) this.description = description; this.category = category; } + + public void updateSnippets(List snippet) { + snippets.addAll(snippet); + } + + public void deleteSnippet(Long deletedId) { + snippets.removeIf(snippet -> Objects.equals(snippet.getId(), deletedId)); + } } From 8d316bf60d1c415cfd4dd9026c2ab6992fe6670e Mon Sep 17 00:00:00 2001 From: HoeSeong123 Date: Wed, 7 Aug 2024 17:08:40 +0900 Subject: [PATCH 03/12] =?UTF-8?q?refactor(domain):=20AllArgsConstructor=20?= =?UTF-8?q?=EB=B0=8F=20EqualsAndHashCode=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/codezap/category/domain/Category.java | 2 ++ backend/src/main/java/codezap/template/domain/Snippet.java | 4 ++++ backend/src/main/java/codezap/template/domain/Tag.java | 4 ++++ backend/src/main/java/codezap/template/domain/Template.java | 4 ++++ .../src/main/java/codezap/template/domain/TemplateTag.java | 1 + .../main/java/codezap/template/domain/ThumbnailSnippet.java | 4 ++++ 6 files changed, 19 insertions(+) diff --git a/backend/src/main/java/codezap/category/domain/Category.java b/backend/src/main/java/codezap/category/domain/Category.java index a1621b296..21eb21059 100644 --- a/backend/src/main/java/codezap/category/domain/Category.java +++ b/backend/src/main/java/codezap/category/domain/Category.java @@ -14,6 +14,7 @@ import codezap.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -21,6 +22,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Getter +@EqualsAndHashCode(callSuper = false) @Table( uniqueConstraints = { @UniqueConstraint( diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index 31974afe8..d2ff68e0e 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -13,12 +13,16 @@ import codezap.global.auditing.BaseTimeEntity; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor @Getter +@EqualsAndHashCode(callSuper = false) public class Snippet extends BaseTimeEntity { private static final String LINE_BREAK = "\n"; diff --git a/backend/src/main/java/codezap/template/domain/Tag.java b/backend/src/main/java/codezap/template/domain/Tag.java index 7d6eb3d51..ca1eceb8e 100644 --- a/backend/src/main/java/codezap/template/domain/Tag.java +++ b/backend/src/main/java/codezap/template/domain/Tag.java @@ -8,12 +8,16 @@ import codezap.global.auditing.BaseTimeEntity; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor @Getter +@EqualsAndHashCode(callSuper = false) public class Tag extends BaseTimeEntity { @Id diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index 6cfd1c656..d2a58b601 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -16,12 +16,16 @@ import codezap.global.auditing.BaseTimeEntity; import codezap.member.domain.Member; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor @Getter +@EqualsAndHashCode(callSuper = false) public class Template extends BaseTimeEntity { @Id diff --git a/backend/src/main/java/codezap/template/domain/TemplateTag.java b/backend/src/main/java/codezap/template/domain/TemplateTag.java index 02a94916d..8dfa3c7d6 100644 --- a/backend/src/main/java/codezap/template/domain/TemplateTag.java +++ b/backend/src/main/java/codezap/template/domain/TemplateTag.java @@ -19,6 +19,7 @@ @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter +@EqualsAndHashCode(callSuper = false) public class TemplateTag extends BaseTimeEntity { @Embeddable diff --git a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java index 47664f625..3706ffddf 100644 --- a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java @@ -8,12 +8,16 @@ import codezap.global.auditing.BaseTimeEntity; import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor @Getter +@EqualsAndHashCode(callSuper = false) public class ThumbnailSnippet extends BaseTimeEntity { @Id From 3b4fed60cae7b63e6a8353e93b2b24d84ddb4f0b Mon Sep 17 00:00:00 2001 From: HoeSeong123 Date: Wed, 7 Aug 2024 17:33:35 +0900 Subject: [PATCH 04/12] =?UTF-8?q?refactor(repository):=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=99=98=EA=B2=BD=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=8E=98=EC=9D=B4=ED=81=AC=20?= =?UTF-8?q?=EB=94=94=EB=B9=84=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/SnippetJpaRepository.java | 27 ++++ .../repository/SnippetRepository.java | 19 +-- .../template/repository/TagJpaRepository.java | 25 +++ .../template/repository/TagRepository.java | 4 + .../repository/TemplateJpaRepository.java | 52 ++++++ .../repository/TemplateRepository.java | 19 ++- .../repository/TemplateTagJpaRepository.java | 19 +++ .../repository/TemplateTagRepository.java | 12 +- .../ThumbnailSnippetJpaRepository.java | 24 +++ .../ThumbnailSnippetRepository.java | 12 +- .../repository/FakeCategoryRepository.java | 4 + .../repository/FakeMemberRepository.java | 4 + .../repository/FakeSnippetRepository.java | 104 ++++++++++++ .../repository/FakeTagRepository.java | 73 +++++++++ .../repository/FakeTemplateRepository.java | 151 ++++++++++++++++++ .../repository/FakeTemplateTagRepository.java | 51 ++++++ .../FakeThumbnailSnippetRepository.java | 73 +++++++++ 17 files changed, 646 insertions(+), 27 deletions(-) create mode 100644 backend/src/main/java/codezap/template/repository/SnippetJpaRepository.java create mode 100644 backend/src/main/java/codezap/template/repository/TagJpaRepository.java create mode 100644 backend/src/main/java/codezap/template/repository/TemplateJpaRepository.java create mode 100644 backend/src/main/java/codezap/template/repository/TemplateTagJpaRepository.java create mode 100644 backend/src/main/java/codezap/template/repository/ThumbnailSnippetJpaRepository.java create mode 100644 backend/src/test/java/codezap/template/repository/FakeSnippetRepository.java create mode 100644 backend/src/test/java/codezap/template/repository/FakeTagRepository.java create mode 100644 backend/src/test/java/codezap/template/repository/FakeTemplateRepository.java create mode 100644 backend/src/test/java/codezap/template/repository/FakeTemplateTagRepository.java create mode 100644 backend/src/test/java/codezap/template/repository/FakeThumbnailSnippetRepository.java diff --git a/backend/src/main/java/codezap/template/repository/SnippetJpaRepository.java b/backend/src/main/java/codezap/template/repository/SnippetJpaRepository.java new file mode 100644 index 000000000..267fd5d83 --- /dev/null +++ b/backend/src/main/java/codezap/template/repository/SnippetJpaRepository.java @@ -0,0 +1,27 @@ +package codezap.template.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.http.HttpStatus; + +import codezap.global.exception.CodeZapException; +import codezap.template.domain.Snippet; +import codezap.template.domain.Template; + +@SuppressWarnings("unused") +public interface SnippetJpaRepository extends SnippetRepository, JpaRepository { + default Snippet fetchById(Long id) { + return findById(id).orElseThrow( + () -> new CodeZapException(HttpStatus.NOT_FOUND, "식별자 " + id + "에 해당하는 스니펫이 존재하지 않습니다.")); + } + + List findAllByTemplate(Template template); + + Optional findByTemplateAndOrdinal(Template template, int ordinal); + + List findAllByTemplateAndOrdinal(Template template, int ordinal); + + void deleteByTemplateId(Long id); +} diff --git a/backend/src/main/java/codezap/template/repository/SnippetRepository.java b/backend/src/main/java/codezap/template/repository/SnippetRepository.java index bfe6da88e..5bb705da6 100644 --- a/backend/src/main/java/codezap/template/repository/SnippetRepository.java +++ b/backend/src/main/java/codezap/template/repository/SnippetRepository.java @@ -3,18 +3,13 @@ import java.util.List; import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.http.HttpStatus; - -import codezap.global.exception.CodeZapException; import codezap.template.domain.Snippet; import codezap.template.domain.Template; -public interface SnippetRepository extends JpaRepository { - default Snippet fetchById(Long id) { - return findById(id).orElseThrow( - () -> new CodeZapException(HttpStatus.NOT_FOUND, "식별자 " + id + "에 해당하는 스니펫이 존재하지 않습니다.")); - } +public interface SnippetRepository { + Snippet fetchById(Long id); + + List findAll(); List findAllByTemplate(Template template); @@ -22,5 +17,11 @@ default Snippet fetchById(Long id) { List findAllByTemplateAndOrdinal(Template template, int ordinal); + Snippet save(Snippet snippet); + + List saveAll(List snippets); + + void deleteById(Long id); + void deleteByTemplateId(Long id); } diff --git a/backend/src/main/java/codezap/template/repository/TagJpaRepository.java b/backend/src/main/java/codezap/template/repository/TagJpaRepository.java new file mode 100644 index 000000000..8f03483b2 --- /dev/null +++ b/backend/src/main/java/codezap/template/repository/TagJpaRepository.java @@ -0,0 +1,25 @@ +package codezap.template.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.http.HttpStatus; + +import codezap.global.exception.CodeZapException; +import codezap.template.domain.Tag; + +@SuppressWarnings("unused") +public interface TagJpaRepository extends TagRepository, JpaRepository { + + default Tag fetchById(Long id) { + return findById(id).orElseThrow( + () -> new CodeZapException(HttpStatus.NOT_FOUND, "식별자 " + id + "에 해당하는 태그가 존재하지 않습니다.")); + } + + boolean existsByName(String name); + + Optional findByName(String name); + + List findByNameIn(List tagNames); +} diff --git a/backend/src/main/java/codezap/template/repository/TagRepository.java b/backend/src/main/java/codezap/template/repository/TagRepository.java index 0a31fe0cd..cc39acfde 100644 --- a/backend/src/main/java/codezap/template/repository/TagRepository.java +++ b/backend/src/main/java/codezap/template/repository/TagRepository.java @@ -21,4 +21,8 @@ default Tag fetchById(Long id) { Optional findByName(String name); List findByIdIn(List tagIds); + + Tag save(Tag tag); + + List saveAll(List tags); } diff --git a/backend/src/main/java/codezap/template/repository/TemplateJpaRepository.java b/backend/src/main/java/codezap/template/repository/TemplateJpaRepository.java new file mode 100644 index 000000000..c34c34370 --- /dev/null +++ b/backend/src/main/java/codezap/template/repository/TemplateJpaRepository.java @@ -0,0 +1,52 @@ +package codezap.template.repository; + +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.http.HttpStatus; + +import codezap.global.exception.CodeZapException; +import codezap.template.domain.Template; + +@SuppressWarnings("unused") +public interface TemplateJpaRepository extends TemplateRepository, JpaRepository { + + default Template fetchById(Long id) { + return findById(id).orElseThrow( + () -> new CodeZapException(HttpStatus.NOT_FOUND, "식별자 " + id + "에 해당하는 템플릿이 존재하지 않습니다.")); + } + + boolean existsByCategoryId(Long categoryId); + + @Query(""" + SELECT DISTINCT t + FROM Template t JOIN Snippet s ON t.id = s.template.id + WHERE t.member.id = :memberId AND + ( + t.title LIKE :topic + OR s.filename LIKE :topic + OR s.content LIKE :topic + OR t.description LIKE :topic + ) + """) + Page