From f120218510e871d706c402686db3d29a80549813 Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Tue, 28 Jan 2025 22:00:05 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94?= =?UTF-8?q?=ED=9A=8C=EC=B0=A8=EC=97=90=20=ED=9A=8C=EC=B0=A8=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gdsc/domain/studyv2/domain/StudySessionV2.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java index 73f35759a..6210d5d2c 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java @@ -30,6 +30,9 @@ public class StudySessionV2 extends BaseEntity { @Column(name = "study_session_v2_id") private Long id; + @Comment("회차 순서") + private Integer position; + @Comment("회차 제목") private String title; @@ -70,6 +73,7 @@ public class StudySessionV2 extends BaseEntity { */ @Builder(access = AccessLevel.PRIVATE) private StudySessionV2( + Integer position, String title, String description, Integer lessonAttendanceNumber, @@ -77,6 +81,7 @@ private StudySessionV2( String assignmentDescriptionLink, Period assignmentPeriod, StudyV2 studyV2) { + this.position = position; this.title = title; this.description = description; this.lessonAttendanceNumber = lessonAttendanceNumber; From d2548ef58059093a28216482d4351b0ddfea2338 Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Tue, 28 Jan 2025 22:00:45 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=EB=B9=88=20=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=EB=94=94=ED=9A=8C=EC=B0=A8=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=A0=95=ED=8C=A9=EB=A9=94=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/studyv2/domain/StudySessionV2.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java index 6210d5d2c..5ed0bfdbb 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudySessionV2.java @@ -92,21 +92,10 @@ private StudySessionV2( studyV2.getStudySessions().add(this); } - public static void create( - String title, - String description, - Integer lessonAttendanceNumber, - Period lessonPeriod, - String assignmentDescriptionLink, - Period assignmentPeriod, - StudyV2 studyV2) { + public static void createEmpty(Integer position, Integer lessonAttendanceNumber, StudyV2 studyV2) { StudySessionV2.builder() - .title(title) - .description(description) + .position(position) .lessonAttendanceNumber(lessonAttendanceNumber) - .lessonPeriod(lessonPeriod) - .assignmentDescriptionLink(assignmentDescriptionLink) - .assignmentPeriod(assignmentPeriod) .studyV2(studyV2) .build(); } From 8448cc3b93f0b77396e593c45e9df841fce7df95 Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Tue, 28 Jan 2025 22:19:15 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EC=B6=9C=EC=84=9D=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=83=9D=EC=84=B1=EA=B8=B0=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/AttendanceNumberGenerator.java | 5 +++++ .../domain/RandomAttendanceNumberGenerator.java | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/AttendanceNumberGenerator.java create mode 100644 src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/AttendanceNumberGenerator.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/AttendanceNumberGenerator.java new file mode 100644 index 000000000..7d67426da --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/AttendanceNumberGenerator.java @@ -0,0 +1,5 @@ +package com.gdschongik.gdsc.domain.studyv2.domain; + +public interface AttendanceNumberGenerator { + int generate(); +} diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java new file mode 100644 index 000000000..93775db64 --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java @@ -0,0 +1,16 @@ +package com.gdschongik.gdsc.domain.studyv2.domain; + +import java.security.SecureRandom; +import lombok.SneakyThrows; + +/** + * 네 자리의 랜덤한 출석번호를 생성합니다. + */ +public class RandomAttendanceNumberGenerator implements AttendanceNumberGenerator { + + @Override + @SneakyThrows + public int generate() { + return SecureRandom.getInstanceStrong().ints(1000, 10000).findFirst().orElseThrow(); + } +} From f6a536b177563a44b2e34d4ea2fa6fe13982091a Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Tue, 28 Jan 2025 22:19:21 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/studyv2/domain/StudyFactory.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactory.java diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactory.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactory.java new file mode 100644 index 000000000..574443cca --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactory.java @@ -0,0 +1,54 @@ +package com.gdschongik.gdsc.domain.studyv2.domain; + +import com.gdschongik.gdsc.domain.common.vo.Period; +import com.gdschongik.gdsc.domain.common.vo.Semester; +import com.gdschongik.gdsc.domain.member.domain.Member; +import com.gdschongik.gdsc.domain.study.domain.StudyType; +import com.gdschongik.gdsc.global.annotation.DomainFactory; +import java.time.DayOfWeek; +import java.time.LocalTime; +import java.util.stream.IntStream; + +@DomainFactory +public class StudyFactory { + + /** + * 스터디 및 스터디회차를 생성합니다. + * 스터디회차의 경우 총 회차 수만큼 생성되며, 생성 순서에 따라 position 값이 지정됩니다. + */ + public StudyV2 create( + StudyType type, + String title, + String description, + String descriptionNotionLink, + Semester semester, + Integer totalRound, + DayOfWeek dayOfWeek, + LocalTime startTime, + LocalTime endTime, + Period applicationPeriod, + String discordChannelId, + String discordRoleId, + Member mentor, + AttendanceNumberGenerator attendanceNumberGenerator) { + StudyV2 study = StudyV2.create( + type, + title, + description, + descriptionNotionLink, + semester, + totalRound, + dayOfWeek, + startTime, + endTime, + applicationPeriod, + discordChannelId, + discordRoleId, + mentor); + + IntStream.rangeClosed(1, totalRound) + .forEach(round -> StudySessionV2.createEmpty(round, attendanceNumberGenerator.generate(), study)); + + return study; + } +} From 760a4fb9900b30714778f6925a70d31b6f720cbe Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Tue, 28 Jan 2025 22:24:53 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=83=81=EC=88=98=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyv2/domain/RandomAttendanceNumberGenerator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java index 93775db64..c69a0e67b 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java +++ b/src/main/java/com/gdschongik/gdsc/domain/studyv2/domain/RandomAttendanceNumberGenerator.java @@ -8,9 +8,15 @@ */ public class RandomAttendanceNumberGenerator implements AttendanceNumberGenerator { + public static final int MIN_ORIGIN = 1000; + public static final int MAX_BOUND = 10000; + @Override @SneakyThrows public int generate() { - return SecureRandom.getInstanceStrong().ints(1000, 10000).findFirst().orElseThrow(); + return SecureRandom.getInstanceStrong() + .ints(MIN_ORIGIN, MAX_BOUND) + .findFirst() + .orElseThrow(); } } From 63dec7173c2e88849e65f64f07f809995898471d Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Wed, 29 Jan 2025 21:46:17 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=ED=95=99=EA=B8=B0=20VO=EC=97=90=20?= =?UTF-8?q?=EC=A0=95=ED=8C=A9=EB=A9=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gdschongik/gdsc/domain/common/vo/Semester.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/gdschongik/gdsc/domain/common/vo/Semester.java b/src/main/java/com/gdschongik/gdsc/domain/common/vo/Semester.java index b00ed60c6..689145533 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/common/vo/Semester.java +++ b/src/main/java/com/gdschongik/gdsc/domain/common/vo/Semester.java @@ -5,6 +5,7 @@ import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import lombok.AccessLevel; +import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @@ -19,4 +20,17 @@ public class Semester { @Enumerated(EnumType.STRING) private SemesterType semesterType; + + @Builder(access = AccessLevel.PRIVATE) + private Semester(int academicYear, SemesterType semesterType) { + this.academicYear = academicYear; + this.semesterType = semesterType; + } + + public static Semester of(int academicYear, SemesterType semesterType) { + return Semester.builder() + .academicYear(academicYear) + .semesterType(semesterType) + .build(); + } } From 87caf45d6501ef18ffde69444121a61d2f9e83be Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Wed, 29 Jan 2025 21:46:27 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20V2=20=EC=A0=84=EC=9A=A9=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gdsc/global/common/constant/StudyConstant.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java b/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java index dbb5d4a05..dffcf5fa1 100644 --- a/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java +++ b/src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java @@ -1,6 +1,8 @@ package com.gdschongik.gdsc.global.common.constant; +import com.gdschongik.gdsc.domain.common.model.SemesterType; import com.gdschongik.gdsc.domain.common.vo.Period; +import com.gdschongik.gdsc.domain.common.vo.Semester; import com.gdschongik.gdsc.domain.study.domain.StudyType; import java.time.DayOfWeek; import java.time.LocalDateTime; @@ -10,12 +12,20 @@ public class StudyConstant { private StudyConstant() {} public static final String STUDY_TITLE = "스터디 제목"; + public static final String STUDY_DESCRIPTION = "스터디 설명"; + public static final String STUDY_DESCRIPTION_NOTION_LINK = "https://gdschongik.com/2025-1-backend-study"; + public static final Semester STUDY_SEMESTER = Semester.of(2025, SemesterType.FIRST); public static final Long TOTAL_WEEK = 8L; + public static final int TOTAL_ROUND = 8; public static final StudyType ONLINE_STUDY = StudyType.ONLINE; public static final StudyType ASSIGNMENT_STUDY = StudyType.ASSIGNMENT; public static final DayOfWeek DAY_OF_WEEK = DayOfWeek.FRIDAY; public static final LocalTime STUDY_START_TIME = LocalTime.of(19, 0, 0); public static final LocalTime STUDY_END_TIME = LocalTime.of(20, 0, 0); + public static final Period STUDY_APPLICATION_PERIOD = + Period.of(LocalDateTime.of(2025, 3, 1, 0, 0), LocalDateTime.of(2025, 3, 14, 23, 59)); + public static final String STUDY_DISCORD_CHANNEL_ID = "12345678"; + public static final String STUDY_DISCORD_ROLE_ID = "12345678"; // StudyDetail public static final String ATTENDANCE_NUMBER = "1234"; From ac5503d61d6ae9340912b75010cd3f41cd4d4e9e Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn Date: Wed, 29 Jan 2025 21:46:39 +0900 Subject: [PATCH 8/8] =?UTF-8?q?test:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../studyv2/domain/StudyFactoryTest.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/test/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactoryTest.java diff --git a/src/test/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactoryTest.java b/src/test/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactoryTest.java new file mode 100644 index 000000000..27b909cbc --- /dev/null +++ b/src/test/java/com/gdschongik/gdsc/domain/studyv2/domain/StudyFactoryTest.java @@ -0,0 +1,109 @@ +package com.gdschongik.gdsc.domain.studyv2.domain; + +import static com.gdschongik.gdsc.global.common.constant.StudyConstant.*; +import static org.assertj.core.api.Assertions.*; + +import com.gdschongik.gdsc.domain.member.domain.Member; +import com.gdschongik.gdsc.domain.study.domain.StudyType; +import com.gdschongik.gdsc.helper.FixtureHelper; +import org.junit.jupiter.api.Test; + +class StudyFactoryTest { + + FixtureHelper fixtureHelper = new FixtureHelper(); + StudyFactory studyFactory = new StudyFactory(); + + static class FixedAttendanceNumberGenerator implements AttendanceNumberGenerator { + @Override + public int generate() { + return 1000; + } + } + + @Test + void 스터디_생성시_설정한_총_회차만큼_스터디회차가_생성된다() { + // given + Member mentor = fixtureHelper.createMentor(1L); + AttendanceNumberGenerator generator = new FixedAttendanceNumberGenerator(); + int totalRound = 8; + + // when + StudyV2 study = studyFactory.create( + StudyType.OFFLINE, + STUDY_TITLE, + STUDY_DESCRIPTION, + STUDY_DESCRIPTION_NOTION_LINK, + STUDY_SEMESTER, + totalRound, + DAY_OF_WEEK, + STUDY_START_TIME, + STUDY_END_TIME, + STUDY_APPLICATION_PERIOD, + STUDY_DISCORD_CHANNEL_ID, + STUDY_DISCORD_ROLE_ID, + mentor, + generator); + + // then + assertThat(study.getStudySessions()).hasSize(8); + } + + @Test + void 스터디_생성시_스터디회차는_순서대로_position이_지정되어_생성된다() { + // given + Member mentor = fixtureHelper.createMentor(1L); + AttendanceNumberGenerator generator = new FixedAttendanceNumberGenerator(); + int totalRound = 8; + + // when + StudyV2 study = studyFactory.create( + StudyType.OFFLINE, + STUDY_TITLE, + STUDY_DESCRIPTION, + STUDY_DESCRIPTION_NOTION_LINK, + STUDY_SEMESTER, + totalRound, + DAY_OF_WEEK, + STUDY_START_TIME, + STUDY_END_TIME, + STUDY_APPLICATION_PERIOD, + STUDY_DISCORD_CHANNEL_ID, + STUDY_DISCORD_ROLE_ID, + mentor, + generator); + + // then + assertThat(study.getStudySessions()) + .extracting(StudySessionV2::getPosition) + .containsExactly(1, 2, 3, 4, 5, 6, 7, 8); + } + + @Test + void 스터디_생성시_각_스터디회차에_출석번호가_생성된다() { + // given + Member mentor = fixtureHelper.createMentor(1L); + AttendanceNumberGenerator generator = new FixedAttendanceNumberGenerator(); + + // when + StudyV2 study = studyFactory.create( + StudyType.OFFLINE, + STUDY_TITLE, + STUDY_DESCRIPTION, + STUDY_DESCRIPTION_NOTION_LINK, + STUDY_SEMESTER, + TOTAL_ROUND, + DAY_OF_WEEK, + STUDY_START_TIME, + STUDY_END_TIME, + STUDY_APPLICATION_PERIOD, + STUDY_DISCORD_CHANNEL_ID, + STUDY_DISCORD_ROLE_ID, + mentor, + generator); + + // then + assertThat(study.getStudySessions()) + .extracting(StudySessionV2::getLessonAttendanceNumber) + .containsOnly(1000); + } +}