diff --git a/backend/src/main/java/codezap/global/cors/CorsProperties.java b/backend/src/main/java/codezap/global/cors/CorsProperties.java index f1fdb4e74..339428dc4 100644 --- a/backend/src/main/java/codezap/global/cors/CorsProperties.java +++ b/backend/src/main/java/codezap/global/cors/CorsProperties.java @@ -4,8 +4,12 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.bind.DefaultValue; +import lombok.Getter; + +@Getter @ConfigurationProperties(prefix = "cors") public class CorsProperties { + private final String[] allowedOrigins; private final String[] allowedOriginsPatterns; @@ -16,12 +20,4 @@ public CorsProperties( this.allowedOrigins = allowedOrigins; this.allowedOriginsPatterns = allowedOriginsPatterns; } - - public String[] getAllowedOrigins() { - return allowedOrigins; - } - - public String[] getAllowedOriginsPatterns() { - return allowedOriginsPatterns; - } } diff --git a/backend/src/main/java/codezap/global/exception/CodeZapException.java b/backend/src/main/java/codezap/global/exception/CodeZapException.java index 71af97c34..bfbf3ed1a 100644 --- a/backend/src/main/java/codezap/global/exception/CodeZapException.java +++ b/backend/src/main/java/codezap/global/exception/CodeZapException.java @@ -6,6 +6,7 @@ @Getter public class CodeZapException extends RuntimeException { + private final HttpStatusCode httpStatusCode; public CodeZapException(HttpStatusCode httpStatusCode, String message) { diff --git a/backend/src/main/java/codezap/global/rds/DataSourceRouter.java b/backend/src/main/java/codezap/global/rds/DataSourceRouter.java index d9a76a32e..9ffbe3ef9 100644 --- a/backend/src/main/java/codezap/global/rds/DataSourceRouter.java +++ b/backend/src/main/java/codezap/global/rds/DataSourceRouter.java @@ -12,7 +12,7 @@ public class DataSourceRouter extends AbstractRoutingDataSource { protected Object determineCurrentLookupKey() { boolean readOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly(); - if(readOnly) { + if (readOnly) { return READER_KEY; } return WRITER_KEY; diff --git a/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java index 959886ebe..85f47477e 100644 --- a/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java +++ b/backend/src/main/java/codezap/global/serialization/DateTimeFormatConfiguration.java @@ -10,6 +10,7 @@ @Configuration public class DateTimeFormatConfiguration { + private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; @Bean diff --git a/backend/src/main/java/codezap/global/swagger/AuthOperationCustomizer.java b/backend/src/main/java/codezap/global/swagger/AuthOperationCustomizer.java index 62b4ee27d..e2622bb6c 100644 --- a/backend/src/main/java/codezap/global/swagger/AuthOperationCustomizer.java +++ b/backend/src/main/java/codezap/global/swagger/AuthOperationCustomizer.java @@ -27,6 +27,7 @@ */ @Component public class AuthOperationCustomizer implements OperationCustomizer { + private static final ObjectMapper objectMapper = new ObjectMapper(); @Override diff --git a/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponses.java b/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponses.java index 2589cf96d..8d3ad4ff6 100644 --- a/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponses.java +++ b/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponses.java @@ -8,5 +8,6 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ApiErrorResponses { + ApiErrorResponse[] value(); } diff --git a/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponsesCustomizer.java b/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponsesCustomizer.java index a2bcc78aa..766444dc5 100644 --- a/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponsesCustomizer.java +++ b/backend/src/main/java/codezap/global/swagger/error/ApiErrorResponsesCustomizer.java @@ -20,6 +20,7 @@ @Component public class ApiErrorResponsesCustomizer implements OperationCustomizer { + @Override public Operation customize(Operation operation, HandlerMethod handlerMethod) { List apiErrorResponses = getApiErrorResponses(handlerMethod); diff --git a/backend/src/main/java/codezap/global/validation/ValidationGroups.java b/backend/src/main/java/codezap/global/validation/ValidationGroups.java index df4729a5c..8f36c360e 100644 --- a/backend/src/main/java/codezap/global/validation/ValidationGroups.java +++ b/backend/src/main/java/codezap/global/validation/ValidationGroups.java @@ -1,6 +1,7 @@ package codezap.global.validation; public class ValidationGroups { + public interface NotNullGroup {} public interface SourceCodeOrdinalGroup {} diff --git a/backend/src/main/java/codezap/likes/repository/LikesRepository.java b/backend/src/main/java/codezap/likes/repository/LikesRepository.java index 7b8dba971..26df06b0a 100644 --- a/backend/src/main/java/codezap/likes/repository/LikesRepository.java +++ b/backend/src/main/java/codezap/likes/repository/LikesRepository.java @@ -7,6 +7,7 @@ import codezap.template.domain.Template; public interface LikesRepository { + Likes save(Likes likes); boolean existsByMemberAndTemplate(Member member, Template template); diff --git a/backend/src/main/java/codezap/tag/controller/SpringDocTagController.java b/backend/src/main/java/codezap/tag/controller/SpringDocTagController.java index efc67d367..af3006ae6 100644 --- a/backend/src/main/java/codezap/tag/controller/SpringDocTagController.java +++ b/backend/src/main/java/codezap/tag/controller/SpringDocTagController.java @@ -10,6 +10,7 @@ @Tag(name = "태그 API", description = "태그 조회 API") public interface SpringDocTagController { + @SecurityRequirement(name = "쿠키 인증 토큰") @Operation(summary = "태그 조회", description = "해당 멤버의 템플릿들에 포함된 태그를 조회합니다.") @ApiResponse(responseCode = "200", description = "태그 조회 성공") diff --git a/backend/src/main/java/codezap/tag/repository/TagJpaRepository.java b/backend/src/main/java/codezap/tag/repository/TagJpaRepository.java index 27d7e4257..06a00d318 100644 --- a/backend/src/main/java/codezap/tag/repository/TagJpaRepository.java +++ b/backend/src/main/java/codezap/tag/repository/TagJpaRepository.java @@ -24,8 +24,9 @@ default Tag fetchByName(String name) { () -> new CodeZapException(HttpStatus.NOT_FOUND, "이름이 " + name + "인 태그는 존재하지 않습니다.")); } - Optional findByName(String name); + @Query(value = "SELECT * FROM tag WHERE tag.name = BINARY :name", nativeQuery = true) + Optional findByName(@Param("name") String name); - @Query("select t.name from Tag t where t.name in :names") - List findNameByNamesIn(@Param("names") List names); + @Query(value = "SELECT * FROM tag WHERE tag.name COLLATE utf8mb4_bin IN :names", nativeQuery = true) + List findAllByNames(@Param("names") List names); } diff --git a/backend/src/main/java/codezap/tag/repository/TagRepository.java b/backend/src/main/java/codezap/tag/repository/TagRepository.java index ab5760e51..bc547bda9 100644 --- a/backend/src/main/java/codezap/tag/repository/TagRepository.java +++ b/backend/src/main/java/codezap/tag/repository/TagRepository.java @@ -13,7 +13,7 @@ public interface TagRepository { Optional findByName(String name); - List findByNameIn(List names); + List findAllByNames(List names); Tag save(Tag tag); diff --git a/backend/src/main/java/codezap/tag/repository/TemplateTagJpaRepository.java b/backend/src/main/java/codezap/tag/repository/TemplateTagJpaRepository.java index 5363b6cf4..2e81c2722 100644 --- a/backend/src/main/java/codezap/tag/repository/TemplateTagJpaRepository.java +++ b/backend/src/main/java/codezap/tag/repository/TemplateTagJpaRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import codezap.tag.domain.Tag; import codezap.template.domain.Template; @@ -22,19 +23,19 @@ public interface TemplateTagJpaRepository extends TemplateTagRepository, JpaRepo List findAllTagsByTemplate(Template template); @Query(""" - SELECT tt, t - FROM TemplateTag tt - JOIN FETCH tt.tag t - WHERE tt.id.templateId = :templateId - """) + SELECT tt, t + FROM TemplateTag tt + JOIN FETCH tt.tag t + WHERE tt.id.templateId = :templateId + """) List findAllByTemplateId(Long templateId); @Query(""" - SELECT tt, t - FROM TemplateTag tt - JOIN FETCH tt.tag t - WHERE tt.id.templateId in :templateIds - """) + SELECT tt, t + FROM TemplateTag tt + JOIN FETCH tt.tag t + WHERE tt.id.templateId in :templateIds + """) List findAllByTemplateIdsIn(List templateIds); @Query(""" @@ -43,13 +44,14 @@ public interface TemplateTagJpaRepository extends TemplateTagRepository, JpaRepo WHERE t.id IN ( SELECT DISTINCT tt.id.tagId FROM TemplateTag tt - WHERE tt.id.templateId IN - (SELECT te.id FROM Template te WHERE te.member.id = :memberId) - ) - """) + WHERE tt.id.templateId IN ( + SELECT te.id FROM Template te WHERE te.member.id = :memberId + ) + ) + """) List findAllTagDistinctByMemberId(Long memberId); @Modifying(clearAutomatically = true) @Query("DELETE FROM TemplateTag t WHERE t.template.id in :templateIds") - void deleteByTemplateIds(List templateIds); + void deleteByTemplateIds(@Param("templateIds") List templateIds); } diff --git a/backend/src/main/java/codezap/tag/repository/TemplateTagRepository.java b/backend/src/main/java/codezap/tag/repository/TemplateTagRepository.java index 5b48d13c1..e8dfc92f1 100644 --- a/backend/src/main/java/codezap/tag/repository/TemplateTagRepository.java +++ b/backend/src/main/java/codezap/tag/repository/TemplateTagRepository.java @@ -16,8 +16,6 @@ public interface TemplateTagRepository { List findAllByTemplateId(Long templateId); - List findDistinctByTemplateIn(List templateIds); - List findAllByTemplateIdsIn(List templateIds); TemplateTag save(TemplateTag templateTag); diff --git a/backend/src/main/java/codezap/tag/service/TagService.java b/backend/src/main/java/codezap/tag/service/TagService.java index 5a7076654..44d279b34 100644 --- a/backend/src/main/java/codezap/tag/service/TagService.java +++ b/backend/src/main/java/codezap/tag/service/TagService.java @@ -24,7 +24,7 @@ public class TagService { @Transactional public void createTags(Template template, List tagNames) { - List existingTags = new ArrayList<>(tagRepository.findByNameIn(tagNames)); + List existingTags = new ArrayList<>(tagRepository.findAllByNames(tagNames)); List existNames = existingTags.stream() .map(Tag::getName) .toList(); diff --git a/backend/src/main/java/codezap/template/controller/SpringDocTemplateController.java b/backend/src/main/java/codezap/template/controller/SpringDocTemplateController.java index 4d0480a68..1537e39e6 100644 --- a/backend/src/main/java/codezap/template/controller/SpringDocTemplateController.java +++ b/backend/src/main/java/codezap/template/controller/SpringDocTemplateController.java @@ -27,7 +27,7 @@ public interface SpringDocTemplateController { 새로운 템플릿을 생성합니다. \n 템플릿명, 템플릿 설명, 소스 코드 목록, 썸네일 순서, 카테고리 ID, 태그 목록이 필요합니다. \n * 템플릿 이름은 비어있거나 공백일 수 없다. - + 소스 코드 목록은 파일명, 소스 코드, 소스 코드 순서가 필요합니다. \n * 소스 코드 순서는 1부터 시작합니다. * 소스 코드 순서는 오름차순으로 정렬하여 보내야 합니다. @@ -62,13 +62,13 @@ public interface SpringDocTemplateController { - 검색 키워드 (템플릿명, 템플릿 설명, 파일명, 소스 코드) - 카테고리 ID - 태그 ID들 \n - + 페이징 조건을 줄 수 있습니다. 페이지 번호는 1, 템플릿 개수는 20, 정렬 방식은 최신순이 기본 값입니다. \n - 페이징 조건 \n - 페이지 번호(pageNumber) - 한 페이지에 템플릿 개수(pageSize) - 페이지 정렬 방식(sort) \n - + - 정렬 방식 \n - 최신순 (modifiedAt,asc) - 오래된순 (modifiedAt,desc) @@ -102,13 +102,13 @@ ResponseEntity findAllTemplates( - 검색 키워드 (템플릿명, 템플릿 설명, 파일명, 소스 코드) - 카테고리 ID - 태그 ID들 \n - + 페이징 조건을 줄 수 있습니다. 페이지 번호는 1, 템플릿 개수는 20, 정렬 방식은 최신순이 기본 값입니다. \n - 페이징 조건 \n - 페이지 번호(pageNumber) - 한 페이지에 템플릿 개수(pageSize) - 페이지 정렬 방식(sort) \n - + - 정렬 방식 \n - 최신순 (modifiedAt,asc) - 오래된순 (modifiedAt,desc) diff --git a/backend/src/main/java/codezap/template/repository/FullTextSearchMySQLDialect.java b/backend/src/main/java/codezap/template/repository/FullTextSearchMySQLDialect.java index a97023fa3..49bcd931f 100644 --- a/backend/src/main/java/codezap/template/repository/FullTextSearchMySQLDialect.java +++ b/backend/src/main/java/codezap/template/repository/FullTextSearchMySQLDialect.java @@ -32,7 +32,12 @@ public ExactPhraseMatchFunction() { } @Override - public void render(SqlAppender sqlAppender, List arguments, ReturnableType returnType, SqlAstTranslator translator) { + public void render( + SqlAppender sqlAppender, + List arguments, + ReturnableType returnType, + SqlAstTranslator translator + ) { sqlAppender.appendSql("MATCH("); translator.render(arguments.get(0), SqlAstNodeRenderingMode.DEFAULT); sqlAppender.appendSql(", "); diff --git a/backend/src/main/java/codezap/template/repository/SourceCodeJpaRepository.java b/backend/src/main/java/codezap/template/repository/SourceCodeJpaRepository.java index 57fcc7243..36c472788 100644 --- a/backend/src/main/java/codezap/template/repository/SourceCodeJpaRepository.java +++ b/backend/src/main/java/codezap/template/repository/SourceCodeJpaRepository.java @@ -14,6 +14,7 @@ @SuppressWarnings("unused") public interface SourceCodeJpaRepository extends SourceCodeRepository, JpaRepository { + default SourceCode fetchById(Long id) { return findById(id).orElseThrow( () -> new CodeZapException(HttpStatus.NOT_FOUND, "식별자 " + id + "에 해당하는 소스 코드가 존재하지 않습니다.")); diff --git a/backend/src/main/java/codezap/template/repository/SourceCodeRepository.java b/backend/src/main/java/codezap/template/repository/SourceCodeRepository.java index 1f6936857..745f3ae77 100644 --- a/backend/src/main/java/codezap/template/repository/SourceCodeRepository.java +++ b/backend/src/main/java/codezap/template/repository/SourceCodeRepository.java @@ -7,6 +7,7 @@ import codezap.template.domain.Template; public interface SourceCodeRepository { + SourceCode fetchById(Long id); List findAllByTemplate(Template template); diff --git a/backend/src/main/java/codezap/template/repository/TemplateSpecification.java b/backend/src/main/java/codezap/template/repository/TemplateSpecification.java index 2001ec93a..71aef43dd 100644 --- a/backend/src/main/java/codezap/template/repository/TemplateSpecification.java +++ b/backend/src/main/java/codezap/template/repository/TemplateSpecification.java @@ -17,6 +17,7 @@ import codezap.template.domain.TemplateTag; public class TemplateSpecification implements Specification