From d0e59cc74ac486dac2b144003f5827a789a7ed11 Mon Sep 17 00:00:00 2001 From: onuyyy Date: Thu, 19 Feb 2026 10:49:38 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20=EC=95=BD=EC=86=8D=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=99=95=EC=A0=95=20=EC=8B=9C=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=EC=A3=BC=EC=A0=9C=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/service/MeetingService.java | 3 +++ .../dokdok/topic/service/TopicService.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/com/dokdok/meeting/service/MeetingService.java b/src/main/java/com/dokdok/meeting/service/MeetingService.java index 2cfce18a..3b9e89f9 100644 --- a/src/main/java/com/dokdok/meeting/service/MeetingService.java +++ b/src/main/java/com/dokdok/meeting/service/MeetingService.java @@ -30,6 +30,7 @@ import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.repository.TopicAnswerRepository; import com.dokdok.topic.repository.TopicRepository; +import com.dokdok.topic.service.TopicService; import com.dokdok.user.entity.User; import com.dokdok.user.service.UserValidator; import lombok.RequiredArgsConstructor; @@ -50,6 +51,7 @@ public class MeetingService { private final MeetingMemberRepository meetingMemberRepository; private final TopicRepository topicRepository; private final TopicAnswerRepository topicAnswerRepository; + private final TopicService topicService; private final GatheringRepository gatheringRepository; private final GatheringMemberRepository gatheringMemberRepository; private final GatheringValidator gatheringValidator; @@ -155,6 +157,7 @@ public MeetingStatusResponse confirmMeeting(Long meetingId) { meeting.changeStatus(MeetingStatus.CONFIRMED); saveMeetingBookForUser(meeting, meeting.getGathering(), meeting.getMeetingLeader().getId()); + topicService.createDefaultTopic(meeting); return MeetingStatusResponse.from(meeting); } diff --git a/src/main/java/com/dokdok/topic/service/TopicService.java b/src/main/java/com/dokdok/topic/service/TopicService.java index 14556f8e..b00dfc80 100644 --- a/src/main/java/com/dokdok/topic/service/TopicService.java +++ b/src/main/java/com/dokdok/topic/service/TopicService.java @@ -19,6 +19,7 @@ import com.dokdok.topic.entity.TopicLike; import com.dokdok.topic.entity.TopicMessage; import com.dokdok.topic.entity.TopicStatus; +import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.exception.TopicErrorCode; import com.dokdok.topic.exception.TopicException; import com.dokdok.topic.repository.TopicAnswerRepository; @@ -50,6 +51,32 @@ public class TopicService { private final MeetingValidator meetingValidator; private final TopicValidator topicValidator; + @Transactional + public void createDefaultTopic(Meeting meeting) { + if (meeting == null || meeting.getId() == null) { + return; + } + if (topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()) > 0) { + return; + } + + User leader = meeting.getMeetingLeader(); + if (leader == null) { + return; + } + TopicType type = TopicType.FREE; + + Topic topic = Topic.create( + meeting, + leader, + type.getDisplayName(), + type.getDescription(), + type + ); + + topicRepository.save(topic); + } + @Transactional public SuggestTopicResponse createTopic( Long gatheringId, From 1e22b809ca3c816e6471cbe91db661b062faab69 Mon Sep 17 00:00:00 2001 From: onuyyy Date: Thu, 19 Feb 2026 10:49:58 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat=20:=20=EC=95=BD=EC=86=A1=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=99=95=EC=A0=95=20=EC=8B=9C=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=EC=A3=BC=EC=A0=9C=20=EB=93=B1=EB=A1=9D=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/service/MeetingServiceTest.java | 5 ++ .../topic/service/TopicServiceTest.java | 55 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java b/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java index 8c0abdb4..1afefd22 100644 --- a/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java +++ b/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java @@ -26,6 +26,7 @@ import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.repository.TopicAnswerRepository; import com.dokdok.topic.repository.TopicRepository; +import com.dokdok.topic.service.TopicService; import com.dokdok.user.entity.User; import com.dokdok.user.service.UserValidator; import org.junit.jupiter.api.BeforeEach; @@ -68,6 +69,9 @@ class MeetingServiceTest { @Mock private TopicAnswerRepository topicAnswerRepository; + @Mock + private TopicService topicService; + @Mock private GatheringRepository gatheringRepository; @@ -561,6 +565,7 @@ void givenMeetingStatus_whenConfirm_thenMeetingStatusChange() { MeetingMember savedMember = meetingMemberCaptor.getValue(); assertThat(savedMember.getUser().getId()).isEqualTo(leader.getId()); assertThat(savedMember.getMeetingRole()).isEqualTo(MeetingMemberRole.LEADER); + verify(topicService).createDefaultTopic(meeting); } } diff --git a/src/test/java/com/dokdok/topic/service/TopicServiceTest.java b/src/test/java/com/dokdok/topic/service/TopicServiceTest.java index 8da1b65e..4812f22d 100644 --- a/src/test/java/com/dokdok/topic/service/TopicServiceTest.java +++ b/src/test/java/com/dokdok/topic/service/TopicServiceTest.java @@ -120,6 +120,61 @@ void setUp() { ); } + @Test + @DisplayName("기본 자유형 토픽이 없으면 생성한다") + void createDefaultTopic_Success() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(testUser) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(0L); + + topicService.createDefaultTopic(meeting); + + var captor = org.mockito.ArgumentCaptor.forClass(Topic.class); + verify(topicRepository).save(captor.capture()); + Topic saved = captor.getValue(); + assertThat(saved.getMeeting()).isEqualTo(meeting); + assertThat(saved.getProposedBy()).isEqualTo(testUser); + assertThat(saved.getTopicType()).isEqualTo(TopicType.FREE); + assertThat(saved.getTitle()).isEqualTo(TopicType.FREE.getDisplayName()); + assertThat(saved.getDescription()).isEqualTo(TopicType.FREE.getDescription()); + } + + @Test + @DisplayName("이미 토픽이 있으면 기본 토픽을 생성하지 않는다") + void createDefaultTopic_SkipWhenExists() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(testUser) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(1L); + + topicService.createDefaultTopic(meeting); + + verify(topicRepository, never()).save(any()); + } + + @Test + @DisplayName("약속장이 없으면 기본 토픽을 생성하지 않는다") + void createDefaultTopic_SkipWhenLeaderMissing() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(null) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(0L); + + topicService.createDefaultTopic(meeting); + + verify(topicRepository, never()).save(any()); + } + @Test @DisplayName("선택한 주제를 확정 상태로 변경한다") void confirmTopics_Success() {