From 9318c2d02d17577ebbfc2000d095097d9ab8940e Mon Sep 17 00:00:00 2001 From: yunseongoh Date: Sat, 4 Oct 2025 02:33:18 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix=20:=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/NotificationCommandService.java | 2 +- .../notification/domain/NotificationQueryRepository.java | 2 +- .../persistence/NotificationQueryDslRepository.java | 2 +- .../persistence/NotificationQueryRepositoryImpl.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/chooz/notification/application/service/NotificationCommandService.java b/src/main/java/com/chooz/notification/application/service/NotificationCommandService.java index 9edf5ad..4f503a8 100644 --- a/src/main/java/com/chooz/notification/application/service/NotificationCommandService.java +++ b/src/main/java/com/chooz/notification/application/service/NotificationCommandService.java @@ -29,7 +29,7 @@ public Notification create(Notification notification) { } @Transactional(propagation = Propagation.REQUIRES_NEW) public void createAll(List notifications) { - List existsNotifications = notificationQueryRepository.existsDedupKeyByNotifications(notifications); + List existsNotifications = notificationQueryRepository.findNotificationsByDedupKey(notifications); Set existingPairs = getExistingPairs(existsNotifications); List toSave = getNotificationsNotDuplicated(notifications, existingPairs); if (!toSave.isEmpty()) { diff --git a/src/main/java/com/chooz/notification/domain/NotificationQueryRepository.java b/src/main/java/com/chooz/notification/domain/NotificationQueryRepository.java index fea4a72..ba4851c 100644 --- a/src/main/java/com/chooz/notification/domain/NotificationQueryRepository.java +++ b/src/main/java/com/chooz/notification/domain/NotificationQueryRepository.java @@ -17,6 +17,6 @@ public interface NotificationQueryRepository { Optional findUserByPostId(Long postId); Optional findPostById(Long postId); boolean existsByDedupKey(Long ReceiverId, String dedupKey); - List existsDedupKeyByNotifications(List notifications); + List findNotificationsByDedupKey(List notifications); List findVoteUsersByPostId(Long postId); } diff --git a/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java b/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java index 0f39d55..7ecb505 100644 --- a/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java +++ b/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java @@ -138,7 +138,7 @@ public boolean existsByDedupKey(Long receiverId, String dedupkey) { ).fetchFirst(); return one != null; } - public List existsDedupKeyByNotifications(List notifications) { + public List findNotificationsByDedupKey(List notifications) { BooleanBuilder builder = new BooleanBuilder(); for (Notification n : notifications) { builder.or( diff --git a/src/main/java/com/chooz/notification/persistence/NotificationQueryRepositoryImpl.java b/src/main/java/com/chooz/notification/persistence/NotificationQueryRepositoryImpl.java index fb3db09..dcd54fe 100644 --- a/src/main/java/com/chooz/notification/persistence/NotificationQueryRepositoryImpl.java +++ b/src/main/java/com/chooz/notification/persistence/NotificationQueryRepositoryImpl.java @@ -55,8 +55,8 @@ public boolean existsByDedupKey(Long ReceiverId, String dedupKey) { } @Override - public List existsDedupKeyByNotifications(List notifications) { - return notificationQueryDslRepository.existsDedupKeyByNotifications(notifications); + public List findNotificationsByDedupKey(List notifications) { + return notificationQueryDslRepository.findNotificationsByDedupKey(notifications); } @Override From f65a798cb360f1b39783578e5594a3f4dd2f9de6 Mon Sep 17 00:00:00 2001 From: yunseongoh Date: Sat, 4 Oct 2025 02:43:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor=20:=20isValid=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=97=90=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=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 --- .../application/web/dto/NotificationRowDto.java | 1 + .../persistence/NotificationQueryDslRepository.java | 1 + .../presentation/dto/NotificationResponse.java | 2 ++ .../application/NotificationQueryServiceTest.java | 10 +++++++++- .../presentation/NotificationControllerTest.java | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/chooz/notification/application/web/dto/NotificationRowDto.java b/src/main/java/com/chooz/notification/application/web/dto/NotificationRowDto.java index ffc5634..b09eb41 100644 --- a/src/main/java/com/chooz/notification/application/web/dto/NotificationRowDto.java +++ b/src/main/java/com/chooz/notification/application/web/dto/NotificationRowDto.java @@ -14,6 +14,7 @@ public record NotificationRowDto( String title, String content, String imageUrl, + boolean isValid, boolean isRead, LocalDateTime eventAt ) {} diff --git a/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java b/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java index 7ecb505..9761b24 100644 --- a/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java +++ b/src/main/java/com/chooz/notification/persistence/NotificationQueryDslRepository.java @@ -44,6 +44,7 @@ public Slice findNotifications(Long userId, Long cursor, Pageab notification.title, notification.content, notification.imageUrl, + notification.isValid, notification.isRead, notification.eventAt ) diff --git a/src/main/java/com/chooz/notification/presentation/dto/NotificationResponse.java b/src/main/java/com/chooz/notification/presentation/dto/NotificationResponse.java index 6169b9f..b17bd97 100644 --- a/src/main/java/com/chooz/notification/presentation/dto/NotificationResponse.java +++ b/src/main/java/com/chooz/notification/presentation/dto/NotificationResponse.java @@ -16,6 +16,7 @@ public record NotificationResponse ( String content, String imageUrl, List targets, + boolean isValid, boolean isRead, LocalDateTime eventAt )implements CursorDto{ @@ -28,6 +29,7 @@ public static NotificationResponse of (NotificationDto notificationDto){ notificationDto.notificationRowDto().content(), notificationDto.notificationRowDto().imageUrl(), List.copyOf(notificationDto.targets().stream().map(t -> Target.of(t.id(), t.type())).toList()), + notificationDto.notificationRowDto().isValid(), notificationDto.notificationRowDto().isRead(), notificationDto.notificationRowDto().eventAt() ); diff --git a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java index 53be924..c082da6 100644 --- a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java +++ b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java @@ -65,7 +65,15 @@ void notifications() throws Exception { //then assertAll( - () -> assertThat(notifications.size()).isNotZero() + () -> assertThat(notifications.size()).isOne(), + () -> assertThat(notifications.getFirst().content()).isEqualTo(content), + () -> assertThat(notifications.getFirst().title()).isEqualTo(title), + () -> assertThat(notifications.getFirst().profileUrl()).isEqualTo(profileUrl), + () -> assertThat(notifications.getFirst().imageUrl()).isEqualTo(imageUrl), + () -> assertThat(notifications.getFirst().eventAt()).isEqualTo(eventAt), + () -> assertThat(notifications.getFirst().isRead()).isEqualTo(false), + () -> assertThat(notifications.getFirst().isValid()).isEqualTo(true) + ); } @Test diff --git a/src/test/java/com/chooz/notification/presentation/NotificationControllerTest.java b/src/test/java/com/chooz/notification/presentation/NotificationControllerTest.java index fc562d8..1cb944a 100644 --- a/src/test/java/com/chooz/notification/presentation/NotificationControllerTest.java +++ b/src/test/java/com/chooz/notification/presentation/NotificationControllerTest.java @@ -50,6 +50,7 @@ void findNotifications() throws Exception { "지금 바로 확인해보세요.", "https://cdn.chooz.site/images/20865b3c-4e2c-454a-81a1-9ca31bbaf77d", List.of(Target.of(1L, TargetType.POST)), + true, false, LocalDateTime.now() ) @@ -88,6 +89,8 @@ void findNotifications() throws Exception { .type(JsonFieldType.NUMBER).description("알림 타겟 ID"), fieldWithPath("data[].targets[].type") .type(JsonFieldType.STRING).description("알림 타겟 유형"), + fieldWithPath("data[].isValid") + .type(JsonFieldType.BOOLEAN).description("유효 알림 여부"), fieldWithPath("data[].isRead") .type(JsonFieldType.BOOLEAN).description("읽음 여부"), fieldWithPath("data[].eventAt") From fb2e94ff64709c05a875124ff6bb588a1d00ae74 Mon Sep 17 00:00:00 2001 From: yunseongoh Date: Thu, 9 Oct 2025 00:36:55 +0900 Subject: [PATCH 3/5] =?UTF-8?q?test=20:=20IntegrationTest=20transactional?= =?UTF-8?q?=20import=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20import=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 --- src/test/java/com/chooz/support/IntegrationTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/chooz/support/IntegrationTest.java b/src/test/java/com/chooz/support/IntegrationTest.java index c0f01dd..f20a8cb 100644 --- a/src/test/java/com/chooz/support/IntegrationTest.java +++ b/src/test/java/com/chooz/support/IntegrationTest.java @@ -1,9 +1,8 @@ package com.chooz.support; -import jakarta.transaction.Transactional; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Profile; import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; @ActiveProfiles("test") @Transactional From 60a8d8c74408d32e8e8f2c277f3c341f6f91d1ec Mon Sep 17 00:00:00 2001 From: yunseongoh Date: Thu, 9 Oct 2025 00:38:04 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test=20:=20requires=20new=20=EB=95=8C?= =?UTF-8?q?=EB=AC=B8=EC=97=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=8C=93=EC=9D=B4=EB=8A=94=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/NotificationQueryServiceTest.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java index c082da6..b06d6c0 100644 --- a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java +++ b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java @@ -7,12 +7,17 @@ import com.chooz.notification.domain.NotificationType; import com.chooz.notification.domain.Target; import com.chooz.notification.domain.TargetType; +import com.chooz.notification.persistence.NotificationJpaRepository; import com.chooz.notification.presentation.dto.NotificationPresentResponse; import com.chooz.notification.presentation.dto.NotificationResponse; import com.chooz.support.IntegrationTest; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.transaction.AfterTransaction; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; @@ -28,6 +33,14 @@ class NotificationQueryServiceTest extends IntegrationTest { @Autowired NotificationCommandService notificationCommandService; + @Autowired + NotificationJpaRepository notificationJpaRepository; + + @AfterTransaction + void clean() { + notificationJpaRepository.deleteAll(); + } + @Test @DisplayName("알림 조회") void notifications() throws Exception { @@ -106,7 +119,6 @@ void present() throws Exception { //when notificationCommandService.create(notification); NotificationPresentResponse notificationPresentResponse = notificationQueryService.present(receiverId); - //then assertAll( () -> assertThat(notificationPresentResponse.present()).isTrue() From ffbaa396d5b435fee5265c86bd9bc945b8b20bc8 Mon Sep 17 00:00:00 2001 From: yunseongoh Date: Thu, 9 Oct 2025 00:57:45 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=EB=A7=88=EC=9D=B4=ED=81=AC?= =?UTF-8?q?=EB=A1=9C=20=EC=B4=88=20=EB=8B=A8=EC=9C=84=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=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 --- .../application/NotificationQueryServiceTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java index b06d6c0..b776ebf 100644 --- a/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java +++ b/src/test/java/com/chooz/notification/application/NotificationQueryServiceTest.java @@ -11,15 +11,13 @@ import com.chooz.notification.presentation.dto.NotificationPresentResponse; import com.chooz.notification.presentation.dto.NotificationResponse; import com.chooz.support.IntegrationTest; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.transaction.AfterTransaction; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -83,7 +81,8 @@ void notifications() throws Exception { () -> assertThat(notifications.getFirst().title()).isEqualTo(title), () -> assertThat(notifications.getFirst().profileUrl()).isEqualTo(profileUrl), () -> assertThat(notifications.getFirst().imageUrl()).isEqualTo(imageUrl), - () -> assertThat(notifications.getFirst().eventAt()).isEqualTo(eventAt), + () -> assertThat(notifications.getFirst().eventAt().truncatedTo(ChronoUnit.MICROS)) + .isEqualTo(eventAt.truncatedTo(ChronoUnit.MICROS)), () -> assertThat(notifications.getFirst().isRead()).isEqualTo(false), () -> assertThat(notifications.getFirst().isValid()).isEqualTo(true)