1. 일별 수업 정보 반환
- 요일에 해당하는 수업들을 반환해야함
- 요일 입력은 MONDAY, TUESDAY 와 같은 식으로 콘솔로 입력 받을 수 있어야 함
- 단, 학생 상태가 비활성화 상태이면 수업을 반환해서는 안됨
// CourseRepository.java
...
public final Map<String, Course> courseMap = new HashMap<>();
...
public List<Course> getCourseDayOfWeek(DayOfWekk dayOfWeek) {
List<Course> courses = new ArrayList<>();
for (Course course: courseMap.values()) {
// 해당 요일 && 활성화 된 사용자
if (course.isSameDay(dayOfWeek) && course.isActivateUser()) {
courses.add(course);
}
}
return courses;
}
...
// CourseService.java
...
public List<CourseInfoDto> getCourseDayOfWeek(DayOfWeek dayOfWeek) {
// CourseRepository의 getCourseDayOfWeek를 가져오기 위해 courses 객체 생성
List<Course> courses = courseRepository.getCourseDayOfWeek(dayOfWeek);
// 람다 식으로 courses의 내용을 CourseInfoDTO 객체로 리턴
return courses.stream().map(CourseInfoDto::new).toList();
}
...
- CourseRepository
- 책임:
- 같은 요일, 학생 상태를 필터링하여 특정 요일에 해당하는 수업을 반환
- 역할:
- 저장된 Course 데이터(CourseMap)를 관리
- 특정 요일에 해당하는 Course 목록을 반환하는 로직 담당
- 책임:
- CourseService
- 책임:
- CourseRepository를 호출하여 특정 요일의 Course 데이터를 가져옴
- 데이터를 람다식으로 가공(CourseInfoDto::new)하여 비즈니스 로직과 표현 로직 분리
- 역할
- CourseRepository에서 데이터를 가져오고, 데이터를 필요한 형태(DTO)로 가공하여 클라이언트에 전달
- CourseRepository와 클라이언트 사이의 중간 다리
- 책임:
2.수강생들의 상태를 변경 할 수 있음
- 학생이 활성 상태 일 때에는 일별 수업에서 포함이 되어야 함
- 학생이 비활성 상태일 때에는, 일별 수업에 포함되서는 안 됨
- 활동 상태에서 활동 상태로, 비활성 상태에서 비활성 상태로 변경이 되어서는 안 됨
// Student.java
public class Student {
...
public void activate() {
// 유저가 이미 활성 상태일 때 처리
if (this.activate) {
throw new IllegalArgumentException("이미 활성 상태입니다.");
}
this.activated = true;
}
public void deactivate() {
// 유저가 이미 비활성 상태일 때 처리
if (!this.activate) {
throw new IllegalArgumentException("이미 비활성화 상태입니다");
}
this.activate = false;
}
...
}
// StudentService.java
public class StudentService {
...
public Student getStudent(String name) {
return studentRepository.findByName(name)
.orElseThrow(() -> new IllegalArgumentException("해당하는 학생이 없습니다."));
}
public void activateStudent(String name) {
// 학생 객체 생성
Student student = getStudent(name);
// 활성화
student.activate();
}
public void deactivateStudent(String name) {
// 학생 객체 생성
Student student = getStudent(name);
// 비활성화
student.deactivate();
}
...
}
- Student
- 책임:
- 학생이 활성화되거나 비활성화 될 수 있는 상태를 관리
- 활성 -> 활성, 비활성 -> 비활성 전환할 수 없도록 비즈니스 규칙을 구현
- 역할:
- 학생과 관련된 데이터를 표현하고, 상태 변경과 관련된 도메인 로직을 포함
- activate(), deactivate() 메서드를 통해 상태 변경에 대한 책임을 전적으로 가지고 있음
- 책임:
- StudentService
- 책임:
- 학생의 활성화/비활성화 작업을 처리하는 로직의 흐름을 조율
- StudentRepository를 통해 db에서 Student 객체를 가져옴
- activate(), deactivate() 메서드를 호출
- 역할:
- StudentRepository와 도메인 모델(Student)를 연결
- 학생 상태 변경 책임을 Sutdent에 위임
- 학생이 존재하지 않을 경우 예외 처리
- 책임:
3. 수강생들의 수강료를 변경 할 수 있음
- 특정 학생의 수강료를 변경 시키면 특정 학생 수업에 전체에 적용이 되어야 함
// CourseFee.java 생성
public class CourseFee {
private int fee;
public CourseFee(int fee) {
this.fee = fee;
}
public void ChangeFee(int fee) {
this.fee = fee;
}
public void CheckFee(int fee) {
if (fee < 0) {
throw new IllegalArgumentException("수강료 설정을 다시 해주세요.");
}
}
public int getFee() {
return fee;
}
}
// Course.java
public class Course {
...
private final CourseFee fee;
...
public Course(...,int fee,...) {
this.fee = new CourseFee(fee);
}
public void changeFee(int fee) {
this.fee.checkFee(fee);
this.fee.changeFee(fee);
}
...
}
// CourseRepository.java
public class CourseRepository {
...
public List<Course> getCourseListByStudent(String studentName) {
List<Course> courses = new ArrayList<>();
for (Course course: courseMap.values()) {
if (course.getStudentName().equals(studentName)) {
courses.add(course);
}
}
return courses;
}
...
}
// CourseService.java
public class CourseService {
...
public void changeFee(String studentName, int fee) {
List<Course> courses = courseRepository.getCourseListByStudent(studentName);
for (Course course: courses) {
course.changeFee(fee);
}
}
...
}
- CourseFee
- 책임:
- 수강료 유효성 검사
- 수강료 값 변경
- 수강료 값 제공
- 역할:
- 수강료를 관리하는 역할, 수강료와 관련된 모든 로직을 캡슐화
- 책임:
- Course
- 책임:
- 수강료 유효성 검사와 변경을 수행
- changeFee(int fee) 메서드에서 수강료를 변경하며, 유효성 검사를 포함
- 역할:
- 수업과 관련된 모든 정보를 관리하는 도메인 객체
- 수강료와 관련된 행위를 캡슐화
- 책임:
- CourseRepository
- 책임:
- 수강생 이름으로 수업 조회
- 수업 데이터 저장소
- 역할:
- 수업 데이터를 저장하고 조회
- 책임:
- CourseService
- 책임:
- 수강료 변경 비즈니스 로직 관리
- 수업 데이터를 도메인 객체에 연결
- 역할:
- Repository와 도메인 객체간의 중간 다리
- 책임:
4. 수강료 변경 로직 개선 + 주말에는 수강료 * 1.5배 로직 추가
// CourseList.java 1급 컬렉션 생성
public class CourseList {
private final List<Course> courses;
public CourseList(List<Course> courses) {
this.courses = courses;
}
public void changeAllCourseFee(int fee) {
for (Course course: courses) {
if (course.isSameDay(DayOfWeek.SATUARDAY) || course.isSameDay(DayOfWeek.SUNDAY)) {
course.changeFee((int) (fee * 1.5))
}
course.changeFee(fee);
}
}
}
// CourseService.java
...
public void changeFee(String studentName, int fee) {
List<Course> courses = courseRepository.getCourseListByStudent(studentName);
CourseList courseList = new CourseList(courses);
courseList.changeAllCourseFee(fee);
}
...
- 1. CourseList (1급 컬렉션)
- 책임:
- 수업 목록(List<Course>)을 관리하며, 해당 목록과 관련된 모든 로직을 캡슐화합니다.
- 수업료 변경이라는 비즈니스 로직을 책임지고 실행합니다.
- 역할:
- 수업 리스트와 관련된 로직(주말 수업료 변경)을 처리하며, 컬렉션 데이터에 대한 일관성을 유지합니다.
- List<Course>를 외부에 노출하지 않고, CourseList 객체가 모든 작업의 중심이 됩니다.
- 책임:
출처: https://fastcampus-community-feed.notion.site/ec0c2f76549448f78917774c48db0100
수강생 관리 프로그램 과제 | Notion
과제 수행기간 및 과제 수행 정보
fastcampus-community-feed.notion.site
'개발 공부' 카테고리의 다른 글
JPA 기본 개념과 영속성 컨텍스트 (0) | 2025.02.25 |
---|---|
Spring과 객체 지향 (0) | 2025.02.25 |
커뮤니티 피드(3) - 테스트 작성 (1) | 2025.02.13 |
커뮤니티 피드(2) - Post 도메인 개발 (1) | 2025.02.13 |
커뮤니티 피드(1) - User 도메인 개발 (1) | 2025.02.12 |