From b939e50e45efb28c5c1b96e8510b7e0eb79c9826 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Wed, 24 Dec 2025 21:30:47 +0900 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20session,=20enrollment=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/schema.sql | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 8d5a988c8b..50f5878899 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -48,3 +48,28 @@ create table delete_history ( deleted_by_id bigint, primary key (id) ); + +create table session ( + id bigint generated by default as identity, + start_at timestamp not null, + end_at timestamp not null, + cover_image_size varchar(20), + cover_image_type varchar(20), + cover_image_width int, + cover_image_height int, + policy_type varchar(20) not null, + price bigint, + state varchar(20), + capacity int not null, + created_at timestamp not null, + updated_at timestamp, + primary key (id) +); + +create table enrollment ( + id bigint generated by default as identity, + session_id bigint not null, + user_id bigint not null, + enrolled_at timestamp not null, + primary key (id) +); \ No newline at end of file From e10c3f7effef1035d89eb4863a191e279538d0f4 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 12:11:38 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20session,=20enrollment=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=88=98=EC=A0=95(type=20->=20name)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 50f5878899..68d701f95b 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -54,7 +54,7 @@ create table session ( start_at timestamp not null, end_at timestamp not null, cover_image_size varchar(20), - cover_image_type varchar(20), + cover_image_name varchar(20), cover_image_width int, cover_image_height int, policy_type varchar(20) not null, From a7517a6641b241c28707b8be48705b20b1b67e3b Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 12:12:19 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20SessionRepository=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/courses/domain/SessionRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/nextstep/courses/domain/SessionRepository.java diff --git a/src/main/java/nextstep/courses/domain/SessionRepository.java b/src/main/java/nextstep/courses/domain/SessionRepository.java new file mode 100644 index 0000000000..ebf96c5815 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/SessionRepository.java @@ -0,0 +1,7 @@ +package nextstep.courses.domain; + +public interface SessionRepository { + int save(Session session); + + Session findById(Long id); +} From c4d0b0697368d2c2a1d45dcf56c62e3a6f17fdcc Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 12:15:14 +0900 Subject: [PATCH 04/12] =?UTF-8?q?feat:=20JdbcSessionRepository=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20Jdbc=20=EC=97=B0=EA=B2=B0=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20get=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20CoverImage=20fileName=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20EnrollmentPolicy=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80(type,=20price)=20-=20Te?= =?UTF-8?q?st=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/Capacity.java | 4 ++ .../nextstep/courses/domain/CoverImage.java | 28 ++++++++-- .../courses/domain/EnrollmentPolicy.java | 2 + .../nextstep/courses/domain/Enrollments.java | 4 ++ .../courses/domain/FreeEnrollmentPolicy.java | 10 ++++ .../courses/domain/ImageDimension.java | 8 +++ .../nextstep/courses/domain/ImageSize.java | 4 ++ .../java/nextstep/courses/domain/Money.java | 4 ++ .../courses/domain/PaidEnrollmentPolicy.java | 10 ++++ .../nextstep/courses/domain/PolicyType.java | 20 +++++++ .../java/nextstep/courses/domain/Session.java | 41 ++++++++++++++ .../courses/domain/SessionDuration.java | 10 ++++ .../infrastructure/JdbcSessionRepository.java | 56 +++++++++++++++++++ .../infrastructure/SessionRepositoryTest.java | 40 +++++++++++++ 14 files changed, 236 insertions(+), 5 deletions(-) create mode 100644 src/main/java/nextstep/courses/domain/PolicyType.java create mode 100644 src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java create mode 100644 src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java diff --git a/src/main/java/nextstep/courses/domain/Capacity.java b/src/main/java/nextstep/courses/domain/Capacity.java index 66ab224c67..587cdca427 100644 --- a/src/main/java/nextstep/courses/domain/Capacity.java +++ b/src/main/java/nextstep/courses/domain/Capacity.java @@ -23,4 +23,8 @@ public void validateAvailable() { public void increase() { this.current++; } + + public int value() { + return max; + } } diff --git a/src/main/java/nextstep/courses/domain/CoverImage.java b/src/main/java/nextstep/courses/domain/CoverImage.java index e95702300f..72fcee0fca 100644 --- a/src/main/java/nextstep/courses/domain/CoverImage.java +++ b/src/main/java/nextstep/courses/domain/CoverImage.java @@ -1,17 +1,35 @@ package nextstep.courses.domain; public class CoverImage { - private ImageSize imageSize; - private ImageType imageType; - private ImageDimension imageDimension; + private final ImageSize imageSize; + private final String fileName; + private final ImageType imageType; + private final ImageDimension imageDimension; public CoverImage(int size, String fileName, int width, int height) { - this(new ImageSize(size), ImageType.fromFileName(fileName), new ImageDimension(width, height)); + this(new ImageSize(size), fileName, ImageType.fromFileName(fileName), new ImageDimension(width, height)); } - private CoverImage(ImageSize imageSize, ImageType imageType, ImageDimension imageDimension) { + private CoverImage(ImageSize imageSize, String fileName, ImageType imageType, ImageDimension imageDimension) { this.imageSize = imageSize; + this.fileName = fileName; this.imageType = imageType; this.imageDimension = imageDimension; } + + public int getImageSize() { + return imageSize.value(); + } + + public String getImageName() { + return fileName; + } + + public int getCoverImageWidth() { + return imageDimension.width(); + } + + public int getCoverImageHeight() { + return imageDimension.height(); + } } diff --git a/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java index ee8b0773e7..58eb73012d 100644 --- a/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java @@ -3,5 +3,7 @@ import nextstep.payments.domain.Payment; public interface EnrollmentPolicy { + PolicyType type(); + Long price(); void validateEnrollment(Payment payment); } diff --git a/src/main/java/nextstep/courses/domain/Enrollments.java b/src/main/java/nextstep/courses/domain/Enrollments.java index f96555260c..76eef9aa10 100644 --- a/src/main/java/nextstep/courses/domain/Enrollments.java +++ b/src/main/java/nextstep/courses/domain/Enrollments.java @@ -39,6 +39,10 @@ private boolean EnrolledCheck(Long userId) { return enrollments.stream() .anyMatch(enrollment -> enrollment.isSameUser(userId)); } + + public int getCapacity() { + return capacity.value(); + } } diff --git a/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java index 21720b9ec7..6c0ec8c89e 100644 --- a/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java @@ -3,6 +3,16 @@ import nextstep.payments.domain.Payment; public class FreeEnrollmentPolicy implements EnrollmentPolicy{ + @Override + public PolicyType type() { + return PolicyType.FREE; + } + + @Override + public Long price() { + return null; + } + @Override public void validateEnrollment(Payment payment) { // 무료강의는 검증하지 않는다 diff --git a/src/main/java/nextstep/courses/domain/ImageDimension.java b/src/main/java/nextstep/courses/domain/ImageDimension.java index 806de0874b..e6534ed320 100644 --- a/src/main/java/nextstep/courses/domain/ImageDimension.java +++ b/src/main/java/nextstep/courses/domain/ImageDimension.java @@ -27,4 +27,12 @@ private static void validateRatio(int width, int height) { throw new IllegalArgumentException(); } } + + public int width() { + return width; + } + + public int height() { + return height; + } } diff --git a/src/main/java/nextstep/courses/domain/ImageSize.java b/src/main/java/nextstep/courses/domain/ImageSize.java index b03838043b..ac59353746 100644 --- a/src/main/java/nextstep/courses/domain/ImageSize.java +++ b/src/main/java/nextstep/courses/domain/ImageSize.java @@ -26,4 +26,8 @@ public boolean equals(Object object) { public int hashCode() { return Objects.hashCode(imageSize); } + + public int value() { + return imageSize; + } } diff --git a/src/main/java/nextstep/courses/domain/Money.java b/src/main/java/nextstep/courses/domain/Money.java index bd571b378f..d4b7048952 100644 --- a/src/main/java/nextstep/courses/domain/Money.java +++ b/src/main/java/nextstep/courses/domain/Money.java @@ -13,6 +13,10 @@ public boolean isEqualTo(Money other) { return this.equals(other); } + public long value() { + return amount; + } + @Override public boolean equals(Object object) { if (this == object) return true; diff --git a/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java index 4d700fa689..9b1f25ce74 100644 --- a/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java @@ -10,6 +10,16 @@ public PaidEnrollmentPolicy(Money money) { this.money = money; } + @Override + public PolicyType type() { + return PolicyType.PAID; + } + + @Override + public Long price() { + return money.value(); + } + @Override public void validateEnrollment(Payment payment) { validatePayment(payment); diff --git a/src/main/java/nextstep/courses/domain/PolicyType.java b/src/main/java/nextstep/courses/domain/PolicyType.java new file mode 100644 index 0000000000..88d1cb8fad --- /dev/null +++ b/src/main/java/nextstep/courses/domain/PolicyType.java @@ -0,0 +1,20 @@ +package nextstep.courses.domain; + +public enum PolicyType { + FREE, + PAID; + + public static EnrollmentPolicy create(String name, Long price) { + PolicyType type = PolicyType.valueOf(name); + + if (type == FREE) { + return new FreeEnrollmentPolicy(); + } + + if (type == PAID) { + return new PaidEnrollmentPolicy(new Money(price)); + } + + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/Session.java index 99f96191df..e5af4407a4 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/Session.java @@ -1,6 +1,7 @@ package nextstep.courses.domain; import nextstep.payments.domain.Payment; +import org.springframework.cglib.core.Local; import java.time.LocalDateTime; @@ -45,4 +46,44 @@ public Enrollment enroll(Long userId, Payment payment) { public long getId() { return id; } + + public LocalDateTime getStartDate() { + return sessionDuration.getStartDate(); + } + + public LocalDateTime getEndDate() { + return sessionDuration.getEndDate(); + } + + public int getCoverImageSize() { + return coverImage.getImageSize(); + } + + public String getCoverImageName() { + return coverImage.getImageName(); + } + + public int getCoverImageWidth() { + return coverImage.getCoverImageWidth(); + } + + public int getCoverImageHeight() { + return coverImage.getCoverImageHeight(); + } + + public String getPolicyType() { + return enrollmentPolicy.type().name(); + } + + public long getPrice() { + return enrollmentPolicy.price(); + } + + public String getState() { + return sessionState.name(); + } + + public int getCapacity() { + return enrollments.getCapacity(); + } } diff --git a/src/main/java/nextstep/courses/domain/SessionDuration.java b/src/main/java/nextstep/courses/domain/SessionDuration.java index 54d7714a2c..df4d2210e4 100644 --- a/src/main/java/nextstep/courses/domain/SessionDuration.java +++ b/src/main/java/nextstep/courses/domain/SessionDuration.java @@ -1,5 +1,7 @@ package nextstep.courses.domain; +import org.springframework.cglib.core.Local; + import java.time.LocalDateTime; public class SessionDuration { @@ -17,4 +19,12 @@ private void validateDate(LocalDateTime startDate, LocalDateTime endDate) { throw new IllegalArgumentException(); } } + + public LocalDateTime getStartDate() { + return startDate; + } + + public LocalDateTime getEndDate() { + return endDate; + } } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java new file mode 100644 index 0000000000..d6189d91a9 --- /dev/null +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -0,0 +1,56 @@ +package nextstep.courses.infrastructure; + +import nextstep.courses.domain.*; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.time.LocalDateTime; + +@Repository("sessionRepository") +public class JdbcSessionRepository implements SessionRepository { + private JdbcOperations jdbcTemplate; + + public JdbcSessionRepository(JdbcOperations jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int save(Session session) { + String sql = "insert into session (id, start_at, end_at, cover_image_size, cover_image_name, cover_image_width, cover_image_height, policy_type," + + "price, state, capacity, created_at, updated_at) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + return jdbcTemplate.update(sql, session.getId(), session.getStartDate(), session.getEndDate(), session.getCoverImageSize(), session.getCoverImageName() + , session.getCoverImageWidth(), session.getCoverImageHeight(), session.getPolicyType(), session.getPrice(), session.getState(), session.getCapacity() + , LocalDateTime.now(), LocalDateTime.now()); + } + + @Override + public Session findById(Long id) { + String sql = "SELECT id, start_at, end_at, cover_image_size, cover_image_name, " + + "cover_image_width, cover_image_height, policy_type, price, state, capacity " + + "FROM session WHERE id = ?"; + + RowMapper rowMapper = (rs, rowNum) -> new Session( + rs.getLong("id"), + toLocalDateTime(rs.getTimestamp("start_at")), + toLocalDateTime(rs.getTimestamp("end_at")), + rs.getInt("cover_image_size"), + rs.getString("cover_image_name"), + rs.getInt("cover_image_width"), + rs.getInt("cover_image_height"), + PolicyType.create(rs.getString("policy_type"), rs.getLong("price")), + SessionState.valueOf(rs.getString("state")), + new Enrollments(new Capacity(rs.getInt("capacity"))) + ); + + return jdbcTemplate.queryForObject(sql, rowMapper, id); + } + + private LocalDateTime toLocalDateTime(Timestamp timestamp) { + if (timestamp == null) { + return null; + } + return timestamp.toLocalDateTime(); + } +} diff --git a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java new file mode 100644 index 0000000000..f19a66ad26 --- /dev/null +++ b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java @@ -0,0 +1,40 @@ +package nextstep.courses.infrastructure; + +import nextstep.courses.domain.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.jdbc.core.JdbcTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +@JdbcTest +public class SessionRepositoryTest { + private static final Logger LOGGER = LoggerFactory.getLogger(SessionRepository.class); + + @Autowired + private JdbcTemplate jdbcTemplate; + + private SessionRepository sessionRepository; + + @BeforeEach + void setUp() { + sessionRepository = new JdbcSessionRepository(jdbcTemplate); + } + + @Test + void crud() { + Session session = SessionTestBuilder.aSession() + .withCapacity(10) + .withPaidEnrollment(new Money(5000L)) + .build(); + int count = sessionRepository.save(session); + assertThat(count).isEqualTo(1); + Session savedSession = sessionRepository.findById(1L); + assertThat(session.getCoverImageName()).isEqualTo(savedSession.getCoverImageName()); + LOGGER.debug("Session: {}", savedSession); + } +} From ae4c83f6e8eca49a75b1f9f639db3ba94d77cfbb Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 17:42:46 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20Session=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20toString()=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/courses/domain/Session.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/Session.java index e5af4407a4..9c5964554a 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/Session.java @@ -86,4 +86,16 @@ public String getState() { public int getCapacity() { return enrollments.getCapacity(); } + + @Override + public String toString() { + return "Session{" + + "id=" + id + + ", sessionDuration=" + sessionDuration + + ", coverImage=" + coverImage + + ", enrollmentPolicy=" + enrollmentPolicy + + ", sessionState=" + sessionState + + ", enrollments=" + enrollments + + '}'; + } } From 6745df788744718d5ca4769e9750cccdbf9ed5e9 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 17:43:23 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20EnrollmentRepository=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20-=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20-=20=EA=B5=AC=ED=98=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=83=9D=EC=84=B1=20-=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/courses/domain/Enrollment.java | 19 +++++++- .../courses/domain/EnrollmentRepository.java | 8 ++++ .../JdbcEnrollmentRepository.java | 45 +++++++++++++++++++ .../EnrollmentRepositoryTest.java | 45 +++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/main/java/nextstep/courses/domain/EnrollmentRepository.java create mode 100644 src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java create mode 100644 src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java diff --git a/src/main/java/nextstep/courses/domain/Enrollment.java b/src/main/java/nextstep/courses/domain/Enrollment.java index 9cb613487f..6dae5ff1cc 100644 --- a/src/main/java/nextstep/courses/domain/Enrollment.java +++ b/src/main/java/nextstep/courses/domain/Enrollment.java @@ -8,12 +8,29 @@ public class Enrollment { private final LocalDateTime enrollmentDate; public Enrollment(Long sessionId, Long userId) { + this(sessionId, userId, LocalDateTime.now()); + } + + public Enrollment(Long sessionId, Long userId, LocalDateTime enrollmentDate) { this.sessionId = sessionId; this.userId = userId; - this.enrollmentDate = LocalDateTime.now(); + this.enrollmentDate = enrollmentDate; } public boolean isSameUser(Long userId) { return this.userId.equals(userId); } + + public Long getSessionId() { + return sessionId; + } + + + public Long getUserId() { + return userId; + } + + public LocalDateTime getEnrollmentDate() { + return enrollmentDate; + } } diff --git a/src/main/java/nextstep/courses/domain/EnrollmentRepository.java b/src/main/java/nextstep/courses/domain/EnrollmentRepository.java new file mode 100644 index 0000000000..52485b97a6 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/EnrollmentRepository.java @@ -0,0 +1,8 @@ +package nextstep.courses.domain; + +import java.util.List; + +public interface EnrollmentRepository { + int save(Enrollment enrollment); + List findBySessionId(Long sessionId); +} diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java new file mode 100644 index 0000000000..8c1b95c10d --- /dev/null +++ b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java @@ -0,0 +1,45 @@ +package nextstep.courses.infrastructure; + +import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.EnrollmentRepository; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; + +@Repository +public class JdbcEnrollmentRepository implements EnrollmentRepository { + private JdbcOperations jdbcTemplate; + + public JdbcEnrollmentRepository(JdbcOperations jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int save(Enrollment enrollment) { + String sql = "INSERT INTO enrollment (session_id, user_id, enrolled_at) VALUES (?, ?, ?)"; + return jdbcTemplate.update(sql, enrollment.getSessionId(), enrollment.getUserId(), enrollment.getEnrollmentDate()); + } + + @Override + public List findBySessionId(Long sessionId) { + String sql = "SELECT session_id, user_id, enrolled_at FROM enrollment WHERE session_id = ?"; + + return jdbcTemplate.query(sql, (rs, rowNum) -> + new Enrollment( + rs.getLong("session_id"), + rs.getLong("user_id"), + toLocalDateTime(rs.getTimestamp("enrolled_at")) + ), sessionId + ); + } + + private LocalDateTime toLocalDateTime(Timestamp timestamp) { + if (timestamp == null) { + return null; + } + return timestamp.toLocalDateTime(); + } +} diff --git a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java new file mode 100644 index 0000000000..bbe22696c3 --- /dev/null +++ b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java @@ -0,0 +1,45 @@ +package nextstep.courses.infrastructure; + +import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.EnrollmentRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +@JdbcTest +public class EnrollmentRepositoryTest { + private static final Logger LOGGER = LoggerFactory.getLogger(EnrollmentRepository.class); + + @Autowired + private JdbcTemplate jdbcTemplate; + + private EnrollmentRepository enrollmentRepository; + + @BeforeEach + void setUp() { + enrollmentRepository = new JdbcEnrollmentRepository(jdbcTemplate); + } + + @Test + void crud() { + Enrollment enrollment = new Enrollment(1L, 100L, LocalDateTime.now()); + enrollmentRepository.save(enrollment); + + List result = enrollmentRepository.findBySessionId(1L); + assertThat(result).hasSize(1); + + Enrollment saved = result.get(0); + assertThat(saved.getSessionId()).isEqualTo(1L); + assertThat(saved.getUserId()).isEqualTo(100L); + } +} From 8a0e62580e2b09ad2cf2234048800b1971d5fa76 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 18:00:26 +0900 Subject: [PATCH 07/12] =?UTF-8?q?style:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20-=20domain/repository/service=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/courses/domain/Session.java | 1 - .../nextstep/courses/infrastructure/JdbcCourseRepository.java | 2 +- .../courses/infrastructure/JdbcEnrollmentRepository.java | 2 +- .../courses/infrastructure/JdbcSessionRepository.java | 1 + .../courses/{domain => repository}/CourseRepository.java | 4 +++- .../courses/{domain => repository}/EnrollmentRepository.java | 4 +++- .../courses/{domain => repository}/SessionRepository.java | 4 +++- .../nextstep/courses/infrastructure/CourseRepositoryTest.java | 2 +- .../courses/infrastructure/EnrollmentRepositoryTest.java | 3 +-- .../courses/infrastructure/SessionRepositoryTest.java | 1 + 10 files changed, 15 insertions(+), 9 deletions(-) rename src/main/java/nextstep/courses/{domain => repository}/CourseRepository.java (56%) rename src/main/java/nextstep/courses/{domain => repository}/EnrollmentRepository.java (66%) rename src/main/java/nextstep/courses/{domain => repository}/SessionRepository.java (56%) diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/Session.java index 9c5964554a..0377fc71cd 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/Session.java @@ -1,7 +1,6 @@ package nextstep.courses.domain; import nextstep.payments.domain.Payment; -import org.springframework.cglib.core.Local; import java.time.LocalDateTime; diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java index 44fedde4c3..590d4117f3 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java @@ -1,7 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.Course; -import nextstep.courses.domain.CourseRepository; +import nextstep.courses.repository.CourseRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java index 8c1b95c10d..b516c02eb7 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java @@ -1,7 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.Enrollment; -import nextstep.courses.domain.EnrollmentRepository; +import nextstep.courses.repository.EnrollmentRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.stereotype.Repository; diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java index d6189d91a9..70c28fe378 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -1,6 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.*; +import nextstep.courses.repository.SessionRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; diff --git a/src/main/java/nextstep/courses/domain/CourseRepository.java b/src/main/java/nextstep/courses/repository/CourseRepository.java similarity index 56% rename from src/main/java/nextstep/courses/domain/CourseRepository.java rename to src/main/java/nextstep/courses/repository/CourseRepository.java index 6aaeb638d1..0680a57a23 100644 --- a/src/main/java/nextstep/courses/domain/CourseRepository.java +++ b/src/main/java/nextstep/courses/repository/CourseRepository.java @@ -1,4 +1,6 @@ -package nextstep.courses.domain; +package nextstep.courses.repository; + +import nextstep.courses.domain.Course; public interface CourseRepository { int save(Course course); diff --git a/src/main/java/nextstep/courses/domain/EnrollmentRepository.java b/src/main/java/nextstep/courses/repository/EnrollmentRepository.java similarity index 66% rename from src/main/java/nextstep/courses/domain/EnrollmentRepository.java rename to src/main/java/nextstep/courses/repository/EnrollmentRepository.java index 52485b97a6..34ae8724af 100644 --- a/src/main/java/nextstep/courses/domain/EnrollmentRepository.java +++ b/src/main/java/nextstep/courses/repository/EnrollmentRepository.java @@ -1,4 +1,6 @@ -package nextstep.courses.domain; +package nextstep.courses.repository; + +import nextstep.courses.domain.Enrollment; import java.util.List; diff --git a/src/main/java/nextstep/courses/domain/SessionRepository.java b/src/main/java/nextstep/courses/repository/SessionRepository.java similarity index 56% rename from src/main/java/nextstep/courses/domain/SessionRepository.java rename to src/main/java/nextstep/courses/repository/SessionRepository.java index ebf96c5815..bdea6c8272 100644 --- a/src/main/java/nextstep/courses/domain/SessionRepository.java +++ b/src/main/java/nextstep/courses/repository/SessionRepository.java @@ -1,4 +1,6 @@ -package nextstep.courses.domain; +package nextstep.courses.repository; + +import nextstep.courses.domain.Session; public interface SessionRepository { int save(Session session); diff --git a/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java index f087fc0ad2..885346974e 100644 --- a/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java @@ -1,7 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.Course; -import nextstep.courses.domain.CourseRepository; +import nextstep.courses.repository.CourseRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; diff --git a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java index bbe22696c3..a4dcb0fe15 100644 --- a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java @@ -1,8 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.Enrollment; -import nextstep.courses.domain.EnrollmentRepository; -import org.assertj.core.api.Assertions; +import nextstep.courses.repository.EnrollmentRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; diff --git a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java index f19a66ad26..ece9400009 100644 --- a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java @@ -1,6 +1,7 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.*; +import nextstep.courses.repository.SessionRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; From b4b1f5bab6bfb101c57bb2ca950c5b6561742276 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 25 Dec 2025 18:13:12 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20SessionService=20-=20SessionServi?= =?UTF-8?q?ce=20=EA=B5=AC=ED=98=84(repository=20=EB=AC=B6=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/service/SessionService.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/nextstep/courses/service/SessionService.java diff --git a/src/main/java/nextstep/courses/service/SessionService.java b/src/main/java/nextstep/courses/service/SessionService.java new file mode 100644 index 0000000000..2797530a3e --- /dev/null +++ b/src/main/java/nextstep/courses/service/SessionService.java @@ -0,0 +1,28 @@ +package nextstep.courses.service; + +import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.Session; +import nextstep.courses.repository.EnrollmentRepository; +import nextstep.courses.repository.SessionRepository; +import nextstep.payments.domain.Payment; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class SessionService { + + private final SessionRepository sessionRepository; + private final EnrollmentRepository enrollmentRepository; + + public SessionService(SessionRepository sessionRepository, EnrollmentRepository enrollmentRepository) { + this.sessionRepository = sessionRepository; + this.enrollmentRepository = enrollmentRepository; + } + + public void enroll(Long sessionId, Long userId, Payment payment) { + Session session = sessionRepository.findById(sessionId); + Enrollment enrollment = session.enroll(userId, payment); + enrollmentRepository.save(enrollment); + } +} From df99e8a976817751508b196bb19cc24d545a66f6 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 28 Dec 2025 16:19:44 +0900 Subject: [PATCH 09/12] =?UTF-8?q?refactor:=20EnrollmentPolicyFactory=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20-=20PolicyType=EC=9D=98=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/EnrollmentPolicyFactory.java | 20 +++++++++++++++++++ .../nextstep/courses/domain/PolicyType.java | 16 +-------------- .../infrastructure/JdbcSessionRepository.java | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java diff --git a/src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java b/src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java new file mode 100644 index 0000000000..6953d77f95 --- /dev/null +++ b/src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java @@ -0,0 +1,20 @@ +package nextstep.courses.domain; + +import static nextstep.courses.domain.PolicyType.FREE; +import static nextstep.courses.domain.PolicyType.PAID; + +public class EnrollmentPolicyFactory { + public static EnrollmentPolicy create(String name, Long price) { + PolicyType type = PolicyType.valueOf(name); + + if (type == FREE) { + return new FreeEnrollmentPolicy(); + } + + if (type == PAID) { + return new PaidEnrollmentPolicy(new Money(price)); + } + + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/nextstep/courses/domain/PolicyType.java b/src/main/java/nextstep/courses/domain/PolicyType.java index 88d1cb8fad..1f96756c53 100644 --- a/src/main/java/nextstep/courses/domain/PolicyType.java +++ b/src/main/java/nextstep/courses/domain/PolicyType.java @@ -2,19 +2,5 @@ public enum PolicyType { FREE, - PAID; - - public static EnrollmentPolicy create(String name, Long price) { - PolicyType type = PolicyType.valueOf(name); - - if (type == FREE) { - return new FreeEnrollmentPolicy(); - } - - if (type == PAID) { - return new PaidEnrollmentPolicy(new Money(price)); - } - - throw new IllegalArgumentException(); - } + PAID } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java index 70c28fe378..d6f2dd78e9 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -40,7 +40,7 @@ public Session findById(Long id) { rs.getString("cover_image_name"), rs.getInt("cover_image_width"), rs.getInt("cover_image_height"), - PolicyType.create(rs.getString("policy_type"), rs.getLong("price")), + EnrollmentPolicyFactory.create(rs.getString("policy_type"), rs.getLong("price")), SessionState.valueOf(rs.getString("state")), new Enrollments(new Capacity(rs.getInt("capacity"))) ); From 89184d9fd282b909a1b03c9811c659efbd27ba6c Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 28 Dec 2025 16:40:38 +0900 Subject: [PATCH 10/12] =?UTF-8?q?refactor:=20Enrollment=EC=9D=98=20add()?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?-=20Enrollment=20=EB=B0=98=ED=99=98=EC=9D=84=20=EA=B3=A0?= =?UTF-8?q?=EB=A0=A4=ED=95=B4=EC=84=9C=20enroll()=EB=A1=9C=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 --- src/main/java/nextstep/courses/domain/Enrollments.java | 2 +- src/main/java/nextstep/courses/domain/Session.java | 2 +- src/test/java/nextstep/courses/domain/EnrollmentsTest.java | 4 ++-- src/test/java/nextstep/courses/domain/SessionTestBuilder.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/nextstep/courses/domain/Enrollments.java b/src/main/java/nextstep/courses/domain/Enrollments.java index 76eef9aa10..da313a5350 100644 --- a/src/main/java/nextstep/courses/domain/Enrollments.java +++ b/src/main/java/nextstep/courses/domain/Enrollments.java @@ -25,7 +25,7 @@ public void validateEnroll(Long userId) { capacity.validateAvailable(); } - public Enrollment add(Long sessionId, Long userId) { + public Enrollment enroll(Long sessionId, Long userId) { validateEnroll(userId); Enrollment enrollment = new Enrollment(sessionId, userId); diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/Session.java index 0377fc71cd..a0d7de8e0b 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/Session.java @@ -39,7 +39,7 @@ public Session(long id, SessionDuration sessionDuration, CoverImage coverImage public Enrollment enroll(Long userId, Payment payment) { sessionState.validateEnroll(); enrollmentPolicy.validateEnrollment(payment); - return enrollments.add(this.id, userId); + return enrollments.enroll(this.id, userId); } public long getId() { diff --git a/src/test/java/nextstep/courses/domain/EnrollmentsTest.java b/src/test/java/nextstep/courses/domain/EnrollmentsTest.java index 6b8f42fee8..6ff5ab0037 100644 --- a/src/test/java/nextstep/courses/domain/EnrollmentsTest.java +++ b/src/test/java/nextstep/courses/domain/EnrollmentsTest.java @@ -7,9 +7,9 @@ class EnrollmentsTest { @Test void Enrollments_sameUserId() { Enrollments enrollments = new Enrollments(new Capacity(2)); - enrollments.add(1L, 10L); + enrollments.enroll(1L, 10L); - assertThatThrownBy(() -> enrollments.add(1L, 10L)) + assertThatThrownBy(() -> enrollments.enroll(1L, 10L)) .isInstanceOf(IllegalStateException.class); } } \ No newline at end of file diff --git a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java index cc9da4987e..df70e2c8e8 100644 --- a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java +++ b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java @@ -40,7 +40,7 @@ public SessionTestBuilder withCapacity(int max) { public SessionTestBuilder withFullEnrollments(int count) { for (int i = 0; i < count; i++) { - enrollments.add(this.id, (long) i + 1); + enrollments.enroll(this.id, (long) i + 1); } return this; } From 836d0d5bcdb6e8bd01ab12d8d4ad2da68100e99f Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 28 Dec 2025 16:58:18 +0900 Subject: [PATCH 11/12] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20-=20session/enroll?= =?UTF-8?q?ment=EB=A1=9C=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/courses/domain/Course.java | 3 +++ .../nextstep/courses/domain/{ => enrollment}/Capacity.java | 2 +- .../courses/domain/{ => enrollment}/Enrollment.java | 2 +- .../courses/domain/{ => enrollment}/EnrollmentPolicy.java | 2 +- .../domain/{ => enrollment}/EnrollmentPolicyFactory.java | 6 +++--- .../courses/domain/{ => enrollment}/Enrollments.java | 2 +- .../domain/{ => enrollment}/FreeEnrollmentPolicy.java | 2 +- .../nextstep/courses/domain/{ => enrollment}/Money.java | 2 +- .../domain/{ => enrollment}/PaidEnrollmentPolicy.java | 2 +- .../courses/domain/{ => enrollment}/PolicyType.java | 2 +- .../java/nextstep/courses/domain/{ => session}/Session.java | 6 +++++- .../courses/domain/{ => session}/SessionDuration.java | 4 +--- .../nextstep/courses/domain/{ => session}/SessionState.java | 2 +- .../nextstep/courses/domain/{ => session}/Sessions.java | 2 +- .../courses/domain/{ => session/cover}/CoverImage.java | 2 +- .../courses/domain/{ => session/cover}/ImageDimension.java | 2 +- .../courses/domain/{ => session/cover}/ImageSize.java | 2 +- .../courses/domain/{ => session/cover}/ImageType.java | 2 +- .../courses/infrastructure/JdbcEnrollmentRepository.java | 2 +- .../courses/infrastructure/JdbcSessionRepository.java | 6 +++++- .../nextstep/courses/repository/EnrollmentRepository.java | 2 +- .../java/nextstep/courses/repository/SessionRepository.java | 2 +- src/main/java/nextstep/courses/service/SessionService.java | 4 ++-- src/main/java/nextstep/payments/domain/Payment.java | 2 +- src/test/java/nextstep/courses/domain/CapacityTest.java | 1 + src/test/java/nextstep/courses/domain/EnrollmentsTest.java | 2 ++ .../java/nextstep/courses/domain/ImageDimensionTest.java | 1 + src/test/java/nextstep/courses/domain/ImageSizeTest.java | 3 ++- src/test/java/nextstep/courses/domain/ImageTypeTest.java | 1 + src/test/java/nextstep/courses/domain/MoneyTest.java | 2 +- .../nextstep/courses/domain/PaidEnrollmentPolicyTest.java | 2 ++ .../java/nextstep/courses/domain/PaymentTestBuilder.java | 2 ++ .../java/nextstep/courses/domain/SessionDurationTest.java | 1 + src/test/java/nextstep/courses/domain/SessionStateTest.java | 1 + src/test/java/nextstep/courses/domain/SessionTest.java | 2 ++ .../java/nextstep/courses/domain/SessionTestBuilder.java | 6 ++++++ .../courses/infrastructure/EnrollmentRepositoryTest.java | 2 +- .../courses/infrastructure/SessionRepositoryTest.java | 2 ++ 38 files changed, 62 insertions(+), 31 deletions(-) rename src/main/java/nextstep/courses/domain/{ => enrollment}/Capacity.java (91%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/Enrollment.java (94%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/EnrollmentPolicy.java (79%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/EnrollmentPolicyFactory.java (69%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/Enrollments.java (96%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/FreeEnrollmentPolicy.java (89%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/Money.java (93%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/PaidEnrollmentPolicy.java (93%) rename src/main/java/nextstep/courses/domain/{ => enrollment}/PolicyType.java (51%) rename src/main/java/nextstep/courses/domain/{ => session}/Session.java (91%) rename src/main/java/nextstep/courses/domain/{ => session}/SessionDuration.java (89%) rename src/main/java/nextstep/courses/domain/{ => session}/SessionState.java (82%) rename src/main/java/nextstep/courses/domain/{ => session}/Sessions.java (90%) rename src/main/java/nextstep/courses/domain/{ => session/cover}/CoverImage.java (95%) rename src/main/java/nextstep/courses/domain/{ => session/cover}/ImageDimension.java (95%) rename src/main/java/nextstep/courses/domain/{ => session/cover}/ImageSize.java (94%) rename src/main/java/nextstep/courses/domain/{ => session/cover}/ImageType.java (95%) diff --git a/src/main/java/nextstep/courses/domain/Course.java b/src/main/java/nextstep/courses/domain/Course.java index f664a63a82..26921d8b5a 100644 --- a/src/main/java/nextstep/courses/domain/Course.java +++ b/src/main/java/nextstep/courses/domain/Course.java @@ -1,5 +1,8 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.Sessions; + import java.time.LocalDateTime; public class Course { diff --git a/src/main/java/nextstep/courses/domain/Capacity.java b/src/main/java/nextstep/courses/domain/enrollment/Capacity.java similarity index 91% rename from src/main/java/nextstep/courses/domain/Capacity.java rename to src/main/java/nextstep/courses/domain/enrollment/Capacity.java index 587cdca427..40328e7425 100644 --- a/src/main/java/nextstep/courses/domain/Capacity.java +++ b/src/main/java/nextstep/courses/domain/enrollment/Capacity.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; public class Capacity { diff --git a/src/main/java/nextstep/courses/domain/Enrollment.java b/src/main/java/nextstep/courses/domain/enrollment/Enrollment.java similarity index 94% rename from src/main/java/nextstep/courses/domain/Enrollment.java rename to src/main/java/nextstep/courses/domain/enrollment/Enrollment.java index 6dae5ff1cc..79edad7a58 100644 --- a/src/main/java/nextstep/courses/domain/Enrollment.java +++ b/src/main/java/nextstep/courses/domain/enrollment/Enrollment.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import java.time.LocalDateTime; diff --git a/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicy.java similarity index 79% rename from src/main/java/nextstep/courses/domain/EnrollmentPolicy.java rename to src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicy.java index 58eb73012d..2392a505ea 100644 --- a/src/main/java/nextstep/courses/domain/EnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicy.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import nextstep.payments.domain.Payment; diff --git a/src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java b/src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicyFactory.java similarity index 69% rename from src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java rename to src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicyFactory.java index 6953d77f95..3a669fdef6 100644 --- a/src/main/java/nextstep/courses/domain/EnrollmentPolicyFactory.java +++ b/src/main/java/nextstep/courses/domain/enrollment/EnrollmentPolicyFactory.java @@ -1,7 +1,7 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; -import static nextstep.courses.domain.PolicyType.FREE; -import static nextstep.courses.domain.PolicyType.PAID; +import static nextstep.courses.domain.enrollment.PolicyType.FREE; +import static nextstep.courses.domain.enrollment.PolicyType.PAID; public class EnrollmentPolicyFactory { public static EnrollmentPolicy create(String name, Long price) { diff --git a/src/main/java/nextstep/courses/domain/Enrollments.java b/src/main/java/nextstep/courses/domain/enrollment/Enrollments.java similarity index 96% rename from src/main/java/nextstep/courses/domain/Enrollments.java rename to src/main/java/nextstep/courses/domain/enrollment/Enrollments.java index da313a5350..904c732405 100644 --- a/src/main/java/nextstep/courses/domain/Enrollments.java +++ b/src/main/java/nextstep/courses/domain/enrollment/Enrollments.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/enrollment/FreeEnrollmentPolicy.java similarity index 89% rename from src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java rename to src/main/java/nextstep/courses/domain/enrollment/FreeEnrollmentPolicy.java index 6c0ec8c89e..64d902c1c4 100644 --- a/src/main/java/nextstep/courses/domain/FreeEnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/enrollment/FreeEnrollmentPolicy.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import nextstep.payments.domain.Payment; diff --git a/src/main/java/nextstep/courses/domain/Money.java b/src/main/java/nextstep/courses/domain/enrollment/Money.java similarity index 93% rename from src/main/java/nextstep/courses/domain/Money.java rename to src/main/java/nextstep/courses/domain/enrollment/Money.java index d4b7048952..33dd6087a1 100644 --- a/src/main/java/nextstep/courses/domain/Money.java +++ b/src/main/java/nextstep/courses/domain/enrollment/Money.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import java.util.Objects; diff --git a/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java b/src/main/java/nextstep/courses/domain/enrollment/PaidEnrollmentPolicy.java similarity index 93% rename from src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java rename to src/main/java/nextstep/courses/domain/enrollment/PaidEnrollmentPolicy.java index 9b1f25ce74..8f0e2aa0e4 100644 --- a/src/main/java/nextstep/courses/domain/PaidEnrollmentPolicy.java +++ b/src/main/java/nextstep/courses/domain/enrollment/PaidEnrollmentPolicy.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; import nextstep.payments.domain.Payment; diff --git a/src/main/java/nextstep/courses/domain/PolicyType.java b/src/main/java/nextstep/courses/domain/enrollment/PolicyType.java similarity index 51% rename from src/main/java/nextstep/courses/domain/PolicyType.java rename to src/main/java/nextstep/courses/domain/enrollment/PolicyType.java index 1f96756c53..130443cf96 100644 --- a/src/main/java/nextstep/courses/domain/PolicyType.java +++ b/src/main/java/nextstep/courses/domain/enrollment/PolicyType.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.enrollment; public enum PolicyType { FREE, diff --git a/src/main/java/nextstep/courses/domain/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java similarity index 91% rename from src/main/java/nextstep/courses/domain/Session.java rename to src/main/java/nextstep/courses/domain/session/Session.java index a0d7de8e0b..3fe60a25c5 100644 --- a/src/main/java/nextstep/courses/domain/Session.java +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -1,5 +1,9 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session; +import nextstep.courses.domain.enrollment.Enrollment; +import nextstep.courses.domain.enrollment.EnrollmentPolicy; +import nextstep.courses.domain.enrollment.Enrollments; +import nextstep.courses.domain.session.cover.CoverImage; import nextstep.payments.domain.Payment; import java.time.LocalDateTime; diff --git a/src/main/java/nextstep/courses/domain/SessionDuration.java b/src/main/java/nextstep/courses/domain/session/SessionDuration.java similarity index 89% rename from src/main/java/nextstep/courses/domain/SessionDuration.java rename to src/main/java/nextstep/courses/domain/session/SessionDuration.java index df4d2210e4..52dca15785 100644 --- a/src/main/java/nextstep/courses/domain/SessionDuration.java +++ b/src/main/java/nextstep/courses/domain/session/SessionDuration.java @@ -1,6 +1,4 @@ -package nextstep.courses.domain; - -import org.springframework.cglib.core.Local; +package nextstep.courses.domain.session; import java.time.LocalDateTime; diff --git a/src/main/java/nextstep/courses/domain/SessionState.java b/src/main/java/nextstep/courses/domain/session/SessionState.java similarity index 82% rename from src/main/java/nextstep/courses/domain/SessionState.java rename to src/main/java/nextstep/courses/domain/session/SessionState.java index e087309d58..a7d1100fa8 100644 --- a/src/main/java/nextstep/courses/domain/SessionState.java +++ b/src/main/java/nextstep/courses/domain/session/SessionState.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session; public enum SessionState { READY, diff --git a/src/main/java/nextstep/courses/domain/Sessions.java b/src/main/java/nextstep/courses/domain/session/Sessions.java similarity index 90% rename from src/main/java/nextstep/courses/domain/Sessions.java rename to src/main/java/nextstep/courses/domain/session/Sessions.java index f8c04a7741..108159c2b6 100644 --- a/src/main/java/nextstep/courses/domain/Sessions.java +++ b/src/main/java/nextstep/courses/domain/session/Sessions.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nextstep/courses/domain/CoverImage.java b/src/main/java/nextstep/courses/domain/session/cover/CoverImage.java similarity index 95% rename from src/main/java/nextstep/courses/domain/CoverImage.java rename to src/main/java/nextstep/courses/domain/session/cover/CoverImage.java index 72fcee0fca..c16060eaef 100644 --- a/src/main/java/nextstep/courses/domain/CoverImage.java +++ b/src/main/java/nextstep/courses/domain/session/cover/CoverImage.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session.cover; public class CoverImage { private final ImageSize imageSize; diff --git a/src/main/java/nextstep/courses/domain/ImageDimension.java b/src/main/java/nextstep/courses/domain/session/cover/ImageDimension.java similarity index 95% rename from src/main/java/nextstep/courses/domain/ImageDimension.java rename to src/main/java/nextstep/courses/domain/session/cover/ImageDimension.java index e6534ed320..276a7d43c3 100644 --- a/src/main/java/nextstep/courses/domain/ImageDimension.java +++ b/src/main/java/nextstep/courses/domain/session/cover/ImageDimension.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session.cover; public class ImageDimension { diff --git a/src/main/java/nextstep/courses/domain/ImageSize.java b/src/main/java/nextstep/courses/domain/session/cover/ImageSize.java similarity index 94% rename from src/main/java/nextstep/courses/domain/ImageSize.java rename to src/main/java/nextstep/courses/domain/session/cover/ImageSize.java index ac59353746..32bd4a15a8 100644 --- a/src/main/java/nextstep/courses/domain/ImageSize.java +++ b/src/main/java/nextstep/courses/domain/session/cover/ImageSize.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session.cover; import java.util.Objects; diff --git a/src/main/java/nextstep/courses/domain/ImageType.java b/src/main/java/nextstep/courses/domain/session/cover/ImageType.java similarity index 95% rename from src/main/java/nextstep/courses/domain/ImageType.java rename to src/main/java/nextstep/courses/domain/session/cover/ImageType.java index acaac0063f..2fc7ac181d 100644 --- a/src/main/java/nextstep/courses/domain/ImageType.java +++ b/src/main/java/nextstep/courses/domain/session/cover/ImageType.java @@ -1,4 +1,4 @@ -package nextstep.courses.domain; +package nextstep.courses.domain.session.cover; import java.util.Arrays; diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java index b516c02eb7..da4571143e 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcEnrollmentRepository.java @@ -1,6 +1,6 @@ package nextstep.courses.infrastructure; -import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.enrollment.Enrollment; import nextstep.courses.repository.EnrollmentRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.stereotype.Repository; diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java index d6f2dd78e9..aed1cb9378 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -1,6 +1,10 @@ package nextstep.courses.infrastructure; -import nextstep.courses.domain.*; +import nextstep.courses.domain.enrollment.Capacity; +import nextstep.courses.domain.enrollment.EnrollmentPolicyFactory; +import nextstep.courses.domain.enrollment.Enrollments; +import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.SessionState; import nextstep.courses.repository.SessionRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; diff --git a/src/main/java/nextstep/courses/repository/EnrollmentRepository.java b/src/main/java/nextstep/courses/repository/EnrollmentRepository.java index 34ae8724af..186b6be856 100644 --- a/src/main/java/nextstep/courses/repository/EnrollmentRepository.java +++ b/src/main/java/nextstep/courses/repository/EnrollmentRepository.java @@ -1,6 +1,6 @@ package nextstep.courses.repository; -import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.enrollment.Enrollment; import java.util.List; diff --git a/src/main/java/nextstep/courses/repository/SessionRepository.java b/src/main/java/nextstep/courses/repository/SessionRepository.java index bdea6c8272..98ca1a2d27 100644 --- a/src/main/java/nextstep/courses/repository/SessionRepository.java +++ b/src/main/java/nextstep/courses/repository/SessionRepository.java @@ -1,6 +1,6 @@ package nextstep.courses.repository; -import nextstep.courses.domain.Session; +import nextstep.courses.domain.session.Session; public interface SessionRepository { int save(Session session); diff --git a/src/main/java/nextstep/courses/service/SessionService.java b/src/main/java/nextstep/courses/service/SessionService.java index 2797530a3e..ab41766893 100644 --- a/src/main/java/nextstep/courses/service/SessionService.java +++ b/src/main/java/nextstep/courses/service/SessionService.java @@ -1,7 +1,7 @@ package nextstep.courses.service; -import nextstep.courses.domain.Enrollment; -import nextstep.courses.domain.Session; +import nextstep.courses.domain.enrollment.Enrollment; +import nextstep.courses.domain.session.Session; import nextstep.courses.repository.EnrollmentRepository; import nextstep.courses.repository.SessionRepository; import nextstep.payments.domain.Payment; diff --git a/src/main/java/nextstep/payments/domain/Payment.java b/src/main/java/nextstep/payments/domain/Payment.java index 6d4c2b720c..da120d6f75 100644 --- a/src/main/java/nextstep/payments/domain/Payment.java +++ b/src/main/java/nextstep/payments/domain/Payment.java @@ -1,6 +1,6 @@ package nextstep.payments.domain; -import nextstep.courses.domain.Money; +import nextstep.courses.domain.enrollment.Money; import java.time.LocalDateTime; diff --git a/src/test/java/nextstep/courses/domain/CapacityTest.java b/src/test/java/nextstep/courses/domain/CapacityTest.java index 9a72a4879e..9d6a98db3d 100644 --- a/src/test/java/nextstep/courses/domain/CapacityTest.java +++ b/src/test/java/nextstep/courses/domain/CapacityTest.java @@ -1,5 +1,6 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.Capacity; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/EnrollmentsTest.java b/src/test/java/nextstep/courses/domain/EnrollmentsTest.java index 6ff5ab0037..55dd2e4270 100644 --- a/src/test/java/nextstep/courses/domain/EnrollmentsTest.java +++ b/src/test/java/nextstep/courses/domain/EnrollmentsTest.java @@ -1,5 +1,7 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.Capacity; +import nextstep.courses.domain.enrollment.Enrollments; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/src/test/java/nextstep/courses/domain/ImageDimensionTest.java b/src/test/java/nextstep/courses/domain/ImageDimensionTest.java index 1f3805d39a..94baa65953 100644 --- a/src/test/java/nextstep/courses/domain/ImageDimensionTest.java +++ b/src/test/java/nextstep/courses/domain/ImageDimensionTest.java @@ -1,5 +1,6 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.cover.ImageDimension; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/ImageSizeTest.java b/src/test/java/nextstep/courses/domain/ImageSizeTest.java index 5685a14cdc..3ee4caeacb 100644 --- a/src/test/java/nextstep/courses/domain/ImageSizeTest.java +++ b/src/test/java/nextstep/courses/domain/ImageSizeTest.java @@ -1,9 +1,10 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.cover.ImageSize; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static nextstep.courses.domain.ImageSize.MAX_SIZE; +import static nextstep.courses.domain.session.cover.ImageSize.MAX_SIZE; import static org.assertj.core.api.Assertions.*; class ImageSizeTest { diff --git a/src/test/java/nextstep/courses/domain/ImageTypeTest.java b/src/test/java/nextstep/courses/domain/ImageTypeTest.java index d3e2f7da26..2749d82258 100644 --- a/src/test/java/nextstep/courses/domain/ImageTypeTest.java +++ b/src/test/java/nextstep/courses/domain/ImageTypeTest.java @@ -1,5 +1,6 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.cover.ImageType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/MoneyTest.java b/src/test/java/nextstep/courses/domain/MoneyTest.java index 361ef9858a..67c1c0d9bc 100644 --- a/src/test/java/nextstep/courses/domain/MoneyTest.java +++ b/src/test/java/nextstep/courses/domain/MoneyTest.java @@ -1,6 +1,6 @@ package nextstep.courses.domain; -import org.assertj.core.api.Assertions; +import nextstep.courses.domain.enrollment.Money; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/PaidEnrollmentPolicyTest.java b/src/test/java/nextstep/courses/domain/PaidEnrollmentPolicyTest.java index d38464a6ad..038668106c 100644 --- a/src/test/java/nextstep/courses/domain/PaidEnrollmentPolicyTest.java +++ b/src/test/java/nextstep/courses/domain/PaidEnrollmentPolicyTest.java @@ -1,5 +1,7 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.Money; +import nextstep.courses.domain.enrollment.PaidEnrollmentPolicy; import nextstep.payments.domain.Payment; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/PaymentTestBuilder.java b/src/test/java/nextstep/courses/domain/PaymentTestBuilder.java index 243cc39ddf..9866e95358 100644 --- a/src/test/java/nextstep/courses/domain/PaymentTestBuilder.java +++ b/src/test/java/nextstep/courses/domain/PaymentTestBuilder.java @@ -1,5 +1,7 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.Money; +import nextstep.courses.domain.session.Session; import nextstep.payments.domain.Payment; public class PaymentTestBuilder { diff --git a/src/test/java/nextstep/courses/domain/SessionDurationTest.java b/src/test/java/nextstep/courses/domain/SessionDurationTest.java index fbc26915fe..fb5b87475c 100644 --- a/src/test/java/nextstep/courses/domain/SessionDurationTest.java +++ b/src/test/java/nextstep/courses/domain/SessionDurationTest.java @@ -1,5 +1,6 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.SessionDuration; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/SessionStateTest.java b/src/test/java/nextstep/courses/domain/SessionStateTest.java index 85ac02fc3b..6c802960d1 100644 --- a/src/test/java/nextstep/courses/domain/SessionStateTest.java +++ b/src/test/java/nextstep/courses/domain/SessionStateTest.java @@ -1,5 +1,6 @@ package nextstep.courses.domain; +import nextstep.courses.domain.session.SessionState; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/SessionTest.java b/src/test/java/nextstep/courses/domain/SessionTest.java index 324ffbf5ff..ca197bff14 100644 --- a/src/test/java/nextstep/courses/domain/SessionTest.java +++ b/src/test/java/nextstep/courses/domain/SessionTest.java @@ -1,5 +1,7 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.Money; +import nextstep.courses.domain.session.Session; import nextstep.payments.domain.Payment; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java index df70e2c8e8..a5c205ad86 100644 --- a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java +++ b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java @@ -1,5 +1,11 @@ package nextstep.courses.domain; +import nextstep.courses.domain.enrollment.*; +import nextstep.courses.domain.session.Session; +import nextstep.courses.domain.session.SessionDuration; +import nextstep.courses.domain.session.SessionState; +import nextstep.courses.domain.session.cover.CoverImage; + import java.time.LocalDateTime; public class SessionTestBuilder { diff --git a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java index a4dcb0fe15..805651282e 100644 --- a/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/EnrollmentRepositoryTest.java @@ -1,6 +1,6 @@ package nextstep.courses.infrastructure; -import nextstep.courses.domain.Enrollment; +import nextstep.courses.domain.enrollment.Enrollment; import nextstep.courses.repository.EnrollmentRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java index ece9400009..b6b0798493 100644 --- a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java @@ -1,6 +1,8 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.*; +import nextstep.courses.domain.enrollment.Money; +import nextstep.courses.domain.session.Session; import nextstep.courses.repository.SessionRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; From 59aa2e397e6ff56725c85e6cf0082e9de404fd17 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Mon, 29 Dec 2025 23:53:42 +0900 Subject: [PATCH 12/12] =?UTF-8?q?feat:=20Session=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20courseId=20=EC=B6=94=EA=B0=80=20-=20Course?= =?UTF-8?q?=20->=20Sessions=20=EC=97=B0=EB=8F=99=20=EC=B6=94=EA=B0=80=20-?= =?UTF-8?q?=20JdbcCourseRepository=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20SessionRepository=20-=20findByCourseId=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 --- .../courses/domain/session/Session.java | 12 +++++-- .../infrastructure/JdbcCourseRepository.java | 8 +++-- .../infrastructure/JdbcSessionRepository.java | 31 ++++++++++++++++--- .../courses/repository/SessionRepository.java | 4 +++ src/main/resources/schema.sql | 1 + .../courses/domain/SessionTestBuilder.java | 13 ++++++++ .../infrastructure/CourseRepositoryTest.java | 5 ++- .../infrastructure/SessionRepositoryTest.java | 27 ++++++++++++++++ 8 files changed, 92 insertions(+), 9 deletions(-) diff --git a/src/main/java/nextstep/courses/domain/session/Session.java b/src/main/java/nextstep/courses/domain/session/Session.java index 3fe60a25c5..7e8a83560d 100644 --- a/src/main/java/nextstep/courses/domain/session/Session.java +++ b/src/main/java/nextstep/courses/domain/session/Session.java @@ -10,6 +10,7 @@ public class Session { private final long id; + private final long courseId; private final SessionDuration sessionDuration; private final CoverImage coverImage; private final EnrollmentPolicy enrollmentPolicy; @@ -17,6 +18,7 @@ public class Session { private final Enrollments enrollments; public Session(long id + , long courseId , LocalDateTime startDate , LocalDateTime endDate , int size @@ -26,13 +28,15 @@ public Session(long id , EnrollmentPolicy enrollmentPolicy , SessionState sessionState , Enrollments enrollments) { - this(id, new SessionDuration(startDate, endDate), new CoverImage(size, fileName, width, height) + + this(id, courseId, new SessionDuration(startDate, endDate), new CoverImage(size, fileName, width, height) , enrollmentPolicy, sessionState, enrollments); } - public Session(long id, SessionDuration sessionDuration, CoverImage coverImage + public Session(long id, long courseId, SessionDuration sessionDuration, CoverImage coverImage , EnrollmentPolicy enrollmentPolicy, SessionState sessionState, Enrollments enrollments) { this.id = id; + this.courseId = courseId; this.sessionDuration = sessionDuration; this.coverImage = coverImage; this.enrollmentPolicy = enrollmentPolicy; @@ -50,6 +54,10 @@ public long getId() { return id; } + public long getCourseId() { + return courseId; + } + public LocalDateTime getStartDate() { return sessionDuration.getStartDate(); } diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java index 590d4117f3..429aada650 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcCourseRepository.java @@ -1,7 +1,9 @@ package nextstep.courses.infrastructure; import nextstep.courses.domain.Course; +import nextstep.courses.domain.session.Sessions; import nextstep.courses.repository.CourseRepository; +import nextstep.courses.repository.SessionRepository; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; @@ -12,9 +14,11 @@ @Repository("courseRepository") public class JdbcCourseRepository implements CourseRepository { private JdbcOperations jdbcTemplate; + private final SessionRepository sessionRepository; - public JdbcCourseRepository(JdbcOperations jdbcTemplate) { + public JdbcCourseRepository(JdbcOperations jdbcTemplate, SessionRepository sessionRepository) { this.jdbcTemplate = jdbcTemplate; + this.sessionRepository = sessionRepository; } @Override @@ -30,7 +34,7 @@ public Course findById(Long id) { rs.getLong(1), rs.getString(2), rs.getLong(3), - null, + new Sessions(sessionRepository.findByCourseId(id)), toLocalDateTime(rs.getTimestamp(4)), toLocalDateTime(rs.getTimestamp(5))); return jdbcTemplate.queryForObject(sql, rowMapper, id); diff --git a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java index aed1cb9378..f7319e93da 100644 --- a/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java +++ b/src/main/java/nextstep/courses/infrastructure/JdbcSessionRepository.java @@ -12,6 +12,7 @@ import java.sql.Timestamp; import java.time.LocalDateTime; +import java.util.List; @Repository("sessionRepository") public class JdbcSessionRepository implements SessionRepository { @@ -23,21 +24,22 @@ public JdbcSessionRepository(JdbcOperations jdbcTemplate) { @Override public int save(Session session) { - String sql = "insert into session (id, start_at, end_at, cover_image_size, cover_image_name, cover_image_width, cover_image_height, policy_type," + - "price, state, capacity, created_at, updated_at) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - return jdbcTemplate.update(sql, session.getId(), session.getStartDate(), session.getEndDate(), session.getCoverImageSize(), session.getCoverImageName() + String sql = "insert into session (id, course_id, start_at, end_at, cover_image_size, cover_image_name, cover_image_width, cover_image_height, policy_type," + + "price, state, capacity, created_at, updated_at) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + return jdbcTemplate.update(sql, session.getId(), session.getCourseId(), session.getStartDate(), session.getEndDate(), session.getCoverImageSize(), session.getCoverImageName() , session.getCoverImageWidth(), session.getCoverImageHeight(), session.getPolicyType(), session.getPrice(), session.getState(), session.getCapacity() , LocalDateTime.now(), LocalDateTime.now()); } @Override public Session findById(Long id) { - String sql = "SELECT id, start_at, end_at, cover_image_size, cover_image_name, " + + String sql = "SELECT id, course_id, start_at, end_at, cover_image_size, cover_image_name, " + "cover_image_width, cover_image_height, policy_type, price, state, capacity " + "FROM session WHERE id = ?"; RowMapper rowMapper = (rs, rowNum) -> new Session( rs.getLong("id"), + rs.getLong("course_id"), toLocalDateTime(rs.getTimestamp("start_at")), toLocalDateTime(rs.getTimestamp("end_at")), rs.getInt("cover_image_size"), @@ -52,6 +54,27 @@ public Session findById(Long id) { return jdbcTemplate.queryForObject(sql, rowMapper, id); } + @Override + public List findByCourseId(Long courseId) { + String sql = "SELECT id, course_id, start_at, end_at, cover_image_size, cover_image_name, " + + "cover_image_width, cover_image_height, policy_type, price, state, capacity " + + "FROM session WHERE course_id = ?"; + RowMapper rowMapper = (rs, rowNum) -> new Session( + rs.getLong("id"), + rs.getLong("course_id"), + toLocalDateTime(rs.getTimestamp("start_at")), + toLocalDateTime(rs.getTimestamp("end_at")), + rs.getInt("cover_image_size"), + rs.getString("cover_image_name"), + rs.getInt("cover_image_width"), + rs.getInt("cover_image_height"), + EnrollmentPolicyFactory.create(rs.getString("policy_type"), rs.getLong("price")), + SessionState.valueOf(rs.getString("state")), + new Enrollments(new Capacity(rs.getInt("capacity"))) + ); + return jdbcTemplate.query(sql, rowMapper, courseId); + } + private LocalDateTime toLocalDateTime(Timestamp timestamp) { if (timestamp == null) { return null; diff --git a/src/main/java/nextstep/courses/repository/SessionRepository.java b/src/main/java/nextstep/courses/repository/SessionRepository.java index 98ca1a2d27..9446af2a75 100644 --- a/src/main/java/nextstep/courses/repository/SessionRepository.java +++ b/src/main/java/nextstep/courses/repository/SessionRepository.java @@ -2,8 +2,12 @@ import nextstep.courses.domain.session.Session; +import java.util.List; + public interface SessionRepository { int save(Session session); Session findById(Long id); + + List findByCourseId(Long courseId); } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 68d701f95b..fb1bec44ec 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -51,6 +51,7 @@ create table delete_history ( create table session ( id bigint generated by default as identity, + course_id bigint not null, start_at timestamp not null, end_at timestamp not null, cover_image_size varchar(20), diff --git a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java index a5c205ad86..9541c5c581 100644 --- a/src/test/java/nextstep/courses/domain/SessionTestBuilder.java +++ b/src/test/java/nextstep/courses/domain/SessionTestBuilder.java @@ -12,6 +12,8 @@ public class SessionTestBuilder { private long id = 1L; + private long courseId = 10L; + private SessionDuration sessionDuration = new SessionDuration( LocalDateTime.now().plusDays(1), LocalDateTime.now().plusDays(2) @@ -29,6 +31,16 @@ public static SessionTestBuilder aSession() { return new SessionTestBuilder(); } + public SessionTestBuilder withId(long id) { + this.id = id; + return this; + } + + public SessionTestBuilder withCourseId(long courseId) { + this.courseId = courseId; + return this; + } + public SessionTestBuilder withClosedSession() { this.sessionState = SessionState.CLOSED; return this; @@ -54,6 +66,7 @@ public SessionTestBuilder withFullEnrollments(int count) { public Session build() { return new Session( id, + courseId, sessionDuration, coverImage, enrollmentPolicy, diff --git a/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java index 885346974e..c26feb07d4 100644 --- a/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/CourseRepositoryTest.java @@ -2,6 +2,7 @@ import nextstep.courses.domain.Course; import nextstep.courses.repository.CourseRepository; +import nextstep.courses.repository.SessionRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -20,10 +21,12 @@ public class CourseRepositoryTest { private JdbcTemplate jdbcTemplate; private CourseRepository courseRepository; + private SessionRepository sessionRepository; @BeforeEach void setUp() { - courseRepository = new JdbcCourseRepository(jdbcTemplate); + sessionRepository = new JdbcSessionRepository(jdbcTemplate); + courseRepository = new JdbcCourseRepository(jdbcTemplate, sessionRepository); } @Test diff --git a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java index b6b0798493..a3fe988aab 100644 --- a/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java +++ b/src/test/java/nextstep/courses/infrastructure/SessionRepositoryTest.java @@ -12,6 +12,8 @@ import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.jdbc.core.JdbcTemplate; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; @JdbcTest @@ -40,4 +42,29 @@ void crud() { assertThat(session.getCoverImageName()).isEqualTo(savedSession.getCoverImageName()); LOGGER.debug("Session: {}", savedSession); } + + @Test + void findByCourseId() { + Session session = SessionTestBuilder.aSession() + .withId(1L) + .withCourseId(10L) + .withCapacity(10) + .withPaidEnrollment(new Money(5000L)) + .build(); + int count = sessionRepository.save(session); + + session = SessionTestBuilder.aSession() + .withId(2L) + .withCourseId(10L) + .withCapacity(10) + .withPaidEnrollment(new Money(5000L)) + .build(); + count += sessionRepository.save(session); + + assertThat(count).isEqualTo(2); + + List sessions = sessionRepository.findByCourseId(10L); + assertThat(sessions).hasSize(2); + LOGGER.debug("Sessions: {}", sessions); + } }