From b7ca3cc5187e2e2ed9b78af2261373a46a5ad71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98jminkkk=E2=80=99?= <102847513+jminkkk@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:38:04 +0900 Subject: [PATCH 01/36] =?UTF-8?q?chore:=20=EC=8A=A4=ED=94=84=EB=A7=81?= =?UTF-8?q?=EB=8F=85=20=EC=84=A4=EC=A0=95=20=ED=8C=8C=EC=9D=BC=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swagger/SpringDocConfiguration.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 backend/src/main/java/codezap/swagger/SpringDocConfiguration.java diff --git a/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java b/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java new file mode 100644 index 000000000..4f7fec870 --- /dev/null +++ b/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java @@ -0,0 +1,24 @@ +package codezap.swagger; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; + +@OpenAPIDefinition(info = @io.swagger.v3.oas.annotations.info.Info(title = "코드잽 API", version = "v1")) +@Configuration +public class SpringDocConfiguration { + + @Bean + public OpenAPI openAPI() { + Info info = new Info() + .title("코드잽 API") + .version("v1.0") + .description("코드잽 API 명세서입니다."); + + return new OpenAPI() + .info(info); + } +} From 51bb10963f38bb8ab5845f3f9b08bf137123b947 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 10:47:33 +0900 Subject: [PATCH 02/36] =?UTF-8?q?refactor(codezap):=20ERD=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../codezap/extension/domain/Extension.java | 36 ---------------- .../repository/ExtensionRepository.java | 11 ----- .../codezap/language/domain/Language.java | 28 ------------- .../repository/LanguageRepository.java | 18 -------- .../java/codezap/member/domain/Member.java | 30 ------------- .../member/repository/MemberRepository.java | 8 ---- .../RepresentativeSnippetRepository.java | 8 ---- .../java/codezap/snippet/domain/Snippet.java | 5 --- .../controller/TemplateController.java | 4 +- .../codezap/template/domain/Template.java | 7 ---- .../dto/request/CreateTemplateRequest.java | 1 - .../response/FindAllTemplatesResponse.java | 6 +-- .../response/FindMemberBySummaryResponse.java | 15 ------- .../response/FindTemplateByIdResponse.java | 4 -- .../FindTemplateBySummaryResponse.java | 16 ++++--- ...java => FindThumbnailSnippetResponse.java} | 6 +-- .../template/service/TemplateService.java | 42 +++++-------------- .../domain/ThumbnailSnippet.java} | 4 +- .../ThumbnailSnippetRepository.java | 8 ++++ 19 files changed, 36 insertions(+), 221 deletions(-) delete mode 100644 backend/src/main/java/codezap/extension/domain/Extension.java delete mode 100644 backend/src/main/java/codezap/extension/repository/ExtensionRepository.java delete mode 100644 backend/src/main/java/codezap/language/domain/Language.java delete mode 100644 backend/src/main/java/codezap/language/repository/LanguageRepository.java delete mode 100644 backend/src/main/java/codezap/member/domain/Member.java delete mode 100644 backend/src/main/java/codezap/member/repository/MemberRepository.java delete mode 100644 backend/src/main/java/codezap/representative_snippet/repository/RepresentativeSnippetRepository.java delete mode 100644 backend/src/main/java/codezap/template/dto/response/FindMemberBySummaryResponse.java rename backend/src/main/java/codezap/template/dto/response/{FindRepresentativeSnippetResponse.java => FindThumbnailSnippetResponse.java} (57%) rename backend/src/main/java/codezap/{representative_snippet/domain/RepresentativeSnippet.java => thumbnail_snippet/domain/ThumbnailSnippet.java} (88%) create mode 100644 backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java diff --git a/backend/src/main/java/codezap/extension/domain/Extension.java b/backend/src/main/java/codezap/extension/domain/Extension.java deleted file mode 100644 index 6bd51b9d3..000000000 --- a/backend/src/main/java/codezap/extension/domain/Extension.java +++ /dev/null @@ -1,36 +0,0 @@ -package codezap.extension.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -import codezap.global.domain.BaseTimeEntity; -import codezap.language.domain.Language; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "extension") -@Getter -@AllArgsConstructor -@NoArgsConstructor -public class Extension extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "language_id", nullable = false) - private Language language; - - @Column(nullable = false, unique = true) - private String name; -} diff --git a/backend/src/main/java/codezap/extension/repository/ExtensionRepository.java b/backend/src/main/java/codezap/extension/repository/ExtensionRepository.java deleted file mode 100644 index 276017103..000000000 --- a/backend/src/main/java/codezap/extension/repository/ExtensionRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package codezap.extension.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import codezap.extension.domain.Extension; - -public interface ExtensionRepository extends JpaRepository { - Optional findByName(String name); -} diff --git a/backend/src/main/java/codezap/language/domain/Language.java b/backend/src/main/java/codezap/language/domain/Language.java deleted file mode 100644 index cddc03d48..000000000 --- a/backend/src/main/java/codezap/language/domain/Language.java +++ /dev/null @@ -1,28 +0,0 @@ -package codezap.language.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -import codezap.global.domain.BaseTimeEntity; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Table(name = "language") -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class Language extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String name; -} diff --git a/backend/src/main/java/codezap/language/repository/LanguageRepository.java b/backend/src/main/java/codezap/language/repository/LanguageRepository.java deleted file mode 100644 index 1fcd4a0aa..000000000 --- a/backend/src/main/java/codezap/language/repository/LanguageRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package codezap.language.repository; - -import java.util.NoSuchElementException; -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import codezap.language.domain.Language; - -public interface LanguageRepository extends JpaRepository { - - Optional findByName(String name); - - default Language getByName(String name) { - return findByName(name).orElseThrow( - () -> new NoSuchElementException(name + " 언어가 존재하지 않습니다.")); - } -} diff --git a/backend/src/main/java/codezap/member/domain/Member.java b/backend/src/main/java/codezap/member/domain/Member.java deleted file mode 100644 index a1924d713..000000000 --- a/backend/src/main/java/codezap/member/domain/Member.java +++ /dev/null @@ -1,30 +0,0 @@ -package codezap.member.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -import codezap.global.domain.BaseTimeEntity; -import lombok.Getter; - -@Entity -@Table(name = "member") -@Getter -public class Member extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(unique = true, nullable = false) - private String email; - - @Column(nullable = false) - private String password; - - @Column(nullable = false) - private String nickname; -} diff --git a/backend/src/main/java/codezap/member/repository/MemberRepository.java b/backend/src/main/java/codezap/member/repository/MemberRepository.java deleted file mode 100644 index b109ac982..000000000 --- a/backend/src/main/java/codezap/member/repository/MemberRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package codezap.member.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import codezap.member.domain.Member; - -public interface MemberRepository extends JpaRepository { -} diff --git a/backend/src/main/java/codezap/representative_snippet/repository/RepresentativeSnippetRepository.java b/backend/src/main/java/codezap/representative_snippet/repository/RepresentativeSnippetRepository.java deleted file mode 100644 index 7878b3657..000000000 --- a/backend/src/main/java/codezap/representative_snippet/repository/RepresentativeSnippetRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package codezap.representative_snippet.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import codezap.representative_snippet.domain.RepresentativeSnippet; - -public interface RepresentativeSnippetRepository extends JpaRepository { -} diff --git a/backend/src/main/java/codezap/snippet/domain/Snippet.java b/backend/src/main/java/codezap/snippet/domain/Snippet.java index 2b585bb1c..5a8d551eb 100644 --- a/backend/src/main/java/codezap/snippet/domain/Snippet.java +++ b/backend/src/main/java/codezap/snippet/domain/Snippet.java @@ -13,7 +13,6 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import codezap.extension.domain.Extension; import codezap.global.domain.BaseTimeEntity; import codezap.template.domain.Template; import lombok.AllArgsConstructor; @@ -35,10 +34,6 @@ public class Snippet extends BaseTimeEntity { @JoinColumn(name = "template_id", nullable = false) private Template template; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "extension_id", nullable = false) - private Extension extension; - @Column(nullable = false) private String filename; diff --git a/backend/src/main/java/codezap/template/controller/TemplateController.java b/backend/src/main/java/codezap/template/controller/TemplateController.java index e856522c6..7da442df2 100644 --- a/backend/src/main/java/codezap/template/controller/TemplateController.java +++ b/backend/src/main/java/codezap/template/controller/TemplateController.java @@ -21,7 +21,9 @@ public class TemplateController implements SpringDocTemplateController { private final TemplateService templateService; - public TemplateController(TemplateService templateService) {this.templateService = templateService;} + public TemplateController(TemplateService templateService) { + this.templateService = templateService; + } @PostMapping("") public ResponseEntity create(@RequestBody CreateTemplateRequest createTemplateRequest) { diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index 9aae3df43..6baf5f4de 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -5,12 +5,9 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import codezap.global.domain.BaseTimeEntity; -import codezap.member.domain.Member; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -26,10 +23,6 @@ public class Template extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - @JoinColumn(name = "member_id", nullable = false) - private Member member; - @Column(nullable = false) private String title; } diff --git a/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java b/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java index f71996a30..4b38544f3 100644 --- a/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java +++ b/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java @@ -4,7 +4,6 @@ public record CreateTemplateRequest( String title, - int representative_snippet_ordinal, List snippets ) { } diff --git a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java index fddf1a2c9..641fa8555 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java @@ -2,13 +2,13 @@ import java.util.List; -import codezap.representative_snippet.domain.RepresentativeSnippet; +import codezap.thumbnail_snippet.domain.ThumbnailSnippet; public record FindAllTemplatesResponse( List templates ) { - public static FindAllTemplatesResponse from(List representativeSnippets) { - List templatesBySummaryResponse = representativeSnippets.stream() + public static FindAllTemplatesResponse from(List thumbnailSnippets) { + List templatesBySummaryResponse = thumbnailSnippets.stream() .map(FindTemplateBySummaryResponse::from) .toList(); return new FindAllTemplatesResponse(templatesBySummaryResponse); diff --git a/backend/src/main/java/codezap/template/dto/response/FindMemberBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindMemberBySummaryResponse.java deleted file mode 100644 index 4c1f8b72d..000000000 --- a/backend/src/main/java/codezap/template/dto/response/FindMemberBySummaryResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package codezap.template.dto.response; - -import codezap.member.domain.Member; - -public record FindMemberBySummaryResponse( - Long id, - String nickname -) { - public static FindMemberBySummaryResponse from(Member member) { - return new FindMemberBySummaryResponse( - member.getId(), - member.getNickname() - ); - } -} diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java index 6394f3f21..1dbf2f190 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java @@ -9,8 +9,6 @@ public record FindTemplateByIdResponse( Long id, String title, - FindMemberBySummaryResponse member, - Integer representative_snippet_ordinal, List snippets, LocalDateTime modified_at ) { @@ -18,8 +16,6 @@ public static FindTemplateByIdResponse from(Template template, List sni return new FindTemplateByIdResponse( template.getId(), template.getTitle(), - FindMemberBySummaryResponse.from(template.getMember()), - 1, mapToFindAllSnippetByTemplateResponse(snippets), template.getModifiedAt() ); diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java index de75ad878..d43e79226 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java @@ -2,22 +2,20 @@ import java.time.LocalDateTime; -import codezap.representative_snippet.domain.RepresentativeSnippet; +import codezap.thumbnail_snippet.domain.ThumbnailSnippet; public record FindTemplateBySummaryResponse( Long id, String title, - FindMemberBySummaryResponse member, - FindRepresentativeSnippetResponse representative_snippet, + FindThumbnailSnippetResponse thumbnailSnippet, LocalDateTime modified_at ) { - public static FindTemplateBySummaryResponse from(RepresentativeSnippet representativeSnippet) { + public static FindTemplateBySummaryResponse from(ThumbnailSnippet thumbnailSnippet) { return new FindTemplateBySummaryResponse( - representativeSnippet.getTemplate().getId(), - representativeSnippet.getTemplate().getTitle(), - FindMemberBySummaryResponse.from(representativeSnippet.getTemplate().getMember()), - FindRepresentativeSnippetResponse.from(representativeSnippet.getSnippet()), - representativeSnippet.getModifiedAt() + thumbnailSnippet.getTemplate().getId(), + thumbnailSnippet.getTemplate().getTitle(), + FindThumbnailSnippetResponse.from(thumbnailSnippet.getSnippet()), + thumbnailSnippet.getModifiedAt() ); } } diff --git a/backend/src/main/java/codezap/template/dto/response/FindRepresentativeSnippetResponse.java b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java similarity index 57% rename from backend/src/main/java/codezap/template/dto/response/FindRepresentativeSnippetResponse.java rename to backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java index b539c96c0..45ab86cdf 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindRepresentativeSnippetResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java @@ -2,12 +2,12 @@ import codezap.snippet.domain.Snippet; -public record FindRepresentativeSnippetResponse( +public record FindThumbnailSnippetResponse( String filename, String content_summary ) { - public static FindRepresentativeSnippetResponse from(Snippet snippet) { - return new FindRepresentativeSnippetResponse( + public static FindThumbnailSnippetResponse from(Snippet snippet) { + return new FindThumbnailSnippetResponse( snippet.getFilename(), snippet.getSummaryContent() ); diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index 6852c59fc..5eaada763 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -5,12 +5,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import codezap.extension.domain.Extension; -import codezap.extension.repository.ExtensionRepository; -import codezap.language.repository.LanguageRepository; -import codezap.member.repository.MemberRepository; -import codezap.representative_snippet.domain.RepresentativeSnippet; -import codezap.representative_snippet.repository.RepresentativeSnippetRepository; import codezap.snippet.domain.Snippet; import codezap.snippet.repository.SnippetRepository; import codezap.template.domain.Template; @@ -19,61 +13,45 @@ import codezap.template.dto.response.FindAllTemplatesResponse; import codezap.template.dto.response.FindTemplateByIdResponse; import codezap.template.repository.TemplateRepository; +import codezap.thumbnail_snippet.domain.ThumbnailSnippet; +import codezap.thumbnail_snippet.repository.ThumbnailSnippetRepository; @Service public class TemplateService { - private final RepresentativeSnippetRepository representativeSnippetRepository; + private final ThumbnailSnippetRepository thumbnailSnippetRepository; private final TemplateRepository templateRepository; private final SnippetRepository snippetRepository; - private final ExtensionRepository extensionRepository; - private final MemberRepository memberRepository; - private final LanguageRepository languageRepository; - public TemplateService(RepresentativeSnippetRepository representativeSnippetRepository, - TemplateRepository templateRepository, SnippetRepository snippetRepository, - ExtensionRepository extensionRepository, MemberRepository memberRepository, - LanguageRepository languageRepository + public TemplateService(ThumbnailSnippetRepository thumbnailSnippetRepository, + TemplateRepository templateRepository, SnippetRepository snippetRepository ) { - this.representativeSnippetRepository = representativeSnippetRepository; + this.thumbnailSnippetRepository = thumbnailSnippetRepository; this.templateRepository = templateRepository; this.snippetRepository = snippetRepository; - this.extensionRepository = extensionRepository; - this.memberRepository = memberRepository; - this.languageRepository = languageRepository; } @Transactional public Long create(CreateTemplateRequest createTemplateRequest) { Template template = templateRepository.save( - new Template(null, memberRepository.getById(1L), createTemplateRequest.title())); + new Template(null, createTemplateRequest.title())); List snippets = createTemplateRequest.snippets().stream() .map(createSnippetRequest -> createSnippet(createSnippetRequest, template)) .toList(); - RepresentativeSnippet representativeSnippet = representativeSnippetRepository.save( - new RepresentativeSnippet(null, template, snippets.get(0))); + thumbnailSnippetRepository.save(new ThumbnailSnippet(null, template, snippets.get(0))); return template.getId(); } private Snippet createSnippet(CreateSnippetRequest createSnippetRequest, Template template) { - String[] splitName = createSnippetRequest.filename().split("\\."); - Extension extension = findExtensionOrCreate(splitName[splitName.length - 1]); - return snippetRepository.save( - new Snippet(null, template, extension, createSnippetRequest.filename(), createSnippetRequest.content(), + new Snippet(null, template, createSnippetRequest.filename(), createSnippetRequest.content(), createSnippetRequest.ordinal())); } - private Extension findExtensionOrCreate(String name) { - return extensionRepository.findByName(name) - .orElseGet(() -> extensionRepository.save( - new Extension(null, languageRepository.getByName("PlainText"), name))); - } - public FindAllTemplatesResponse findAll() { - return FindAllTemplatesResponse.from(representativeSnippetRepository.findAll()); + return FindAllTemplatesResponse.from(thumbnailSnippetRepository.findAll()); } public FindTemplateByIdResponse findById(Long id) { diff --git a/backend/src/main/java/codezap/representative_snippet/domain/RepresentativeSnippet.java b/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java similarity index 88% rename from backend/src/main/java/codezap/representative_snippet/domain/RepresentativeSnippet.java rename to backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java index 064240d79..e04138ed4 100644 --- a/backend/src/main/java/codezap/representative_snippet/domain/RepresentativeSnippet.java +++ b/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java @@ -1,4 +1,4 @@ -package codezap.representative_snippet.domain; +package codezap.thumbnail_snippet.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -20,7 +20,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class RepresentativeSnippet extends BaseTimeEntity { +public class ThumbnailSnippet extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java b/backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java new file mode 100644 index 000000000..3ef47380d --- /dev/null +++ b/backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java @@ -0,0 +1,8 @@ +package codezap.thumbnail_snippet.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import codezap.thumbnail_snippet.domain.ThumbnailSnippet; + +public interface ThumbnailSnippetRepository extends JpaRepository { +} From 33ebac55fb5cba2b7e21be4411a5b6bc19d502e0 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 10:54:38 +0900 Subject: [PATCH 03/36] =?UTF-8?q?refactor(domain):=20=EC=9D=98=EB=AF=B8=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EC=83=81=EC=88=98=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../src/main/java/codezap/snippet/domain/Snippet.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/codezap/snippet/domain/Snippet.java b/backend/src/main/java/codezap/snippet/domain/Snippet.java index 5a8d551eb..3a20ef9a4 100644 --- a/backend/src/main/java/codezap/snippet/domain/Snippet.java +++ b/backend/src/main/java/codezap/snippet/domain/Snippet.java @@ -26,6 +26,9 @@ @NoArgsConstructor public class Snippet extends BaseTimeEntity { + private static final String CODE_LINE_BREAK = "\n"; + private static final int THUMBNAIL_SNIPPET_SIZE = 10; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -44,8 +47,8 @@ public class Snippet extends BaseTimeEntity { private Integer ordinal; public String getSummaryContent() { - return Arrays.stream(content.split("\n")) - .limit(10) - .collect(Collectors.joining("\n")); + return Arrays.stream(content.split(CODE_LINE_BREAK)) + .limit(THUMBNAIL_SNIPPET_SIZE) + .collect(Collectors.joining(CODE_LINE_BREAK)); } } From 4bb779449070ba87ddc88f7266a930f105079769 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 13:47:47 +0900 Subject: [PATCH 04/36] =?UTF-8?q?refactor(codezap):=20global=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=ED=95=98=EC=9C=84=20=ED=95=AD=EB=AA=A9?= =?UTF-8?q?=EC=9D=84=20=EC=9A=A9=EB=8F=84=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../{domain => auditing}/BaseTimeEntity.java | 2 +- .../JpaAuditingConfiguration.java | 2 +- .../{ => cors}/WebCorsConfiguration.java | 2 +- .../DateTimeFormatConfiguration.java | 2 +- .../{ => swagger}/SpringDocConfiguration.java | 2 +- .../java/codezap/snippet/domain/Snippet.java | 2 +- .../swagger/SpringDocConfiguration.java | 24 ------------------- .../codezap/template/domain/Template.java | 2 +- .../domain/ThumbnailSnippet.java | 2 +- 9 files changed, 8 insertions(+), 32 deletions(-) rename backend/src/main/java/codezap/global/{domain => auditing}/BaseTimeEntity.java (95%) rename backend/src/main/java/codezap/global/{domain => auditing}/JpaAuditingConfiguration.java (86%) rename backend/src/main/java/codezap/global/{ => cors}/WebCorsConfiguration.java (94%) rename backend/src/main/java/codezap/global/{ => serializing}/DateTimeFormatConfiguration.java (96%) rename backend/src/main/java/codezap/global/{ => swagger}/SpringDocConfiguration.java (95%) delete mode 100644 backend/src/main/java/codezap/swagger/SpringDocConfiguration.java diff --git a/backend/src/main/java/codezap/global/domain/BaseTimeEntity.java b/backend/src/main/java/codezap/global/auditing/BaseTimeEntity.java similarity index 95% rename from backend/src/main/java/codezap/global/domain/BaseTimeEntity.java rename to backend/src/main/java/codezap/global/auditing/BaseTimeEntity.java index 3ee8b0548..9afcea565 100644 --- a/backend/src/main/java/codezap/global/domain/BaseTimeEntity.java +++ b/backend/src/main/java/codezap/global/auditing/BaseTimeEntity.java @@ -1,4 +1,4 @@ -package codezap.global.domain; +package codezap.global.auditing; import java.time.LocalDateTime; diff --git a/backend/src/main/java/codezap/global/domain/JpaAuditingConfiguration.java b/backend/src/main/java/codezap/global/auditing/JpaAuditingConfiguration.java similarity index 86% rename from backend/src/main/java/codezap/global/domain/JpaAuditingConfiguration.java rename to backend/src/main/java/codezap/global/auditing/JpaAuditingConfiguration.java index 871e8f59d..eaf811964 100644 --- a/backend/src/main/java/codezap/global/domain/JpaAuditingConfiguration.java +++ b/backend/src/main/java/codezap/global/auditing/JpaAuditingConfiguration.java @@ -1,4 +1,4 @@ -package codezap.global.domain; +package codezap.global.auditing; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; diff --git a/backend/src/main/java/codezap/global/WebCorsConfiguration.java b/backend/src/main/java/codezap/global/cors/WebCorsConfiguration.java similarity index 94% rename from backend/src/main/java/codezap/global/WebCorsConfiguration.java rename to backend/src/main/java/codezap/global/cors/WebCorsConfiguration.java index f2a8dcbd7..b69d3863d 100644 --- a/backend/src/main/java/codezap/global/WebCorsConfiguration.java +++ b/backend/src/main/java/codezap/global/cors/WebCorsConfiguration.java @@ -1,4 +1,4 @@ -package codezap.global; +package codezap.global.cors; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/backend/src/main/java/codezap/global/DateTimeFormatConfiguration.java b/backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java similarity index 96% rename from backend/src/main/java/codezap/global/DateTimeFormatConfiguration.java rename to backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java index eae2bf8ce..9cc25ca94 100644 --- a/backend/src/main/java/codezap/global/DateTimeFormatConfiguration.java +++ b/backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java @@ -1,4 +1,4 @@ -package codezap.global; +package codezap.global.serializing; import java.time.format.DateTimeFormatter; import java.util.TimeZone; diff --git a/backend/src/main/java/codezap/global/SpringDocConfiguration.java b/backend/src/main/java/codezap/global/swagger/SpringDocConfiguration.java similarity index 95% rename from backend/src/main/java/codezap/global/SpringDocConfiguration.java rename to backend/src/main/java/codezap/global/swagger/SpringDocConfiguration.java index 60c354b62..5d0df91bb 100644 --- a/backend/src/main/java/codezap/global/SpringDocConfiguration.java +++ b/backend/src/main/java/codezap/global/swagger/SpringDocConfiguration.java @@ -1,4 +1,4 @@ -package codezap.global; +package codezap.global.swagger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/backend/src/main/java/codezap/snippet/domain/Snippet.java b/backend/src/main/java/codezap/snippet/domain/Snippet.java index 3a20ef9a4..22da5eefb 100644 --- a/backend/src/main/java/codezap/snippet/domain/Snippet.java +++ b/backend/src/main/java/codezap/snippet/domain/Snippet.java @@ -13,7 +13,7 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import codezap.global.domain.BaseTimeEntity; +import codezap.global.auditing.BaseTimeEntity; import codezap.template.domain.Template; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java b/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java deleted file mode 100644 index 4f7fec870..000000000 --- a/backend/src/main/java/codezap/swagger/SpringDocConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package codezap.swagger; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; - -@OpenAPIDefinition(info = @io.swagger.v3.oas.annotations.info.Info(title = "코드잽 API", version = "v1")) -@Configuration -public class SpringDocConfiguration { - - @Bean - public OpenAPI openAPI() { - Info info = new Info() - .title("코드잽 API") - .version("v1.0") - .description("코드잽 API 명세서입니다."); - - return new OpenAPI() - .info(info); - } -} diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index 6baf5f4de..5e627ccb3 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -7,7 +7,7 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; -import codezap.global.domain.BaseTimeEntity; +import codezap.global.auditing.BaseTimeEntity; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java index e04138ed4..b634ed643 100644 --- a/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java @@ -8,7 +8,7 @@ import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import codezap.global.domain.BaseTimeEntity; +import codezap.global.auditing.BaseTimeEntity; import codezap.snippet.domain.Snippet; import codezap.template.domain.Template; import lombok.AllArgsConstructor; From 35a741fd02edb02df87b5216eeb74bc3f282ab5c Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 13:49:06 +0900 Subject: [PATCH 05/36] =?UTF-8?q?refactor(codezap):=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD(thumbnail?= =?UTF-8?q?=5Fsnippet=EC=97=90=EC=84=9C=20=EC=96=B8=EB=8D=94=EB=B0=94=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../template/dto/response/FindAllTemplatesResponse.java | 2 +- .../template/dto/response/FindTemplateBySummaryResponse.java | 2 +- .../main/java/codezap/template/service/TemplateService.java | 4 ++-- .../domain/ThumbnailSnippet.java | 2 +- .../repository/ThumbnailSnippetRepository.java | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) rename backend/src/main/java/codezap/{thumbnail_snippet => thumbnailsnippet}/domain/ThumbnailSnippet.java (95%) rename backend/src/main/java/codezap/{thumbnail_snippet => thumbnailsnippet}/repository/ThumbnailSnippetRepository.java (60%) diff --git a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java index 641fa8555..0b3bd8785 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java @@ -2,7 +2,7 @@ import java.util.List; -import codezap.thumbnail_snippet.domain.ThumbnailSnippet; +import codezap.thumbnailsnippet.domain.ThumbnailSnippet; public record FindAllTemplatesResponse( List templates diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java index d43e79226..f5c97c544 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java @@ -2,7 +2,7 @@ import java.time.LocalDateTime; -import codezap.thumbnail_snippet.domain.ThumbnailSnippet; +import codezap.thumbnailsnippet.domain.ThumbnailSnippet; public record FindTemplateBySummaryResponse( Long id, diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index 5eaada763..504bc2ce1 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -13,8 +13,8 @@ import codezap.template.dto.response.FindAllTemplatesResponse; import codezap.template.dto.response.FindTemplateByIdResponse; import codezap.template.repository.TemplateRepository; -import codezap.thumbnail_snippet.domain.ThumbnailSnippet; -import codezap.thumbnail_snippet.repository.ThumbnailSnippetRepository; +import codezap.thumbnailsnippet.domain.ThumbnailSnippet; +import codezap.thumbnailsnippet.repository.ThumbnailSnippetRepository; @Service public class TemplateService { diff --git a/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java similarity index 95% rename from backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java rename to backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java index b634ed643..504b5529a 100644 --- a/backend/src/main/java/codezap/thumbnail_snippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java @@ -1,4 +1,4 @@ -package codezap.thumbnail_snippet.domain; +package codezap.thumbnailsnippet.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java b/backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java similarity index 60% rename from backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java rename to backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java index 3ef47380d..c9ca51ec1 100644 --- a/backend/src/main/java/codezap/thumbnail_snippet/repository/ThumbnailSnippetRepository.java +++ b/backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java @@ -1,8 +1,8 @@ -package codezap.thumbnail_snippet.repository; +package codezap.thumbnailsnippet.repository; import org.springframework.data.jpa.repository.JpaRepository; -import codezap.thumbnail_snippet.domain.ThumbnailSnippet; +import codezap.thumbnailsnippet.domain.ThumbnailSnippet; public interface ThumbnailSnippetRepository extends JpaRepository { } From 86805f1e58723141eb1771f356438466d564e3a5 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 13:51:40 +0900 Subject: [PATCH 06/36] =?UTF-8?q?feat(exception):=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=85=80=20exception=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../global/exception/CodeZapException.java | 15 ++++++++++++ .../exception/GlobalExceptionHandler.java | 24 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 backend/src/main/java/codezap/global/exception/CodeZapException.java create mode 100644 backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java diff --git a/backend/src/main/java/codezap/global/exception/CodeZapException.java b/backend/src/main/java/codezap/global/exception/CodeZapException.java new file mode 100644 index 000000000..71af97c34 --- /dev/null +++ b/backend/src/main/java/codezap/global/exception/CodeZapException.java @@ -0,0 +1,15 @@ +package codezap.global.exception; + +import org.springframework.http.HttpStatusCode; + +import lombok.Getter; + +@Getter +public class CodeZapException extends RuntimeException { + private final HttpStatusCode httpStatusCode; + + public CodeZapException(HttpStatusCode httpStatusCode, String message) { + super(message); + this.httpStatusCode = httpStatusCode; + } +} diff --git a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java new file mode 100644 index 000000000..01c0ec200 --- /dev/null +++ b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,24 @@ +package codezap.global.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ProblemDetail; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler + public ResponseEntity handleCodeZapException(CodeZapException codeZapException) { + return ResponseEntity.status(codeZapException.getHttpStatusCode()) + .body(ProblemDetail.forStatusAndDetail(codeZapException.getHttpStatusCode(), + codeZapException.getMessage())); + } + + @ExceptionHandler + public ResponseEntity handleException(Exception exception) { + return ResponseEntity.internalServerError() + .body(ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, exception.getMessage())); + } +} From ce9c803826a15226c2da57ab83984961720363b7 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 16:50:12 +0900 Subject: [PATCH 07/36] =?UTF-8?q?refactor(domain):=20Table=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/src/main/java/codezap/snippet/domain/Snippet.java | 2 -- backend/src/main/java/codezap/template/domain/Template.java | 2 -- .../java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java | 2 -- 3 files changed, 6 deletions(-) diff --git a/backend/src/main/java/codezap/snippet/domain/Snippet.java b/backend/src/main/java/codezap/snippet/domain/Snippet.java index 22da5eefb..f928f07e4 100644 --- a/backend/src/main/java/codezap/snippet/domain/Snippet.java +++ b/backend/src/main/java/codezap/snippet/domain/Snippet.java @@ -11,7 +11,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; import codezap.global.auditing.BaseTimeEntity; import codezap.template.domain.Template; @@ -20,7 +19,6 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "snippet") @Getter @AllArgsConstructor @NoArgsConstructor diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index 5e627ccb3..bbaafc3b4 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -5,7 +5,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.Table; import codezap.global.auditing.BaseTimeEntity; import lombok.AllArgsConstructor; @@ -13,7 +12,6 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "template") @Getter @AllArgsConstructor @NoArgsConstructor diff --git a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java index 504b5529a..6c02fd709 100644 --- a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java @@ -6,7 +6,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; -import jakarta.persistence.Table; import codezap.global.auditing.BaseTimeEntity; import codezap.snippet.domain.Snippet; @@ -16,7 +15,6 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "representative_snippet") @Getter @NoArgsConstructor @AllArgsConstructor From 7e436767081e7d4137f0b459ac736a028bfe2c60 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 16:52:34 +0900 Subject: [PATCH 08/36] =?UTF-8?q?refactor(domain):=20ThumbnailSnippet?= =?UTF-8?q?=EC=9D=98=20template=20=EC=86=8D=EC=84=B1=EC=97=90=20not=20null?= =?UTF-8?q?=20=EC=A0=9C=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java index 6c02fd709..36c6c27a6 100644 --- a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java @@ -25,7 +25,7 @@ public class ThumbnailSnippet extends BaseTimeEntity { private Long id; @OneToOne - @JoinColumn(name = "template_id") + @JoinColumn(name = "template_id", nullable = false) private Template template; @OneToOne From 7af7f9968c7168623293acb7057218fe1016267b Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 17:25:06 +0900 Subject: [PATCH 09/36] =?UTF-8?q?chore:=20restAssured=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/build.gradle b/backend/build.gradle index 79ee2194d..b063073d8 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -21,6 +21,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + testImplementation 'io.rest-assured:rest-assured:5.5.0' + compileOnly 'org.projectlombok:lombok:0.11.0' annotationProcessor 'org.projectlombok:lombok' From a98ed612c1d3d9f87bf89f663e3c52f4105d0cc4 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 17:26:09 +0900 Subject: [PATCH 10/36] =?UTF-8?q?test(service):=20TemplateSerivce=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../template/service/TemplateServiceTest.java | 92 +++++++++++++++++++ backend/src/test/resources/clear.sql | 37 ++++++++ 2 files changed, 129 insertions(+) create mode 100644 backend/src/test/java/codezap/template/service/TemplateServiceTest.java create mode 100644 backend/src/test/resources/clear.sql diff --git a/backend/src/test/java/codezap/template/service/TemplateServiceTest.java b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java new file mode 100644 index 000000000..3c8b91a4d --- /dev/null +++ b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java @@ -0,0 +1,92 @@ +package codezap.template.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.Sql.ExecutionPhase; + +import codezap.template.dto.request.CreateSnippetRequest; +import codezap.template.dto.request.CreateTemplateRequest; +import codezap.template.dto.response.FindAllTemplatesResponse; +import codezap.template.dto.response.FindTemplateByIdResponse; +import io.restassured.RestAssured; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@Sql(value = "/clear.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(value = "/clear.sql", executionPhase = ExecutionPhase.AFTER_TEST_CLASS) +class TemplateServiceTest { + + @Autowired + private TemplateService templateService; + + @LocalServerPort + int port; + + @BeforeEach + void setting() { + RestAssured.port = port; + } + + @Test + @DisplayName("템플릿 생성 성공") + void createTemplateSuccess() { + //given + CreateTemplateRequest createTemplateRequest = makeTemplate("title"); + + //when + Long createdId = templateService.create(createTemplateRequest); + + //then + assertThat(createdId).isEqualTo(1L); + } + + @Test + @DisplayName("템플릿 전체 조회 성공") + void findAllTemplatesSuccess() { + //given + templateService.create(makeTemplate("title1")); + templateService.create(makeTemplate("title2")); + + //when + FindAllTemplatesResponse allTemplates = templateService.findAll(); + + //then + assertThat(allTemplates.templates().size()).isEqualTo(2); + } + + @Test + @DisplayName("템플릿 단건 조회 성공") + void findOneTemplateSuccess() { + //given + Long createdId = templateService.create(makeTemplate("title")); + + //when + FindTemplateByIdResponse foundTemplate = templateService.findById(createdId); + + //then + assertAll( + () -> assertThat(foundTemplate.title()).isEqualTo("title"), + () -> assertThat(foundTemplate.snippets().size()).isEqualTo(2) + ); + } + + private CreateTemplateRequest makeTemplate(String title) { + return new CreateTemplateRequest( + title, + List.of( + new CreateSnippetRequest("filename1", "content1", 1), + new CreateSnippetRequest("filename2", "content2", 2) + ) + ); + } +} diff --git a/backend/src/test/resources/clear.sql b/backend/src/test/resources/clear.sql new file mode 100644 index 000000000..845a987b2 --- /dev/null +++ b/backend/src/test/resources/clear.sql @@ -0,0 +1,37 @@ +DROP TABLE IF EXISTS thumbnail_snippet; +DROP TABLE IF EXISTS snippet; +DROP TABLE IF EXISTS template; + +CREATE TABLE template +( + id BIGINT NOT NULL AUTO_INCREMENT, + title VARCHAR(255) NOT NULL, + created_at DATETIME(6) NOT NULL, + modified_at DATETIME(6) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE snippet +( + id BIGINT NOT NULL AUTO_INCREMENT, + template_id BIGINT NOT NULL, + filename VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + ordinal INTEGER NOT NULL, + created_at DATETIME(6) NOT NULL, + modified_at DATETIME(6) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (template_id) REFERENCES template (id) +); + +CREATE TABLE thumbnail_snippet +( + id BIGINT NOT NULL AUTO_INCREMENT, + template_id BIGINT NOT NULL, + snippet_id BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + modified_at DATETIME(6) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (template_id) REFERENCES template (id), + FOREIGN KEY (snippet_id) REFERENCES snippet (id) +); From ea6a80d18b4f073fd3f376800d9b55ad8c5b22b4 Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 18 Jul 2024 18:42:13 +0900 Subject: [PATCH 11/36] =?UTF-8?q?chore:=20validation=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/backend/build.gradle b/backend/build.gradle index b063073d8..253dde238 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -20,17 +20,16 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - - testImplementation 'io.rest-assured:rest-assured:5.5.0' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' compileOnly 'org.projectlombok:lombok:0.11.0' annotationProcessor 'org.projectlombok:lombok' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' - runtimeOnly 'com.mysql:mysql-connector-j:9.0.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'io.rest-assured:rest-assured:5.5.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } From c8d8db81a1e8dfd8c4d60dc08a83f19a42e36dfb Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 19 Jul 2024 16:10:19 +0900 Subject: [PATCH 12/36] =?UTF-8?q?refactor(template):=20Snippet=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=9D=84=20Template=20=ED=95=98=EC=9C=84?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/{snippet => template}/domain/Snippet.java | 3 +-- .../dto/response/FindAllSnippetByTemplateResponse.java | 2 +- .../template/dto/response/FindTemplateByIdResponse.java | 2 +- .../template/dto/response/FindThumbnailSnippetResponse.java | 2 +- .../{snippet => template}/repository/SnippetRepository.java | 4 ++-- .../main/java/codezap/template/service/TemplateService.java | 4 ++-- .../codezap/thumbnailsnippet/domain/ThumbnailSnippet.java | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-) rename backend/src/main/java/codezap/{snippet => template}/domain/Snippet.java (94%) rename backend/src/main/java/codezap/{snippet => template}/repository/SnippetRepository.java (77%) diff --git a/backend/src/main/java/codezap/snippet/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java similarity index 94% rename from backend/src/main/java/codezap/snippet/domain/Snippet.java rename to backend/src/main/java/codezap/template/domain/Snippet.java index f928f07e4..88dcbb60b 100644 --- a/backend/src/main/java/codezap/snippet/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -1,4 +1,4 @@ -package codezap.snippet.domain; +package codezap.template.domain; import java.util.Arrays; import java.util.stream.Collectors; @@ -13,7 +13,6 @@ import jakarta.persistence.ManyToOne; import codezap.global.auditing.BaseTimeEntity; -import codezap.template.domain.Template; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/backend/src/main/java/codezap/template/dto/response/FindAllSnippetByTemplateResponse.java b/backend/src/main/java/codezap/template/dto/response/FindAllSnippetByTemplateResponse.java index fe82524b5..49c18132d 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindAllSnippetByTemplateResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindAllSnippetByTemplateResponse.java @@ -1,6 +1,6 @@ package codezap.template.dto.response; -import codezap.snippet.domain.Snippet; +import codezap.template.domain.Snippet; public record FindAllSnippetByTemplateResponse( Long id, diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java index 1dbf2f190..9632ad1fc 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java @@ -3,7 +3,7 @@ import java.time.LocalDateTime; import java.util.List; -import codezap.snippet.domain.Snippet; +import codezap.template.domain.Snippet; import codezap.template.domain.Template; public record FindTemplateByIdResponse( diff --git a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java index 45ab86cdf..3fce6ba55 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java @@ -1,6 +1,6 @@ package codezap.template.dto.response; -import codezap.snippet.domain.Snippet; +import codezap.template.domain.Snippet; public record FindThumbnailSnippetResponse( String filename, diff --git a/backend/src/main/java/codezap/snippet/repository/SnippetRepository.java b/backend/src/main/java/codezap/template/repository/SnippetRepository.java similarity index 77% rename from backend/src/main/java/codezap/snippet/repository/SnippetRepository.java rename to backend/src/main/java/codezap/template/repository/SnippetRepository.java index ec4dba6da..8502f7aaa 100644 --- a/backend/src/main/java/codezap/snippet/repository/SnippetRepository.java +++ b/backend/src/main/java/codezap/template/repository/SnippetRepository.java @@ -1,10 +1,10 @@ -package codezap.snippet.repository; +package codezap.template.repository; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; -import codezap.snippet.domain.Snippet; +import codezap.template.domain.Snippet; import codezap.template.domain.Template; public interface SnippetRepository extends JpaRepository { diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index 504bc2ce1..3e217920b 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -5,8 +5,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import codezap.snippet.domain.Snippet; -import codezap.snippet.repository.SnippetRepository; +import codezap.template.domain.Snippet; +import codezap.template.repository.SnippetRepository; import codezap.template.domain.Template; import codezap.template.dto.request.CreateSnippetRequest; import codezap.template.dto.request.CreateTemplateRequest; diff --git a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java index 36c6c27a6..26c58f896 100644 --- a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java @@ -8,7 +8,7 @@ import jakarta.persistence.OneToOne; import codezap.global.auditing.BaseTimeEntity; -import codezap.snippet.domain.Snippet; +import codezap.template.domain.Snippet; import codezap.template.domain.Template; import lombok.AllArgsConstructor; import lombok.Getter; From 3ed0c06768614bc38ab0e6b851af545a4b09aaeb Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 19 Jul 2024 16:55:33 +0900 Subject: [PATCH 13/36] =?UTF-8?q?feat(codezap):=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20DTO=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../exception/GlobalExceptionHandler.java | 10 +++ .../controller/TemplateController.java | 4 +- .../dto/request/CreateSnippetRequest.java | 7 ++ .../dto/request/CreateTemplateRequest.java | 8 +++ .../template/TemplateIntegrationTest.java | 70 +++++++++++++++++++ 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/codezap/template/TemplateIntegrationTest.java diff --git a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java index 01c0ec200..3e8169de1 100644 --- a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java @@ -3,6 +3,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ProblemDetail; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -16,6 +18,14 @@ public ResponseEntity handleCodeZapException(CodeZapException cod codeZapException.getMessage())); } + @ExceptionHandler + public ResponseEntity handleCodeZapException(MethodArgumentNotValidException exception) { + BindingResult bindingResult = exception.getBindingResult(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, + bindingResult.getFieldError().getDefaultMessage())); + } + @ExceptionHandler public ResponseEntity handleException(Exception exception) { return ResponseEntity.internalServerError() diff --git a/backend/src/main/java/codezap/template/controller/TemplateController.java b/backend/src/main/java/codezap/template/controller/TemplateController.java index 7da442df2..d3fe7abd6 100644 --- a/backend/src/main/java/codezap/template/controller/TemplateController.java +++ b/backend/src/main/java/codezap/template/controller/TemplateController.java @@ -2,6 +2,8 @@ import java.net.URI; +import jakarta.validation.Valid; + import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -26,7 +28,7 @@ public TemplateController(TemplateService templateService) { } @PostMapping("") - public ResponseEntity create(@RequestBody CreateTemplateRequest createTemplateRequest) { + public ResponseEntity create(@Valid @RequestBody CreateTemplateRequest createTemplateRequest) { return ResponseEntity.created(URI.create("/templates" + templateService.create(createTemplateRequest))).build(); } diff --git a/backend/src/main/java/codezap/template/dto/request/CreateSnippetRequest.java b/backend/src/main/java/codezap/template/dto/request/CreateSnippetRequest.java index abf39be27..815d5018f 100644 --- a/backend/src/main/java/codezap/template/dto/request/CreateSnippetRequest.java +++ b/backend/src/main/java/codezap/template/dto/request/CreateSnippetRequest.java @@ -1,8 +1,15 @@ package codezap.template.dto.request; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + public record CreateSnippetRequest( + @NotNull(message = "파일 이름이 null 입니다.") + @Size(max = 255, message = "파일 이름은 최대 255자까지 입력 가능합니다.") String filename, + @NotNull(message = "파일 내용이 null 입니다.") String content, + @NotNull(message = "스니펫 순서가 null 입니다.") int ordinal ) { } diff --git a/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java b/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java index 4b38544f3..5f28f35e8 100644 --- a/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java +++ b/backend/src/main/java/codezap/template/dto/request/CreateTemplateRequest.java @@ -2,8 +2,16 @@ import java.util.List; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + public record CreateTemplateRequest( + @NotNull(message = "템플릿 이름이 null 입니다.") + @Size(max = 255, message = "템플릿 이름은 최대 255자까지 입력 가능합니다.") String title, + @NotNull(message = "스니펫 리스트가 null 입니다.") + @Valid List snippets ) { } diff --git a/backend/src/test/java/codezap/template/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/TemplateIntegrationTest.java new file mode 100644 index 000000000..3be9253e5 --- /dev/null +++ b/backend/src/test/java/codezap/template/TemplateIntegrationTest.java @@ -0,0 +1,70 @@ +package codezap.template; + +import static org.hamcrest.Matchers.is; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.server.LocalServerPort; + +import codezap.template.dto.request.CreateSnippetRequest; +import codezap.template.dto.request.CreateTemplateRequest; +import io.restassured.RestAssured; +import io.restassured.http.ContentType; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +class TemplateIntegrationTest { + + @LocalServerPort + int port; + + @BeforeEach + void setting() { + RestAssured.port = port; + } + + @Test + @DisplayName("템플릿 생성 성공") + void createTemplateSuccess() { + CreateTemplateRequest templateRequest = new CreateTemplateRequest("a".repeat(255), + List.of(new CreateSnippetRequest("a".repeat(255), "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest) + .when().post("/templates") + .then().log().all() + .statusCode(201); + } + + @Test + @DisplayName("템플릿 생성 실패: 템플릿 이름 길이 초과") + void createTemplateFailWithLongTitle() { + CreateTemplateRequest templateRequest = new CreateTemplateRequest("a".repeat(256), + List.of(new CreateSnippetRequest("a", "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest) + .when().post("/templates") + .then().log().all() + .statusCode(400) + .body("detail", is("템플릿 이름은 최대 255자까지 입력 가능합니다.")); + } + + @Test + @DisplayName("템플릿 생성 실패: 파일 이름 길이 초과") + void createTemplateFailWithLongFileName() { + CreateTemplateRequest templateRequest = new CreateTemplateRequest("title", + List.of(new CreateSnippetRequest("a".repeat(256), "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest) + .when().post("/templates") + .then().log().all() + .statusCode(400) + .body("detail", is("파일 이름은 최대 255자까지 입력 가능합니다.")); + } +} From 83d85ffd12f284a32253e01c84c483ba1eed69b6 Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 19 Jul 2024 16:57:01 +0900 Subject: [PATCH 14/36] =?UTF-8?q?refactor(template):=20ThumbnailSnippet=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9D=84=20Template=20=ED=95=98?= =?UTF-8?q?=EC=9C=84=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../domain/ThumbnailSnippet.java | 4 +--- .../template/dto/response/FindAllTemplatesResponse.java | 2 +- .../dto/response/FindTemplateBySummaryResponse.java | 2 +- .../repository/ThumbnailSnippetRepository.java | 4 ++-- .../main/java/codezap/template/service/TemplateService.java | 6 +++--- 5 files changed, 8 insertions(+), 10 deletions(-) rename backend/src/main/java/codezap/{thumbnailsnippet => template}/domain/ThumbnailSnippet.java (86%) rename backend/src/main/java/codezap/{thumbnailsnippet => template}/repository/ThumbnailSnippetRepository.java (60%) diff --git a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java similarity index 86% rename from backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java rename to backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java index 26c58f896..0f5563cc9 100644 --- a/backend/src/main/java/codezap/thumbnailsnippet/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java @@ -1,4 +1,4 @@ -package codezap.thumbnailsnippet.domain; +package codezap.template.domain; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -8,8 +8,6 @@ import jakarta.persistence.OneToOne; import codezap.global.auditing.BaseTimeEntity; -import codezap.template.domain.Snippet; -import codezap.template.domain.Template; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java index 0b3bd8785..6de418adc 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java @@ -2,7 +2,7 @@ import java.util.List; -import codezap.thumbnailsnippet.domain.ThumbnailSnippet; +import codezap.template.domain.ThumbnailSnippet; public record FindAllTemplatesResponse( List templates diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java index f5c97c544..47b6f1756 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java @@ -2,7 +2,7 @@ import java.time.LocalDateTime; -import codezap.thumbnailsnippet.domain.ThumbnailSnippet; +import codezap.template.domain.ThumbnailSnippet; public record FindTemplateBySummaryResponse( Long id, diff --git a/backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java b/backend/src/main/java/codezap/template/repository/ThumbnailSnippetRepository.java similarity index 60% rename from backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java rename to backend/src/main/java/codezap/template/repository/ThumbnailSnippetRepository.java index c9ca51ec1..50c5a1edf 100644 --- a/backend/src/main/java/codezap/thumbnailsnippet/repository/ThumbnailSnippetRepository.java +++ b/backend/src/main/java/codezap/template/repository/ThumbnailSnippetRepository.java @@ -1,8 +1,8 @@ -package codezap.thumbnailsnippet.repository; +package codezap.template.repository; import org.springframework.data.jpa.repository.JpaRepository; -import codezap.thumbnailsnippet.domain.ThumbnailSnippet; +import codezap.template.domain.ThumbnailSnippet; public interface ThumbnailSnippetRepository extends JpaRepository { } diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index 3e217920b..802cc6a86 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -6,15 +6,15 @@ import org.springframework.transaction.annotation.Transactional; import codezap.template.domain.Snippet; -import codezap.template.repository.SnippetRepository; import codezap.template.domain.Template; +import codezap.template.domain.ThumbnailSnippet; import codezap.template.dto.request.CreateSnippetRequest; import codezap.template.dto.request.CreateTemplateRequest; import codezap.template.dto.response.FindAllTemplatesResponse; import codezap.template.dto.response.FindTemplateByIdResponse; +import codezap.template.repository.SnippetRepository; import codezap.template.repository.TemplateRepository; -import codezap.thumbnailsnippet.domain.ThumbnailSnippet; -import codezap.thumbnailsnippet.repository.ThumbnailSnippetRepository; +import codezap.template.repository.ThumbnailSnippetRepository; @Service public class TemplateService { From 00c558656389cf4212906ad1320643e81e35db9d Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 13:12:49 +0900 Subject: [PATCH 15/36] =?UTF-8?q?chore:=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/build.gradle b/backend/build.gradle index 253dde238..b99c3cc1d 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -21,6 +21,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' compileOnly 'org.projectlombok:lombok:0.11.0' From 55f793e24e9edcebe2c20f6823b54a4b54525dc4 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 13:14:22 +0900 Subject: [PATCH 16/36] =?UTF-8?q?refactor(serialization):=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../DateTimeFormatConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename backend/src/main/java/codezap/global/{serializing => serialization}/DateTimeFormatConfiguration.java (95%) diff --git a/backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java similarity index 95% rename from backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java rename to backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java index 9cc25ca94..259dd432c 100644 --- a/backend/src/main/java/codezap/global/serializing/DateTimeFormatConfiguration.java +++ b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java @@ -1,4 +1,4 @@ -package codezap.global.serializing; +package codezap.global.serialization; import java.time.format.DateTimeFormatter; import java.util.TimeZone; From ed328e742a12cfb5e6a33672b95026cfe48a0231 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 15:05:38 +0900 Subject: [PATCH 17/36] =?UTF-8?q?refactor(template):=20Location=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/template/controller/TemplateController.java | 2 +- .../src/test/java/codezap/template/TemplateIntegrationTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/codezap/template/controller/TemplateController.java b/backend/src/main/java/codezap/template/controller/TemplateController.java index d3fe7abd6..5b3d232fd 100644 --- a/backend/src/main/java/codezap/template/controller/TemplateController.java +++ b/backend/src/main/java/codezap/template/controller/TemplateController.java @@ -29,7 +29,7 @@ public TemplateController(TemplateService templateService) { @PostMapping("") public ResponseEntity create(@Valid @RequestBody CreateTemplateRequest createTemplateRequest) { - return ResponseEntity.created(URI.create("/templates" + templateService.create(createTemplateRequest))).build(); + return ResponseEntity.created(URI.create("/templates/" + templateService.create(createTemplateRequest))).build(); } @GetMapping("") diff --git a/backend/src/test/java/codezap/template/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/TemplateIntegrationTest.java index 3be9253e5..89a7e11e3 100644 --- a/backend/src/test/java/codezap/template/TemplateIntegrationTest.java +++ b/backend/src/test/java/codezap/template/TemplateIntegrationTest.java @@ -37,6 +37,7 @@ void createTemplateSuccess() { .body(templateRequest) .when().post("/templates") .then().log().all() + .header("Location", "/templates/1") .statusCode(201); } From 1d61b330cf10883faa50d094b979188f14749f21 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 15:44:11 +0900 Subject: [PATCH 18/36] =?UTF-8?q?test(integration):=20Template=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../TemplateIntegrationTest.java | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) rename backend/src/test/java/codezap/template/{ => integration}/TemplateIntegrationTest.java (55%) diff --git a/backend/src/test/java/codezap/template/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java similarity index 55% rename from backend/src/test/java/codezap/template/TemplateIntegrationTest.java rename to backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java index 89a7e11e3..524883c5b 100644 --- a/backend/src/test/java/codezap/template/TemplateIntegrationTest.java +++ b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java @@ -1,4 +1,4 @@ -package codezap.template; +package codezap.template.integration; import static org.hamcrest.Matchers.is; @@ -10,6 +10,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import codezap.template.dto.request.CreateSnippetRequest; import codezap.template.dto.request.CreateTemplateRequest; @@ -17,6 +19,8 @@ import io.restassured.http.ContentType; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@Sql(value = "/clear.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(value = "/clear.sql", executionPhase = ExecutionPhase.AFTER_TEST_CLASS) class TemplateIntegrationTest { @LocalServerPort @@ -68,4 +72,52 @@ void createTemplateFailWithLongFileName() { .statusCode(400) .body("detail", is("파일 이름은 최대 255자까지 입력 가능합니다.")); } + @Test + @DisplayName("템플릿 전체 조회 성공") + void findAllTemplatesSuccess() { + //given + CreateTemplateRequest templateRequest1 = new CreateTemplateRequest("title1", + List.of(new CreateSnippetRequest("filename", "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest1) + .when().post("/templates") + .then().log().all(); + + CreateTemplateRequest templateRequest2 = new CreateTemplateRequest("title2", + List.of(new CreateSnippetRequest("filename", "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest2) + .when().post("/templates") + .then().log().all(); + + //when + RestAssured.given().log().all() + .get("/templates") + .then().log().all() + .statusCode(200) + .body("templates.size()", is(2)); + } + + @Test + @DisplayName("템플릿 상세 조회 성공") + void findOneTemplateSuccess() { + //given + CreateTemplateRequest templateRequest = new CreateTemplateRequest("title", + List.of(new CreateSnippetRequest("filename", "content", 1))); + RestAssured.given().log().all() + .contentType(ContentType.JSON) + .body(templateRequest) + .when().post("/templates") + .then().log().all(); + + //when + RestAssured.given().log().all() + .get("/templates/1") + .then().log().all() + .statusCode(200) + .body("title", is(templateRequest.title()), + "snippets.size()", is(1)); + } } From 1afee8153c8cc296fe6423dfab7e09c6c0ac53b3 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 15:49:55 +0900 Subject: [PATCH 19/36] =?UTF-8?q?refactor(template):=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/src/main/java/codezap/template/domain/Snippet.java | 2 +- .../template/dto/response/FindThumbnailSnippetResponse.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index 88dcbb60b..b6886492a 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -43,7 +43,7 @@ public class Snippet extends BaseTimeEntity { @Column(nullable = false) private Integer ordinal; - public String getSummaryContent() { + public String getThumbnailContent() { return Arrays.stream(content.split(CODE_LINE_BREAK)) .limit(THUMBNAIL_SNIPPET_SIZE) .collect(Collectors.joining(CODE_LINE_BREAK)); diff --git a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java index 3fce6ba55..33dc998fc 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java @@ -9,7 +9,7 @@ public record FindThumbnailSnippetResponse( public static FindThumbnailSnippetResponse from(Snippet snippet) { return new FindThumbnailSnippetResponse( snippet.getFilename(), - snippet.getSummaryContent() + snippet.getThumbnailContent() ); } } From 368d8ede9daca3179517b883630fbbbf77852f14 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 15:50:44 +0900 Subject: [PATCH 20/36] =?UTF-8?q?refactor(domain):=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/src/main/java/codezap/template/domain/Snippet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index b6886492a..70fdb1738 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -24,7 +24,7 @@ public class Snippet extends BaseTimeEntity { private static final String CODE_LINE_BREAK = "\n"; - private static final int THUMBNAIL_SNIPPET_SIZE = 10; + private static final int THUMBNAIL_SNIPPET_LINE_HEIGHT = 10; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -45,7 +45,7 @@ public class Snippet extends BaseTimeEntity { public String getThumbnailContent() { return Arrays.stream(content.split(CODE_LINE_BREAK)) - .limit(THUMBNAIL_SNIPPET_SIZE) + .limit(THUMBNAIL_SNIPPET_LINE_HEIGHT) .collect(Collectors.joining(CODE_LINE_BREAK)); } } From 7e64c2fffaf406a1f0496f1c365f2ebd44c80950 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 15:55:00 +0900 Subject: [PATCH 21/36] =?UTF-8?q?refactor(response):=20dto=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../codezap/template/dto/response/FindTemplateByIdResponse.java | 2 +- .../template/dto/response/FindTemplateBySummaryResponse.java | 2 +- .../template/dto/response/FindThumbnailSnippetResponse.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java index 9632ad1fc..a61d343ca 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java @@ -10,7 +10,7 @@ public record FindTemplateByIdResponse( Long id, String title, List snippets, - LocalDateTime modified_at + LocalDateTime modifiedAt ) { public static FindTemplateByIdResponse from(Template template, List snippets) { return new FindTemplateByIdResponse( diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java index 47b6f1756..82cb51e28 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java @@ -8,7 +8,7 @@ public record FindTemplateBySummaryResponse( Long id, String title, FindThumbnailSnippetResponse thumbnailSnippet, - LocalDateTime modified_at + LocalDateTime modifiedAt ) { public static FindTemplateBySummaryResponse from(ThumbnailSnippet thumbnailSnippet) { return new FindTemplateBySummaryResponse( diff --git a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java index 33dc998fc..d80cdbeb3 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindThumbnailSnippetResponse.java @@ -4,7 +4,7 @@ public record FindThumbnailSnippetResponse( String filename, - String content_summary + String thumbnailContent ) { public static FindThumbnailSnippetResponse from(Snippet snippet) { return new FindThumbnailSnippetResponse( From 473dbea6b4213cb12832994cea375532078797a0 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 16:57:04 +0900 Subject: [PATCH 22/36] =?UTF-8?q?refactor(response):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EB=A7=A4=EC=A7=81=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/template/service/TemplateServiceTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/src/test/java/codezap/template/service/TemplateServiceTest.java b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java index 3c8b91a4d..a021664fd 100644 --- a/backend/src/test/java/codezap/template/service/TemplateServiceTest.java +++ b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java @@ -68,15 +68,16 @@ void findAllTemplatesSuccess() { @DisplayName("템플릿 단건 조회 성공") void findOneTemplateSuccess() { //given - Long createdId = templateService.create(makeTemplate("title")); + CreateTemplateRequest createdTemplate = makeTemplate("title"); + Long createdId = templateService.create(createdTemplate); //when FindTemplateByIdResponse foundTemplate = templateService.findById(createdId); //then assertAll( - () -> assertThat(foundTemplate.title()).isEqualTo("title"), - () -> assertThat(foundTemplate.snippets().size()).isEqualTo(2) + () -> assertThat(foundTemplate.title()).isEqualTo(createdTemplate.title()), + () -> assertThat(foundTemplate.snippets().size()).isEqualTo(createdTemplate.snippets().size()) ); } From 9f61bb2db76a1ebd664caa820a83564aacdd9dc2 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:03:02 +0900 Subject: [PATCH 23/36] =?UTF-8?q?refactor(exception):=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=A4=84=EB=B0=94?= =?UTF-8?q?=EA=BF=88=20=EB=B0=8F=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../exception/GlobalExceptionHandler.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java index 3e8169de1..d0e79af4a 100644 --- a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java @@ -14,21 +14,28 @@ public class GlobalExceptionHandler { @ExceptionHandler public ResponseEntity handleCodeZapException(CodeZapException codeZapException) { return ResponseEntity.status(codeZapException.getHttpStatusCode()) - .body(ProblemDetail.forStatusAndDetail(codeZapException.getHttpStatusCode(), - codeZapException.getMessage())); + .body(ProblemDetail.forStatusAndDetail( + codeZapException.getHttpStatusCode(), + codeZapException.getMessage()) + ); } @ExceptionHandler public ResponseEntity handleCodeZapException(MethodArgumentNotValidException exception) { BindingResult bindingResult = exception.getBindingResult(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, - bindingResult.getFieldError().getDefaultMessage())); + return ResponseEntity.badRequest() + .body(ProblemDetail.forStatusAndDetail( + HttpStatus.BAD_REQUEST, + bindingResult.getFieldError().getDefaultMessage()) + ); } @ExceptionHandler public ResponseEntity handleException(Exception exception) { return ResponseEntity.internalServerError() - .body(ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, exception.getMessage())); + .body(ProblemDetail.forStatusAndDetail( + HttpStatus.INTERNAL_SERVER_ERROR, + exception.getMessage()) + ); } } From dede2162ebde0aa36b52435403f31077fbe38ef7 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:04:31 +0900 Subject: [PATCH 24/36] =?UTF-8?q?refactor(controller):=20=EB=B9=88=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/template/controller/TemplateController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/codezap/template/controller/TemplateController.java b/backend/src/main/java/codezap/template/controller/TemplateController.java index 5b3d232fd..4016b5f59 100644 --- a/backend/src/main/java/codezap/template/controller/TemplateController.java +++ b/backend/src/main/java/codezap/template/controller/TemplateController.java @@ -27,12 +27,12 @@ public TemplateController(TemplateService templateService) { this.templateService = templateService; } - @PostMapping("") + @PostMapping public ResponseEntity create(@Valid @RequestBody CreateTemplateRequest createTemplateRequest) { return ResponseEntity.created(URI.create("/templates/" + templateService.create(createTemplateRequest))).build(); } - @GetMapping("") + @GetMapping public ResponseEntity getTemplates() { return ResponseEntity.ok(templateService.findAll()); } From 390d0d5d5d4cf3348fad0709e70a37f645b8acc1 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:18:22 +0900 Subject: [PATCH 25/36] =?UTF-8?q?refactor(domain):=20not=20null=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=A9=EB=B2=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../src/main/java/codezap/template/domain/Snippet.java | 4 ++-- .../java/codezap/template/domain/ThumbnailSnippet.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index 70fdb1738..435850763 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -30,8 +30,8 @@ public class Snippet extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "template_id", nullable = false) + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "template_id") private Template template; @Column(nullable = false) diff --git a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java index 0f5563cc9..b834eb484 100644 --- a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java @@ -22,11 +22,11 @@ public class ThumbnailSnippet extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToOne - @JoinColumn(name = "template_id", nullable = false) + @OneToOne(optional = false) + @JoinColumn(name = "template_id") private Template template; - @OneToOne - @JoinColumn(name = "snippet_id", nullable = false) + @OneToOne(optional = false) + @JoinColumn(name = "snippet_id") private Snippet snippet; } From 7466794864b0c02351c26ea5d704a3161aea39c8 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:25:34 +0900 Subject: [PATCH 26/36] =?UTF-8?q?refactor(domain):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20JoinColumn=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- backend/src/main/java/codezap/template/domain/Snippet.java | 1 - .../src/main/java/codezap/template/domain/ThumbnailSnippet.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index 435850763..a30a253e2 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -31,7 +31,6 @@ public class Snippet extends BaseTimeEntity { private Long id; @ManyToOne(fetch = FetchType.LAZY, optional = false) - @JoinColumn(name = "template_id") private Template template; @Column(nullable = false) diff --git a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java index b834eb484..cb957f5e8 100644 --- a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java @@ -23,10 +23,8 @@ public class ThumbnailSnippet extends BaseTimeEntity { private Long id; @OneToOne(optional = false) - @JoinColumn(name = "template_id") private Template template; @OneToOne(optional = false) - @JoinColumn(name = "snippet_id") private Snippet snippet; } From ce606352c21c73be42995a0465b14462bbaa8f40 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:49:57 +0900 Subject: [PATCH 27/36] =?UTF-8?q?refactor(response):=20DTO=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20=EC=A7=81=EA=B4=80=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../response/FindAllTemplatesResponse.java | 23 ++++++++++++++++--- .../FindTemplateBySummaryResponse.java | 21 ----------------- 2 files changed, 20 insertions(+), 24 deletions(-) delete mode 100644 backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java diff --git a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java index 6de418adc..5bfa7573f 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindAllTemplatesResponse.java @@ -1,16 +1,33 @@ package codezap.template.dto.response; +import java.time.LocalDateTime; import java.util.List; import codezap.template.domain.ThumbnailSnippet; public record FindAllTemplatesResponse( - List templates + List templates ) { public static FindAllTemplatesResponse from(List thumbnailSnippets) { - List templatesBySummaryResponse = thumbnailSnippets.stream() - .map(FindTemplateBySummaryResponse::from) + List templatesBySummaryResponse = thumbnailSnippets.stream() + .map(ItemResponse::from) .toList(); return new FindAllTemplatesResponse(templatesBySummaryResponse); } + + public record ItemResponse( + Long id, + String title, + FindThumbnailSnippetResponse thumbnailSnippet, + LocalDateTime modifiedAt + ) { + public static ItemResponse from(ThumbnailSnippet thumbnailSnippet) { + return new ItemResponse( + thumbnailSnippet.getTemplate().getId(), + thumbnailSnippet.getTemplate().getTitle(), + FindThumbnailSnippetResponse.from(thumbnailSnippet.getSnippet()), + thumbnailSnippet.getModifiedAt() + ); + } + } } diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java deleted file mode 100644 index 82cb51e28..000000000 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateBySummaryResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package codezap.template.dto.response; - -import java.time.LocalDateTime; - -import codezap.template.domain.ThumbnailSnippet; - -public record FindTemplateBySummaryResponse( - Long id, - String title, - FindThumbnailSnippetResponse thumbnailSnippet, - LocalDateTime modifiedAt -) { - public static FindTemplateBySummaryResponse from(ThumbnailSnippet thumbnailSnippet) { - return new FindTemplateBySummaryResponse( - thumbnailSnippet.getTemplate().getId(), - thumbnailSnippet.getTemplate().getTitle(), - FindThumbnailSnippetResponse.from(thumbnailSnippet.getSnippet()), - thumbnailSnippet.getModifiedAt() - ); - } -} From 0a4f42f6c426f21e594585fab187161d93994e18 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:52:04 +0900 Subject: [PATCH 28/36] =?UTF-8?q?refactor(response):=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=EB=A5=BC=202=EA=B0=9C=20=EC=9D=B4=EC=83=81?= =?UTF-8?q?=20=EB=B0=9B=EB=8A=94=20=EC=A0=95=ED=8C=A9=EB=A9=94=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20of=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../codezap/template/dto/response/FindTemplateByIdResponse.java | 2 +- .../src/main/java/codezap/template/service/TemplateService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java index a61d343ca..0d01a2284 100644 --- a/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java +++ b/backend/src/main/java/codezap/template/dto/response/FindTemplateByIdResponse.java @@ -12,7 +12,7 @@ public record FindTemplateByIdResponse( List snippets, LocalDateTime modifiedAt ) { - public static FindTemplateByIdResponse from(Template template, List snippets) { + public static FindTemplateByIdResponse of(Template template, List snippets) { return new FindTemplateByIdResponse( template.getId(), template.getTitle(), diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index 802cc6a86..b4ad29f20 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -57,6 +57,6 @@ public FindAllTemplatesResponse findAll() { public FindTemplateByIdResponse findById(Long id) { Template template = templateRepository.getById(id); List snippets = snippetRepository.findAllByTemplate(template); - return FindTemplateByIdResponse.from(template, snippets); + return FindTemplateByIdResponse.of(template, snippets); } } From 43e2bb35cb3e60e2fc3b1e38255eee715dbceaf8 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 17:53:15 +0900 Subject: [PATCH 29/36] =?UTF-8?q?refactor(exception):=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../java/codezap/global/exception/GlobalExceptionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java index d0e79af4a..f7f268339 100644 --- a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java @@ -35,7 +35,7 @@ public ResponseEntity handleException(Exception exception) { return ResponseEntity.internalServerError() .body(ProblemDetail.forStatusAndDetail( HttpStatus.INTERNAL_SERVER_ERROR, - exception.getMessage()) + "서버에서 예상치 못한 오류가 발생하였습니다.") ); } } From 242708f6bdb8fe511cdff9b6e4390f8acc74d1f4 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 18:11:24 +0900 Subject: [PATCH 30/36] =?UTF-8?q?refactor(integration):=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=82=AC=EC=9D=B4=EC=97=90=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../codezap/template/integration/TemplateIntegrationTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java index 524883c5b..65e4c98fb 100644 --- a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java +++ b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java @@ -72,6 +72,7 @@ void createTemplateFailWithLongFileName() { .statusCode(400) .body("detail", is("파일 이름은 최대 255자까지 입력 가능합니다.")); } + @Test @DisplayName("템플릿 전체 조회 성공") void findAllTemplatesSuccess() { From aefb90754dfa4adb9cc8697219e50407a209c9b9 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 18:13:10 +0900 Subject: [PATCH 31/36] =?UTF-8?q?refactor(template):=20id=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=9B=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../src/main/java/codezap/template/domain/Snippet.java | 10 +++++++--- .../main/java/codezap/template/domain/Template.java | 6 ++++-- .../java/codezap/template/domain/ThumbnailSnippet.java | 8 +++++--- .../java/codezap/template/service/TemplateService.java | 6 +++--- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/codezap/template/domain/Snippet.java b/backend/src/main/java/codezap/template/domain/Snippet.java index a30a253e2..88f69e7b3 100644 --- a/backend/src/main/java/codezap/template/domain/Snippet.java +++ b/backend/src/main/java/codezap/template/domain/Snippet.java @@ -9,17 +9,14 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import codezap.global.auditing.BaseTimeEntity; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter -@AllArgsConstructor @NoArgsConstructor public class Snippet extends BaseTimeEntity { @@ -42,6 +39,13 @@ public class Snippet extends BaseTimeEntity { @Column(nullable = false) private Integer ordinal; + public Snippet(Template template, String filename, String content, Integer ordinal) { + this.template = template; + this.filename = filename; + this.content = content; + this.ordinal = ordinal; + } + public String getThumbnailContent() { return Arrays.stream(content.split(CODE_LINE_BREAK)) .limit(THUMBNAIL_SNIPPET_LINE_HEIGHT) diff --git a/backend/src/main/java/codezap/template/domain/Template.java b/backend/src/main/java/codezap/template/domain/Template.java index bbaafc3b4..1c5f26f00 100644 --- a/backend/src/main/java/codezap/template/domain/Template.java +++ b/backend/src/main/java/codezap/template/domain/Template.java @@ -7,13 +7,11 @@ import jakarta.persistence.Id; import codezap.global.auditing.BaseTimeEntity; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter -@AllArgsConstructor @NoArgsConstructor public class Template extends BaseTimeEntity { @@ -23,4 +21,8 @@ public class Template extends BaseTimeEntity { @Column(nullable = false) private String title; + + public Template(String title) { + this.title = title; + } } diff --git a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java index cb957f5e8..99007b3cf 100644 --- a/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java +++ b/backend/src/main/java/codezap/template/domain/ThumbnailSnippet.java @@ -4,18 +4,15 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import codezap.global.auditing.BaseTimeEntity; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor -@AllArgsConstructor public class ThumbnailSnippet extends BaseTimeEntity { @Id @@ -27,4 +24,9 @@ public class ThumbnailSnippet extends BaseTimeEntity { @OneToOne(optional = false) private Snippet snippet; + + public ThumbnailSnippet(Template template, Snippet snippet) { + this.template = template; + this.snippet = snippet; + } } diff --git a/backend/src/main/java/codezap/template/service/TemplateService.java b/backend/src/main/java/codezap/template/service/TemplateService.java index b4ad29f20..e2e4e953f 100644 --- a/backend/src/main/java/codezap/template/service/TemplateService.java +++ b/backend/src/main/java/codezap/template/service/TemplateService.java @@ -34,19 +34,19 @@ public TemplateService(ThumbnailSnippetRepository thumbnailSnippetRepository, @Transactional public Long create(CreateTemplateRequest createTemplateRequest) { Template template = templateRepository.save( - new Template(null, createTemplateRequest.title())); + new Template(createTemplateRequest.title())); List snippets = createTemplateRequest.snippets().stream() .map(createSnippetRequest -> createSnippet(createSnippetRequest, template)) .toList(); - thumbnailSnippetRepository.save(new ThumbnailSnippet(null, template, snippets.get(0))); + thumbnailSnippetRepository.save(new ThumbnailSnippet(template, snippets.get(0))); return template.getId(); } private Snippet createSnippet(CreateSnippetRequest createSnippetRequest, Template template) { return snippetRepository.save( - new Snippet(null, template, createSnippetRequest.filename(), createSnippetRequest.content(), + new Snippet(template, createSnippetRequest.filename(), createSnippetRequest.content(), createSnippetRequest.ordinal())); } From e939f42419fb7917fedb39dc4554f37c94482fb4 Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 18:44:36 +0900 Subject: [PATCH 32/36] =?UTF-8?q?test(service):=20repository=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../template/service/TemplateServiceTest.java | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/backend/src/test/java/codezap/template/service/TemplateServiceTest.java b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java index a021664fd..b78466ab3 100644 --- a/backend/src/test/java/codezap/template/service/TemplateServiceTest.java +++ b/backend/src/test/java/codezap/template/service/TemplateServiceTest.java @@ -15,10 +15,16 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; +import codezap.template.domain.Snippet; +import codezap.template.domain.Template; +import codezap.template.domain.ThumbnailSnippet; import codezap.template.dto.request.CreateSnippetRequest; import codezap.template.dto.request.CreateTemplateRequest; import codezap.template.dto.response.FindAllTemplatesResponse; import codezap.template.dto.response.FindTemplateByIdResponse; +import codezap.template.repository.SnippetRepository; +import codezap.template.repository.TemplateRepository; +import codezap.template.repository.ThumbnailSnippetRepository; import io.restassured.RestAssured; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @@ -31,6 +37,12 @@ class TemplateServiceTest { @LocalServerPort int port; + @Autowired + private TemplateRepository templateRepository; + @Autowired + private SnippetRepository snippetRepository; + @Autowired + private ThumbnailSnippetRepository thumbnailSnippetRepository; @BeforeEach void setting() { @@ -41,21 +53,21 @@ void setting() { @DisplayName("템플릿 생성 성공") void createTemplateSuccess() { //given - CreateTemplateRequest createTemplateRequest = makeTemplate("title"); + CreateTemplateRequest createTemplateRequest = makeTemplateRequest("title"); //when - Long createdId = templateService.create(createTemplateRequest); + templateService.create(createTemplateRequest); //then - assertThat(createdId).isEqualTo(1L); + assertThat(templateRepository.findAll().size()).isEqualTo(1); } @Test @DisplayName("템플릿 전체 조회 성공") void findAllTemplatesSuccess() { //given - templateService.create(makeTemplate("title1")); - templateService.create(makeTemplate("title2")); + saveTemplate(makeTemplateRequest("title1")); + saveTemplate(makeTemplateRequest("title2")); //when FindAllTemplatesResponse allTemplates = templateService.findAll(); @@ -68,11 +80,11 @@ void findAllTemplatesSuccess() { @DisplayName("템플릿 단건 조회 성공") void findOneTemplateSuccess() { //given - CreateTemplateRequest createdTemplate = makeTemplate("title"); - Long createdId = templateService.create(createdTemplate); + CreateTemplateRequest createdTemplate = makeTemplateRequest("title"); + saveTemplate(createdTemplate); //when - FindTemplateByIdResponse foundTemplate = templateService.findById(createdId); + FindTemplateByIdResponse foundTemplate = templateService.findById(1L); //then assertAll( @@ -81,7 +93,7 @@ void findOneTemplateSuccess() { ); } - private CreateTemplateRequest makeTemplate(String title) { + private CreateTemplateRequest makeTemplateRequest(String title) { return new CreateTemplateRequest( title, List.of( @@ -90,4 +102,11 @@ private CreateTemplateRequest makeTemplate(String title) { ) ); } + + private void saveTemplate(CreateTemplateRequest createTemplateRequest) { + Template savedTemplate = templateRepository.save(new Template(createTemplateRequest.title())); + Snippet savedFirstSnippet = snippetRepository.save(new Snippet(savedTemplate, "filename1", "content1", 1)); + snippetRepository.save(new Snippet(savedTemplate, "filename2", "content2", 2)); + thumbnailSnippetRepository.save(new ThumbnailSnippet(savedTemplate, savedFirstSnippet)); + } } From 56a8a77441ba86252d249ae1ea8144639b745ecc Mon Sep 17 00:00:00 2001 From: zangsu Date: Mon, 22 Jul 2024 18:53:23 +0900 Subject: [PATCH 33/36] =?UTF-8?q?refactor(integration):=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20=EA=B8=B8=EC=9D=B4=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../integration/TemplateIntegrationTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java index 65e4c98fb..91b0a4019 100644 --- a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java +++ b/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java @@ -23,6 +23,7 @@ @Sql(value = "/clear.sql", executionPhase = ExecutionPhase.AFTER_TEST_CLASS) class TemplateIntegrationTest { + private static final int MAX_LENGTH = 255; @LocalServerPort int port; @@ -34,8 +35,9 @@ void setting() { @Test @DisplayName("템플릿 생성 성공") void createTemplateSuccess() { - CreateTemplateRequest templateRequest = new CreateTemplateRequest("a".repeat(255), - List.of(new CreateSnippetRequest("a".repeat(255), "content", 1))); + String maxTitle = "a".repeat(MAX_LENGTH); + CreateTemplateRequest templateRequest = new CreateTemplateRequest(maxTitle, + List.of(new CreateSnippetRequest("a".repeat(MAX_LENGTH), "content", 1))); RestAssured.given().log().all() .contentType(ContentType.JSON) .body(templateRequest) @@ -48,7 +50,8 @@ void createTemplateSuccess() { @Test @DisplayName("템플릿 생성 실패: 템플릿 이름 길이 초과") void createTemplateFailWithLongTitle() { - CreateTemplateRequest templateRequest = new CreateTemplateRequest("a".repeat(256), + String exceededTitle = "a".repeat(MAX_LENGTH + 1); + CreateTemplateRequest templateRequest = new CreateTemplateRequest(exceededTitle, List.of(new CreateSnippetRequest("a", "content", 1))); RestAssured.given().log().all() .contentType(ContentType.JSON) @@ -62,8 +65,9 @@ void createTemplateFailWithLongTitle() { @Test @DisplayName("템플릿 생성 실패: 파일 이름 길이 초과") void createTemplateFailWithLongFileName() { + String exceededTitle = "a".repeat(MAX_LENGTH + 1); CreateTemplateRequest templateRequest = new CreateTemplateRequest("title", - List.of(new CreateSnippetRequest("a".repeat(256), "content", 1))); + List.of(new CreateSnippetRequest(exceededTitle, "content", 1))); RestAssured.given().log().all() .contentType(ContentType.JSON) .body(templateRequest) From e5965d5e5ecccf46de5db081d8c4820d84fb0899 Mon Sep 17 00:00:00 2001 From: zangsu Date: Tue, 23 Jul 2024 14:18:56 +0900 Subject: [PATCH 34/36] =?UTF-8?q?refactor(serialization):=20timezone=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../global/serialization/DateTimeFormatConfiguration.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java index 259dd432c..2ea85414c 100644 --- a/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java +++ b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java @@ -15,10 +15,7 @@ public class DateTimeFormatConfiguration { @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { - return jacksonObjectMapperBuilder -> { - jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("UTC")); - jacksonObjectMapperBuilder.serializers( - new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); - }; + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializers( + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))); } } From 89cafb0d9ce241626422560f8ac5a6940d8f5d04 Mon Sep 17 00:00:00 2001 From: zangsu Date: Tue, 23 Jul 2024 14:44:10 +0900 Subject: [PATCH 35/36] =?UTF-8?q?refactor(controller):=20IntegrationTest?= =?UTF-8?q?=EB=A5=BC=20ControllerTest=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../TemplateControllerTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename backend/src/test/java/codezap/template/{integration/TemplateIntegrationTest.java => controller/TemplateControllerTest.java} (98%) diff --git a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java b/backend/src/test/java/codezap/template/controller/TemplateControllerTest.java similarity index 98% rename from backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java rename to backend/src/test/java/codezap/template/controller/TemplateControllerTest.java index 91b0a4019..7b19c8e4c 100644 --- a/backend/src/test/java/codezap/template/integration/TemplateIntegrationTest.java +++ b/backend/src/test/java/codezap/template/controller/TemplateControllerTest.java @@ -1,4 +1,4 @@ -package codezap.template.integration; +package codezap.template.controller; import static org.hamcrest.Matchers.is; @@ -21,7 +21,7 @@ @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @Sql(value = "/clear.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) @Sql(value = "/clear.sql", executionPhase = ExecutionPhase.AFTER_TEST_CLASS) -class TemplateIntegrationTest { +class TemplateControllerTest { private static final int MAX_LENGTH = 255; @LocalServerPort From 8b3de774ea5fdeaf93b02b11885b30dbb790993b Mon Sep 17 00:00:00 2001 From: zangsu Date: Tue, 23 Jul 2024 15:08:08 +0900 Subject: [PATCH 36/36] =?UTF-8?q?refactor(exception):=20MethodArgumentNotV?= =?UTF-8?q?alid=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20NPE=20=EA=B2=BD=EA=B3=A0=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: hoeseong123 --- .../global/exception/GlobalExceptionHandler.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java index f7f268339..f6d20813c 100644 --- a/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/codezap/global/exception/GlobalExceptionHandler.java @@ -1,5 +1,8 @@ package codezap.global.exception; +import java.util.stream.Collectors; + +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpStatus; import org.springframework.http.ProblemDetail; import org.springframework.http.ResponseEntity; @@ -21,12 +24,17 @@ public ResponseEntity handleCodeZapException(CodeZapException cod } @ExceptionHandler - public ResponseEntity handleCodeZapException(MethodArgumentNotValidException exception) { + public ResponseEntity handleMethodArgumentNotValidException( + MethodArgumentNotValidException exception + ) { BindingResult bindingResult = exception.getBindingResult(); return ResponseEntity.badRequest() .body(ProblemDetail.forStatusAndDetail( HttpStatus.BAD_REQUEST, - bindingResult.getFieldError().getDefaultMessage()) + bindingResult.getFieldErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.joining()) + ) ); }