본문 바로가기

개발 공부

수강생 관리 프로그램

 

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
    • 책임:
      1. 같은 요일, 학생 상태를 필터링하여 특정 요일에 해당하는 수업을 반환
    • 역할:
      1. 저장된 Course 데이터(CourseMap)를 관리
      2. 특정 요일에 해당하는 Course 목록을 반환하는 로직 담당
  • CourseService
    • 책임:
      1. CourseRepository를 호출하여 특정 요일의 Course 데이터를 가져옴
      2. 데이터를 람다식으로 가공(CourseInfoDto::new)하여 비즈니스 로직과 표현 로직 분리
    • 역할
      1. CourseRepository에서 데이터를 가져오고, 데이터를 필요한 형태(DTO)로 가공하여 클라이언트에 전달
      2. 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
    • 책임: 
      1. 학생이 활성화되거나 비활성화 될 수 있는 상태를 관리
      2. 활성 -> 활성, 비활성 -> 비활성 전환할 수 없도록 비즈니스 규칙을 구현
    • 역할:
      1. 학생과 관련된 데이터를 표현하고, 상태 변경과 관련된 도메인 로직을 포함
      2. activate(), deactivate() 메서드를 통해 상태 변경에 대한 책임을 전적으로 가지고 있음
  • StudentService
    • 책임:
      1. 학생의 활성화/비활성화 작업을 처리하는 로직의 흐름을 조율
      2. StudentRepository를 통해 db에서 Student 객체를 가져옴
      3. activate(), deactivate() 메서드를 호출
    • 역할:
      1. StudentRepository와 도메인 모델(Student)를 연결
      2. 학생 상태 변경 책임을 Sutdent에 위임
      3. 학생이 존재하지 않을 경우 예외 처리

 

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
    • 책임:
      1. 수강료 유효성 검사
      2. 수강료 값 변경
      3. 수강료 값 제공
    • 역할:
      1. 수강료를 관리하는 역할, 수강료와 관련된 모든 로직을 캡슐화
  • Course
    • 책임:
      1. 수강료 유효성 검사와 변경을 수행
      2. changeFee(int fee) 메서드에서 수강료를 변경하며, 유효성 검사를 포함
    • 역할:
      1. 수업과 관련된 모든 정보를 관리하는 도메인 객체
      2. 수강료와 관련된 행위를 캡슐화
  • CourseRepository
    • 책임:
      1. 수강생 이름으로 수업 조회
      2. 수업 데이터 저장소
    • 역할:
      1. 수업 데이터를 저장하고 조회
  • CourseService
    • 책임:
      1. 수강료 변경 비즈니스 로직 관리
      2. 수업 데이터를 도메인 객체에 연결
    • 역할:
      1. 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급 컬렉션)
    • 책임:
      1. 수업 목록(List<Course>)을 관리하며, 해당 목록과 관련된 모든 로직을 캡슐화합니다.
      2. 수업료 변경이라는 비즈니스 로직을 책임지고 실행합니다.
    • 역할:
      1. 수업 리스트와 관련된 로직(주말 수업료 변경)을 처리하며, 컬렉션 데이터에 대한 일관성을 유지합니다.
      2. List<Course>를 외부에 노출하지 않고, CourseList 객체가 모든 작업의 중심이 됩니다.

 

출처: https://fastcampus-community-feed.notion.site/ec0c2f76549448f78917774c48db0100

 

수강생 관리 프로그램 과제 | Notion

과제 수행기간 및 과제 수행 정보

fastcampus-community-feed.notion.site

원본 소스: https://github.com/KanghoLee82/ch2_3_manage_student