From 6a256aac23bc2749e95bc32387a622862703fcf9 Mon Sep 17 00:00:00 2001 From: yw6938 Date: Wed, 26 Nov 2025 22:19:27 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feature:=20=EB=AA=A8=EC=A7=91=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=EB=82=A0=EC=A7=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/moadong/club/entity/Club.java | 9 ++++++--- .../moadong/club/payload/dto/ClubDetailedResult.java | 7 +++++++ .../java/moadong/club/service/ClubProfileService.java | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/moadong/club/entity/Club.java b/backend/src/main/java/moadong/club/entity/Club.java index c9df6fd1f..3c2cf9f0f 100644 --- a/backend/src/main/java/moadong/club/entity/Club.java +++ b/backend/src/main/java/moadong/club/entity/Club.java @@ -1,17 +1,16 @@ package moadong.club.entity; -import java.time.format.DateTimeFormatter; +import java.time.LocalDateTime; import java.util.List; -import java.util.Locale; import java.util.Map; import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.FirebaseMessagingException; import com.google.firebase.messaging.Message; -import com.google.firebase.messaging.Notification; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import moadong.club.enums.ClubRecruitmentStatus; import moadong.club.enums.ClubState; @@ -52,6 +51,10 @@ public class Club implements Persistable { @Version private Long version; + @Setter + @Getter + private LocalDateTime lastModified; + public Club() { this.name = ""; this.category = ""; diff --git a/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java b/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java index 37802ac40..af3396c44 100644 --- a/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java +++ b/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java @@ -29,6 +29,7 @@ public record ClubDetailedResult( String category, String division, List faqs, + String lastModified, List recommendClubs ) { @@ -40,6 +41,11 @@ public static ClubDetailedResult of(Club club, List recommendC period = clubRecruitmentInformation.getRecruitmentStart().format(formatter) + " ~ " + clubRecruitmentInformation.getRecruitmentEnd().format(formatter); } + String lastModified = ""; + if (club.getLastModified() != null) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm"); + lastModified = club.getLastModified().format(formatter); + } return ClubDetailedResult.builder() .id(club.getId() == null ? "" : club.getId()) .name(club.getName() == null ? "" : club.getName()) @@ -74,6 +80,7 @@ public static ClubDetailedResult of(Club club, List recommendC : club.getSocialLinks()) .faqs(club.getClubRecruitmentInformation().getFaqs() == null ? List.of() : club.getClubRecruitmentInformation().getFaqs()) + .lastModified(lastModified) .recommendClubs(recommendClubs) .build(); } diff --git a/backend/src/main/java/moadong/club/service/ClubProfileService.java b/backend/src/main/java/moadong/club/service/ClubProfileService.java index 4759a5566..63d7d7c43 100644 --- a/backend/src/main/java/moadong/club/service/ClubProfileService.java +++ b/backend/src/main/java/moadong/club/service/ClubProfileService.java @@ -1,5 +1,6 @@ package moadong.club.service; +import java.time.LocalDateTime; import java.util.List; import lombok.AllArgsConstructor; import moadong.club.entity.Club; @@ -44,6 +45,7 @@ public void updateClubRecruitmentInfo(ClubRecruitmentInfoUpdateRequest request, club.getClubRecruitmentInformation().getRecruitmentStart(), club.getClubRecruitmentInformation().getRecruitmentEnd() ); + club.setLastModified(LocalDateTime.now()); clubRepository.save(club); } From 373ffeb195ac0515e2fe081dbf03b2cc3ca4736b Mon Sep 17 00:00:00 2001 From: yw6938 Date: Wed, 26 Nov 2025 22:21:56 +0900 Subject: [PATCH 2/6] =?UTF-8?q?test:=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=82=A0=EC=A7=9C=20=EA=B5=AC=ED=98=84=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ClubProfileServiceDateTest.java | 70 +++++++++++++++++++ .../moadong/fixture/ClubRequestFixture.java | 13 ++++ 2 files changed, 83 insertions(+) create mode 100644 backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java diff --git a/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java new file mode 100644 index 000000000..8af35b4c0 --- /dev/null +++ b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java @@ -0,0 +1,70 @@ +package moadong.club.service; + +import moadong.club.entity.Club; +import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest; +import moadong.club.repository.ClubRepository; +import moadong.club.util.RecruitmentStateCalculator; +import moadong.fixture.ClubRequestFixture; +import moadong.fixture.UserFixture; +import moadong.user.payload.CustomUserDetails; +import moadong.util.annotations.UnitTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; + + +import java.time.LocalDateTime; +import java.util.Optional; + + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +@UnitTest +public class ClubProfileServiceDateTest { + + @Spy + @InjectMocks + ClubProfileService clubProfileService; + + @Mock + ClubRepository clubRepository; + + @DisplayName("모집글 수정 시 최근 업데이트 일자를 보여준다") + @Test + void 모집글_수정_시_최근_업데이트_일자를_보여줘야한다(){ + //GIVEN + ClubRecruitmentInfoUpdateRequest request = ClubRequestFixture.defaultRequest(); + CustomUserDetails customUserDetails = UserFixture.createUserDetails("test"); + Club club = new Club(); + when(clubRepository.findClubByUserId(any())).thenReturn(Optional.of(club)); + //updateClubRecruitmentInfo의 RecruitmentStateCalculator 무시 + try (var mocked = Mockito.mockStatic(RecruitmentStateCalculator.class)) { + mocked.when(() -> + RecruitmentStateCalculator.calculate( + Mockito.any(moadong.club.entity.Club.class), + Mockito.any(java.time.ZonedDateTime.class), + Mockito.any(java.time.ZonedDateTime.class) + ) + ).thenAnswer(inv -> null); + + //WHEN + clubProfileService.updateClubRecruitmentInfo(request, customUserDetails); + + //THEN + assertNotNull(club.getLastModified()); + //1초 전후 차이로 살펴보기 + LocalDateTime now = LocalDateTime.now(); + assertTrue(club.getLastModified().isAfter(now.minusSeconds(1))); + assertTrue(club.getLastModified().isBefore(now.plusSeconds(1))); + } + } +} diff --git a/backend/src/test/java/moadong/fixture/ClubRequestFixture.java b/backend/src/test/java/moadong/fixture/ClubRequestFixture.java index 8d5feef1a..9021fb550 100644 --- a/backend/src/test/java/moadong/fixture/ClubRequestFixture.java +++ b/backend/src/test/java/moadong/fixture/ClubRequestFixture.java @@ -3,7 +3,9 @@ import moadong.club.enums.ClubCategory; import moadong.club.enums.ClubDivision; import moadong.club.payload.request.ClubInfoRequest; +import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -21,6 +23,17 @@ public static ClubInfoRequest createValidClubInfoRequest() { ); } + + public static ClubRecruitmentInfoUpdateRequest defaultRequest() { + return new ClubRecruitmentInfoUpdateRequest( + LocalDateTime.now(), + LocalDateTime.now().plusDays(7), + "테스트 대상", + "테스트 설명", + "https://fake-url.com", + List.of() + ); + } //ToDo: 시간 계산법을 LocalDateTime에서 Instant로 변경 후에 활성화할 것 // public static ClubRecruitmentInfoUpdateRequest createValidRequest() { // return new ClubRecruitmentInfoUpdateRequest( From 8bec173bd685e92eb8a0721fb12ee4fa55c4cfbc Mon Sep 17 00:00:00 2001 From: yw6938 Date: Wed, 26 Nov 2025 22:45:03 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20@Getter=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/moadong/club/entity/Club.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/main/java/moadong/club/entity/Club.java b/backend/src/main/java/moadong/club/entity/Club.java index 3c2cf9f0f..90ab90022 100644 --- a/backend/src/main/java/moadong/club/entity/Club.java +++ b/backend/src/main/java/moadong/club/entity/Club.java @@ -52,7 +52,6 @@ public class Club implements Persistable { private Long version; @Setter - @Getter private LocalDateTime lastModified; public Club() { From 47de23d56b6a7ac08abcefaeac9d257ec3d778da Mon Sep 17 00:00:00 2001 From: yw6938 Date: Wed, 26 Nov 2025 22:50:16 +0900 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moadong/club/service/ClubProfileServiceDateTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java index 8af35b4c0..6bd6d5077 100644 --- a/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java +++ b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java @@ -3,6 +3,7 @@ import moadong.club.entity.Club; import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest; import moadong.club.repository.ClubRepository; +import moadong.club.repository.ClubSearchRepository; import moadong.club.util.RecruitmentStateCalculator; import moadong.fixture.ClubRequestFixture; import moadong.fixture.UserFixture; @@ -31,13 +32,15 @@ @UnitTest public class ClubProfileServiceDateTest { - @Spy @InjectMocks ClubProfileService clubProfileService; @Mock ClubRepository clubRepository; + @Mock + ClubSearchRepository clubSearchRepository; + @DisplayName("모집글 수정 시 최근 업데이트 일자를 보여준다") @Test void 모집글_수정_시_최근_업데이트_일자를_보여줘야한다(){ From a6be5387be0f7165e0e4202ff68cf77b0c111114 Mon Sep 17 00:00:00 2001 From: yw6938 Date: Sun, 30 Nov 2025 17:43:43 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=EB=82=A0=EC=A7=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/moadong/club/entity/Club.java | 6 ------ .../club/entity/ClubRecruitmentInformation.java | 11 +++++++++++ .../moadong/club/payload/dto/ClubDetailedResult.java | 11 ++++++----- .../java/moadong/club/service/ClubProfileService.java | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/moadong/club/entity/Club.java b/backend/src/main/java/moadong/club/entity/Club.java index 90ab90022..df0f6e146 100644 --- a/backend/src/main/java/moadong/club/entity/Club.java +++ b/backend/src/main/java/moadong/club/entity/Club.java @@ -1,6 +1,5 @@ package moadong.club.entity; -import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -10,7 +9,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import moadong.club.enums.ClubRecruitmentStatus; import moadong.club.enums.ClubState; @@ -50,10 +48,6 @@ public class Club implements Persistable { @Version private Long version; - - @Setter - private LocalDateTime lastModified; - public Club() { this.name = ""; this.category = ""; diff --git a/backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java b/backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java index 9de02b81b..777144393 100644 --- a/backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java +++ b/backend/src/main/java/moadong/club/entity/ClubRecruitmentInformation.java @@ -13,6 +13,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.Setter; import moadong.club.enums.ClubRecruitmentStatus; import moadong.club.payload.request.ClubInfoRequest; import moadong.club.payload.request.ClubRecruitmentInfoUpdateRequest; @@ -66,6 +67,8 @@ public class ClubRecruitmentInformation { @NotNull private ClubRecruitmentStatus clubRecruitmentStatus; + private LocalDateTime lastModifiedDate; + public void updateLogo(String logo) { this.logo = logo; } @@ -121,4 +124,12 @@ public void update(ClubInfoRequest request) { public void updateCover(String cover) { this.cover = cover; } + + private void setLastModifiedDate(LocalDateTime lastModifiedDate) { + this.lastModifiedDate = lastModifiedDate; + } + + public void updateLastModifiedDate() { + setLastModifiedDate(LocalDateTime.now()); + } } diff --git a/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java b/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java index af3396c44..58e224e12 100644 --- a/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java +++ b/backend/src/main/java/moadong/club/payload/dto/ClubDetailedResult.java @@ -29,7 +29,7 @@ public record ClubDetailedResult( String category, String division, List faqs, - String lastModified, + String lastModifiedDate, List recommendClubs ) { @@ -41,10 +41,11 @@ public static ClubDetailedResult of(Club club, List recommendC period = clubRecruitmentInformation.getRecruitmentStart().format(formatter) + " ~ " + clubRecruitmentInformation.getRecruitmentEnd().format(formatter); } - String lastModified = ""; - if (club.getLastModified() != null) { + + String lastModifiedDate = ""; + if (club.getClubRecruitmentInformation().getLastModifiedDate() != null) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm"); - lastModified = club.getLastModified().format(formatter); + lastModifiedDate = club.getClubRecruitmentInformation().getLastModifiedDate().format(formatter); } return ClubDetailedResult.builder() .id(club.getId() == null ? "" : club.getId()) @@ -80,7 +81,7 @@ public static ClubDetailedResult of(Club club, List recommendC : club.getSocialLinks()) .faqs(club.getClubRecruitmentInformation().getFaqs() == null ? List.of() : club.getClubRecruitmentInformation().getFaqs()) - .lastModified(lastModified) + .lastModifiedDate(lastModifiedDate) .recommendClubs(recommendClubs) .build(); } diff --git a/backend/src/main/java/moadong/club/service/ClubProfileService.java b/backend/src/main/java/moadong/club/service/ClubProfileService.java index 63d7d7c43..4f8c6c6ca 100644 --- a/backend/src/main/java/moadong/club/service/ClubProfileService.java +++ b/backend/src/main/java/moadong/club/service/ClubProfileService.java @@ -45,7 +45,7 @@ public void updateClubRecruitmentInfo(ClubRecruitmentInfoUpdateRequest request, club.getClubRecruitmentInformation().getRecruitmentStart(), club.getClubRecruitmentInformation().getRecruitmentEnd() ); - club.setLastModified(LocalDateTime.now()); + club.getClubRecruitmentInformation().updateLastModifiedDate(); clubRepository.save(club); } From 8898972ff3aa5eb06083aad22fec60564db0a834 Mon Sep 17 00:00:00 2001 From: yw6938 Date: Sun, 30 Nov 2025 18:41:22 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20test=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moadong/club/service/ClubProfileServiceDateTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java index 6bd6d5077..5650b77bd 100644 --- a/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java +++ b/backend/src/test/java/moadong/club/service/ClubProfileServiceDateTest.java @@ -63,11 +63,13 @@ public class ClubProfileServiceDateTest { clubProfileService.updateClubRecruitmentInfo(request, customUserDetails); //THEN - assertNotNull(club.getLastModified()); + assertNotNull(club.getClubRecruitmentInformation().getLastModifiedDate()); //1초 전후 차이로 살펴보기 LocalDateTime now = LocalDateTime.now(); - assertTrue(club.getLastModified().isAfter(now.minusSeconds(1))); - assertTrue(club.getLastModified().isBefore(now.plusSeconds(1))); + assertTrue(club.getClubRecruitmentInformation(). + getLastModifiedDate().isAfter(now.minusSeconds(1))); + assertTrue(club.getClubRecruitmentInformation(). + getLastModifiedDate().isBefore(now.plusSeconds(1))); } } }