From b14a0b6f922e52de80470e49302ef54f6c00ce57 Mon Sep 17 00:00:00 2001 From: Leeforgiveness Date: Fri, 18 Apr 2025 19:31:18 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=EC=88=9C=20=EC=A0=95=EB=A0=AC(#103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/BaseTimeEntity.java | 1 + .../common/JpaAuditingConfig.java | 10 +++++++++ .../ProjectBoardRepositoryImpl.java | 22 +++++++++++-------- 3 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/common/JpaAuditingConfig.java diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseTimeEntity.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseTimeEntity.java index efec6cb..c934600 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseTimeEntity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseTimeEntity.java @@ -18,6 +18,7 @@ public abstract class BaseTimeEntity { @Column(updatable = false) private LocalDateTime createAt; + @CreatedDate @LastModifiedDate private LocalDateTime updateAt; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/JpaAuditingConfig.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/JpaAuditingConfig.java new file mode 100644 index 0000000..d3f356c --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/JpaAuditingConfig.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.common; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class JpaAuditingConfig { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java index b39c7e7..79822cb 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java @@ -13,13 +13,12 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.CaseBuilder; -import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPQLQuery; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -69,7 +68,8 @@ public Page searchPageComplex(ProjectBoardSearchCondition c relationFieldCategory.id, relationFieldCategory.name, projectBoard.projectRecruitingEndTime, - projectBoardImage.projectBoardImageUrl + projectBoardImage.projectBoardImageUrl, + projectBoard.updateAt ) .from(projectBoard) .leftJoin(projectTypeCategory) @@ -88,18 +88,22 @@ public Page searchPageComplex(ProjectBoardSearchCondition c .when(projectBoard.projectStatus.eq(ProjectStatus.IN_PROGRESS)).then(2) .when(projectBoard.projectStatus.eq(ProjectStatus.CLOSED)).then(3) .otherwise(4) - .asc() - ) - .orderBy(projectBoardImage.id.asc()) + .asc(), + projectBoard.updateAt.desc().nullsFirst(), + projectBoardImage.id.asc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); - log.info("Query Result (Tuple List): {}", result); // ✅ 쿼리 결과 로그 출력 +// log.info("Query Result (Tuple List): {}", result); // ✅ 쿼리 결과 로그 출력 // DTO 변환 (List으로 relationFieldCategoryName 합치기) Map> groupedByProjectId = result.stream() - .collect(Collectors.groupingBy(tuple -> tuple.get(projectBoard.id))); + .collect(Collectors.groupingBy(tuple -> tuple.get(projectBoard.id), + LinkedHashMap::new, + Collectors.toList())); + +// log.info("Grouped Result: {}", groupedByProjectId); // ✅ 그룹화된 결과 로그 출력 List dtoList = groupedByProjectId.values().stream() .filter(grouped -> { // ✅ relation_type 필터링 추가 (게시물 유지 여부 결정) @@ -155,7 +159,7 @@ public Page searchPageComplex(ProjectBoardSearchCondition c Page pageResult = PageableExecutionUtils.getPage(dtoList, pageable, countQuery::fetchOne); - log.info("Final Page Result: {}", pageResult); // ✅ 최종 반환값 로그 출력 +// log.info("Final Page Result: {}", pageResult); // ✅ 최종 반환값 로그 출력 return pageResult; } From b35bad3fe368cfeb5dbb5713a5caae85ae64cf5e Mon Sep 17 00:00:00 2001 From: Leeforgiveness Date: Fri, 18 Apr 2025 19:39:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=84=9C=EB=B8=8C?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=EB=A1=9C=20=EB=8C=80=EC=B2=B4,=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20fetch=20=EC=82=AD=EC=A0=9C(#103)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectBoardRepositoryImpl.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java index 79822cb..de3b093 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java @@ -13,6 +13,7 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.CaseBuilder; +import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.JPQLQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.LinkedHashMap; @@ -40,18 +41,16 @@ public Page searchPageComplex(ProjectBoardSearchCondition c BooleanExpression projectTypeCondition = projectTypeCategoryNameEq( condition.getProjectTypeCategoryName()); - List matchingProjectIds = queryFactory - .select(relationFieldProjectPostMiddle.projectBoard.id) - .from(relationFieldProjectPostMiddle) - .leftJoin(relationFieldCategory) - .on(relationFieldProjectPostMiddle.relationFieldCategory.id.eq( - relationFieldCategory.id)) - .where(relationFieldCategoryNameEq(condition.getRelationFieldCategoryName())) - .fetch(); - BooleanExpression relationFieldCondition = null; if (hasText(condition.getRelationFieldCategoryName())) { - relationFieldCondition = projectBoard.id.in(matchingProjectIds); // ✅ 조회된 ID 목록을 조건으로 사용 + relationFieldCondition = projectBoard.id.in(JPAExpressions + .select(relationFieldProjectPostMiddle.projectBoard.id) + .from(relationFieldProjectPostMiddle) + .leftJoin(relationFieldCategory) + .on(relationFieldProjectPostMiddle.relationFieldCategory.id.eq( + relationFieldCategory.id)) + .where(relationFieldCategoryNameEq( + condition.getRelationFieldCategoryName()))); // ✅ 조회된 ID 목록을 조건으로 사용 } BooleanExpression filterCondition = @@ -68,8 +67,7 @@ public Page searchPageComplex(ProjectBoardSearchCondition c relationFieldCategory.id, relationFieldCategory.name, projectBoard.projectRecruitingEndTime, - projectBoardImage.projectBoardImageUrl, - projectBoard.updateAt + projectBoardImage.projectBoardImageUrl ) .from(projectBoard) .leftJoin(projectTypeCategory) @@ -192,7 +190,8 @@ public Page myProjectBoardPage(UUID uuid, Pageable pageable .when(projectBoard.projectStatus.eq(ProjectStatus.IN_PROGRESS)).then(2) .when(projectBoard.projectStatus.eq(ProjectStatus.CLOSED)).then(3) .otherwise(4) - .asc() + .asc(), + projectBoard.updateAt.desc().nullsFirst() ) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -200,7 +199,9 @@ public Page myProjectBoardPage(UUID uuid, Pageable pageable // DTO 변환 (List으로 relationFieldCategoryName 합치기) Map> groupedByProjectId = result.stream() - .collect(Collectors.groupingBy(tuple -> tuple.get(projectBoard.id))); + .collect(Collectors.groupingBy(tuple -> tuple.get(projectBoard.id), + LinkedHashMap::new, + Collectors.toList())); List dtoList = groupedByProjectId.values().stream() .map(grouped -> { From b28fedaf82f280ebac342f088f398a3e37e67c3a Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Wed, 30 Apr 2025 19:13:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refacor=20:Archive,=20Activity=20content=20?= =?UTF-8?q?Text=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 --- .../archisemtle/semtlewebserverspring/config/CorsConfig.java | 3 +++ .../semtlewebserverspring/domain/activity/Activity.java | 3 +-- .../semtlewebserverspring/domain/archive/Archive.java | 4 +--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/config/CorsConfig.java b/src/main/java/com/archisemtle/semtlewebserverspring/config/CorsConfig.java index 7f4ea81..04a9807 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/config/CorsConfig.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/config/CorsConfig.java @@ -23,3 +23,6 @@ public void addCorsMappings(CorsRegistry registry) { } + + + diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java index f45bb87..9234676 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java @@ -24,8 +24,7 @@ public class Activity { @Column(nullable = false, unique = false) private String title; - @Lob - @Column(nullable = false, unique = false) + @Column(nullable = false, unique = false,columnDefinition = "Text") private String content; @Column(nullable = false, unique = false) private String writer; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java index aef7132..fa05cc2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java @@ -32,9 +32,7 @@ public class Archive { private String title; @Column(unique = false, nullable = false) private String writer; - - @Lob - @Column(unique = false, nullable = false) + @Column(nullable = false, unique = false,columnDefinition = "Text") private String content; @Column(unique = false, nullable = false) private LocalDateTime createdAt; From 75d0cea1a8f509b17a2153d6293379c1542a086f Mon Sep 17 00:00:00 2001 From: Leeforgiveness Date: Mon, 5 May 2025 01:44:01 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=EB=B9=8C=EB=93=9C=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/activity/ActivityServiceImpl.java | 5 +++-- .../application/archive/ArchiveServiceImpl.java | 3 ++- .../dto/activity/ActivityResponseDto.java | 3 ++- .../dto/archive/ArchiveResponseDto.java | 4 +++- .../vo/activity/ActivityResponseVo.java | 3 ++- .../semtlewebserverspring/vo/archive/ArchiveResponseVo.java | 3 ++- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index b402e5a..84dbd25 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -12,6 +12,7 @@ import jakarta.transaction.Transactional; import jakarta.validation.constraints.Null; import java.io.IOException; +import java.time.LocalDateTime; import java.util.Date; import lombok.AllArgsConstructor; import org.slf4j.Logger; @@ -39,7 +40,7 @@ public void createActivityBoard(ActivityRequestDto requestDto) throws IOExceptio .writer(requestDto.getWriter()) .images(requestDto.getImages()) .uuid(requestDto.getUuid()) - .createdAt(new Date()) + .createdAt(java.time.LocalDateTime.now()) .type(requestDto.getType()) .build(); @@ -67,7 +68,7 @@ public void updateActivityBoard(Long id, ActivityRequestDto requestDto){ .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(requestDto.getCreatedAt()) + .createdAt(LocalDateTime.now()) .uuid(activity.getUuid()) .images(requestDto.getImages()) .type(requestDto.getType()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 838fee5..4ff08d0 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -9,6 +9,7 @@ import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; import com.archisemtle.semtlewebserverspring.infrastructure.archive.ArchiveRepository; +import java.time.LocalDateTime; import java.util.Date; import java.util.UUID; import lombok.AllArgsConstructor; @@ -34,7 +35,7 @@ public void createArchiveBoard(ArchiveRequestDto requestDto) { .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(new Date()) + .createdAt(LocalDateTime.now()) .uuid(requestDto.getUuid()) .imageUrl(requestDto.getImageUrl()) .fileUrl(requestDto.getFileUrl()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java index 419dd80..b2da687 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.activity.Activity; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -16,7 +17,7 @@ public class ActivityResponseDto { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java index 65e8b4a..2a88e5a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java @@ -2,11 +2,13 @@ import com.archisemtle.semtlewebserverspring.domain.archive.Archive; import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.cglib.core.Local; @Getter @NoArgsConstructor @@ -16,7 +18,7 @@ public class ArchiveResponseDto { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java index 0414091..120dd19 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java @@ -1,5 +1,6 @@ package com.archisemtle.semtlewebserverspring.vo.activity; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import lombok.Builder; @@ -14,7 +15,7 @@ public class ActivityResponseVo { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java index 507b93d..4371d41 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java @@ -1,5 +1,6 @@ package com.archisemtle.semtlewebserverspring.vo.archive; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import lombok.Builder; @@ -13,7 +14,7 @@ public class ArchiveResponseVo { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl;