-
Notifications
You must be signed in to change notification settings - Fork 246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
4단계 - 수강신청(요구사항 변경) #402
base: master
Are you sure you want to change the base?
4단계 - 수강신청(요구사항 변경) #402
Conversation
기존에 질문, 답변 삭제 상태 변경을 Service Layer에서 했습니다. 도메인에 책임을 질 수 있도록 Question 도메인으로 이동합니다
질문 작성자와 답변 작성자가 같은지 검사하는 로직을 Answer에게 넘겨 자신의 책임을 다할 수 있도록 개선합니다
질문을 조회하는 로직을 별도의 메소드로 분리합니다. 삭제된 질문과 답변들은 DB에 이력을 남기므로 DeleteHistory 리스트를 만들기 위해 메서드로 나누어 조합합니다
삭제이력 생성을 서비스가 아닌 도메인에서 하도록 개선합니다
질문은 로그인 한 사용자가 삭제하는지, 답변은 로그인한 사용자가 삭제하는지 각자 책임을 지도록 개선합니다 삭제 이력은 질문과 답변을 변환하는 정적 팩터리 메서드를 추가합니다
Q1은 이번 테스트에서 필요하지 않는 상수이므로 제거합니다
생성시간, 수정시간을 별도의 클래스로 분리합니다
질문 리스트를 일급 컬렉션으로 개선합니다
질문 서비스 레이어에서 답변과 질문 도메인을 나눠서 관리하고 있지만 연관관계를 고려하여 질문 도메인에서 관리하도록 개선합니다
기존에는 삭제 이력이 질문과 답변을 의존했습니다. 하지만 질문과 답변의 도메인 정보를 get으로 꺼내했으므로 반대의 의존성을 만들어 노출을 최소화합니다
질문 도메인이 삭제이력을 관리할 수 있도록 합니다. 따라서 도메인에서 질문과 답변을 삭제이력으로 만드는 작업을 합니다
삭제이력을 리스트로 관리하지 않고 일급 컬렉션으로 관리합니다 삭제 이력에 질문과 답변을 추가하는 행위와 삭제이력 상태를 관리합니다
1단계 - 레거시 코드 리팩터링
기능 요구사항을 정리합니다
강의와 이미지 도메인을 생성합니다. 유효성 검증만 도메인 데이터 변경 함수를 추가해야 합니다
이미지의 크기, 확장자, 비율을 검사하는 유효성을 추가합니다
모집중인 경우만 강의신청이 가능하며, 유료 강의의 경우 수강 인원을 초과 할 수 없고 결제가 완료되어야만 신청이 가능합니다
강의와 이미지의 도메인 유효성 테스트를 추가합니다
강의는 여러명의 수강이 있을 수 있으므로 수강생 리스트를 추가하고 결제정보도 여러개가 될 수 있기 때문에 결제정보 필드를 제거합니다
강의 신청 서비스레이어를 생성합니다. 강의 유효성 검사는 강의 클래스 테스트에서 진행했으므로 정상적인 강의 신청만 테스트합니다
이미지, 강의 도메인 생성자의 유효성 검사를 메서드로 분리합니다
강의 신청자들을 일급 컬렉션으로 감싸도록 개선합니다
이미지 타입 조회 시, 존재하지 않는 타입의 경우 예외를 던지는 테스트를 추가합니다
강의 시작과 종료날짜를 클래스로 분리하여 강의기간 생성과 유효성 검사를 책임질 수 있도록 합니다
변수 바로 아래에 내부 enum을 위치시키도록 조정합니다
과정에 강의가 새롭게 추가되므로 강의를 추가하는 로직을 만듭니다
과정에 강의가 중복 추가되거나, 강의에 수강생이 중복 신청되는 경우 이미 추가가 되었다는 예외를 추가합니다
강의 금액과 지불내역이 다르면 수강신청을 할 수 없습니다. 해당 유효성과 테스트를 추가합니다
강의 준비와 모집은 시작일 전에 가능하며, 강의 종료는 종료일 이후에 가능하다는 유효성을 추가합니다
생성자, 생성일시, 수정일시를 다루는 공통 속성 클래스 상속을 추가합니다
일시 테스트를 용이하게 하고 일관성을 가지기 위해 생성일시를 외부에서 주입받을 수 있도록 수정합니다
Image, Session, Apply 스키마를 추가하고 Course에 기수를 추가합니다
기존 sequence 칼럼을 ordering으로 변경하고 모든 칼럼을 비교합니다
jdbc를 활용해 이미지의 저장과 조회를 추가합니다.
Session id를 통해 수강생을 조회할 수 있도록 저장소와 조회를 추가합니다.
강의 저장소에서 강의 조회와 저장을 추가합니다
강의를 신청하면 해당 강의에 수강생이 추가하도록 합니다.
강의 정보가 변경되는 경우를 고려해 수정을 추가합니다
과정과 강의 서비스에 저장소 로직을 추가합니다 과정의 경우 조회와 저장 시 강의도 같이 할 수 있도록 개선해야 합니다
과정은 강의를 포함하므로 조회 시 같이 조회하도록 개선합니다
과정에 강의를 추가하면 강의 테이블에 과정 정보를 입력하도록 합니다.
id만 사용했지만 수강 지원에 래핑된 클래스를 사용합니다
id는 자동으로 1씩 증가하여 생성되므로 통합 테스를 위해 id를 1 증가시켜서 만들도록 개선합니다
기존에 쿼리가 기준 줄을 넘어 한줄로 작성되어 줄바꿈을 합니다
강의 생성, 강의 상태 변경 3가지 테스트를 추가합니다. 예외 테스트는 도메인 테스트에서 했기 때문에 정상 상황만 테스트합니다
객체의 상태를 꺼내지 않고 객체 자체를 매개변수로 전달하도록 개선합니다
테이블 스키마 정보에서 생성시간이 not null인 경우 null검사를 제외합니다. null 검사를 허용하면 nullable과 혼동 할 수 있습니다.
변경된 기능 요구 사항을 정리합니다
기존에는 강의가 1개의 이미지만 가질 수 있었지만 1개 이상의 이미지를 가질 수 있도록 개선합니다.
Session에 칼럼이 많아 객체로 묶고 모집중/비모집중을 구분합니다 해당 경우에 따른 강의 상태 변경 로직을 추가해야 합니다
수강신청 시, 모집중인 경우와 준비중이거나 진행중인 경우만 신청이 가능하도록 유효성 검증을 개선합니다
강사는 수강신청을 승인하고 취소할 수 있습니다. 승인된 경우만 강의를 들을 수 있으며 수강취소를 할 수 있습니다
강의의 비지니스 로직을 리팩토링 합니다. 지원자(Applicants)를 지원(Applies) 에 합치고 객체 대신 객체 식별자를 의존합니다.
강의 엔티티에 연관관게 리스트를 변수로 가집니다 강의 신청, 취소, 등록 비지니스를 별도의 클래스에서 검증합니다. 강의 서비스 레이어에서 강의 엔티티를 이용해 강의, 신청, 취소의 3가지 비지니스 클래스를 반환합니다. 이는 단순히 필요한 변수를 반환하기 위함입니다. 주요 비지니스 로직은 강의, 신청, 취소 클래스에 있습니다
강의 상태 변경 같은 간단한 경우에는 엔티티에서 해결하고 수강신청, 승인 및 취소는 별도 클래스에서 비지니스 로직을 수행합니다. getter와 setter를 제거하고 모든 변수에 final을 추가합니다.
안녕하세요, 재성님께도 한번 피드백 받고 싶어서 보완해 pull request 했습니다~!
강의 준비중, 강의 진행중, 강의 종료 등 상태 변경은 간단한 로직으로 생각해 강의 신청은 유효성 검증이 많다고 판단하여 강의 승인 및 취소도 검증을 위해 getter의 클래스가 너무 많은 변수를 가지지 않도록 분리하기 위해 고민했습니다.(최대 4개, Image는 5개) 일급 컬렉션을 적극 사용하여 로직이 너무 한 클래스에 과도하지 않도록 했습니다. 테스트를 위해 별도의 fixture를 생성해 과도한 중복 코드를 줄였습니다. 이번 과제에서 어떤 부분들을 중점적으로 학습해야하는지 피드백 주시면 감사하겠습니다! |
학습 관리 시스템(Learning Management System)
4단계 - 수강신청(요구사항 변경)
변경된 기능 요구사항
프로그래밍 요구사항