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/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/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 d0f99d4..9234676 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.dto.activity.ActivityRequestDto; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -23,14 +24,13 @@ public class Activity { @Column(nullable = false, unique = false) private String title; - @Column(nullable = false, unique = false) + @Column(nullable = false, unique = false,columnDefinition = "Text") private String content; @Column(nullable = false, unique = false) private String writer; - @Column(nullable = true, unique = false) - @Temporal(TemporalType.DATE) - private Date createdAt; - @Column(nullable = true, unique = false, columnDefinition = "uuid") + @Column(nullable = false, unique = false) + private LocalDateTime createdAt; + @Column(nullable = false, unique = false, columnDefinition = "uuid") private UUID uuid; @ElementCollection @CollectionTable(name = "activity_image", joinColumns = @JoinColumn(name = "activity_id")) 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 afbfe37..fa05cc2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java @@ -1,23 +1,26 @@ package com.archisemtle.semtlewebserverspring.domain.archive; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; + import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.Date; +import jakarta.persistence.Lob; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @Entity(name = "archive") +@AllArgsConstructor @NoArgsConstructor +@Builder public class Archive { @Id @@ -27,31 +30,21 @@ public class Archive { @Column(unique = false, nullable = false) private String title; + @Column(unique = false, nullable = false) private String writer; + @Column(nullable = false, unique = false,columnDefinition = "Text") private String content; - private Date createdAt; + @Column(unique = false, nullable = false) + private LocalDateTime createdAt; @Column(unique = false, nullable = false) private UUID uuid; @Column(unique = false, nullable = true) private List imageUrl; + @Column(unique = false, nullable = true) private List fileUrl; - @Builder - public Archive(Long id, String title, String writer, String content, Date createdAt, UUID uuid, - List imageUrl, List fileUrl) - { - this.id = id; - this.title = title; - this.writer = writer; - this.content = content; - this.createdAt = createdAt; - this.uuid = uuid; - this.imageUrl = imageUrl; - this.fileUrl = fileUrl; - } - public static ArchiveResponseVo entityToVo(Archive archive){ return ArchiveResponseVo.builder() .writer(archive.getWriter()) 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/infrastructure/ProjectBoardRepositoryImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java index b39c7e7..de3b093 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardRepositoryImpl.java @@ -13,13 +13,13 @@ 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.JPAExpressions; 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; @@ -41,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 = @@ -88,18 +86,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 +157,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; } @@ -188,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()) @@ -196,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 -> { 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;