Skip to content
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

[DEV-36] 졸업 검사 코드 리팩토링 #274

Merged
merged 18 commits into from
Jun 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c8971ca
feat: MajorGraduationCategory -> MajorType 변경
stophwan Jun 22, 2024
1c62552
feat: User도메인 MajorType 별 전공과목 반환 메서드 구현
stophwan Jun 22, 2024
2b8c01e
feat: GraduationRequirement도메인 MajorType별 졸업요견 반환 메서드 구현
stophwan Jun 22, 2024
2d43390
feat: GraduationCategory 도메인 전공필수, 선택 확인하는 메서드 추가
stophwan Jun 22, 2024
35abd6c
refactor: 학문기초교양 졸업 계산 Service 리팩토링
stophwan Jun 22, 2024
a4665ba
refactor: 전공 졸업 계산 Service 리팩토링
stophwan Jun 22, 2024
cba936d
refactor: UseCaseResolver 삭제 및 하위 메서드 통합
stophwan Jun 22, 2024
2aa848e
refactor: CalculateGraduationService 책임 분리 리팩토링
stophwan Jun 22, 2024
4b531e9
refactor: CalculateDetailGraduationUsecase 인터페이스 수정
stophwan Jun 22, 2024
6384580
test: 리팩토링 이후 테스트코드 작성
stophwan Jun 23, 2024
097ecd6
refactor: 리팩토링 이후 불필요한 클래스 삭제
stophwan Jun 23, 2024
2e7926a
test: 리팩토링 이후 테스트 코드 수정
stophwan Jun 26, 2024
3704b02
fix: DetailCategoryResult categoryName 필드 기본할당 문제 수정
stophwan Jun 27, 2024
4e99eb7
refactor: code smell 수정
stophwan Jun 27, 2024
8b23230
refactor: code smell 수정
stophwan Jun 27, 2024
cc1b7a9
refactor: 수강 과목 동기화 메서드 네이밍 수정
5uhwann Jun 28, 2024
67e179c
refactor: 코드 포맷 수정
5uhwann Jun 28, 2024
9222ffb
refactor: 코드 오류 수정
5uhwann Jun 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package com.plzgraduate.myongjigraduatebe.graduation.application.service;

import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.DUAL_BASIC_ACADEMICAL_CULTURE;
import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.PRIMARY_BASIC_ACADEMICAL_CULTURE;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.transaction.annotation.Transactional;

import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;
import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.MajorType;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.BasicAcademicalGraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.basicacademicalculture.DefaultBasicAcademicalGraduationManager;
import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindBasicAcademicalCulturePort;
import com.plzgraduate.myongjigraduatebe.lecture.domain.model.BasicAcademicalCultureLecture;
import com.plzgraduate.myongjigraduatebe.lecture.domain.model.Lecture;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.StudentCategory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;

import lombok.RequiredArgsConstructor;

@UseCase
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CalculateBasicAcademicalCultureGraduationService implements CalculateDetailGraduationUseCase {

private final FindBasicAcademicalCulturePort findBasicAcademicalCulturePort;
private final List<BasicAcademicalGraduationManager> basicAcademicalGraduationManagers;

@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == PRIMARY_BASIC_ACADEMICAL_CULTURE
|| graduationCategory == DUAL_BASIC_ACADEMICAL_CULTURE;
}

@Override
public DetailGraduationResult calculateSingleDetailGraduation(User user, GraduationCategory graduationCategory,
TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) {
MajorType majorType = MajorType.from(graduationCategory);
String userMajor = user.getMajorByMajorType(majorType);
Set<BasicAcademicalCultureLecture> graduationBasicAcademicalCultureLectures =
findBasicAcademicalCulturePort.findBasicAcademicalCulture(userMajor);
GraduationManager<BasicAcademicalCultureLecture> basicAcademicalCultureGraduationManager =
determineBasicAcademicalCultureGraduationManager(userMajor);
DetailGraduationResult detailGraduationResult = basicAcademicalCultureGraduationManager.createDetailGraduationResult(
user, takenLectureInventory, graduationBasicAcademicalCultureLectures,
graduationRequirement.getBasicCreditByMajorType(majorType));
detailGraduationResult.assignGraduationCategory(graduationCategory);
return detailGraduationResult;
}

public List<DetailGraduationResult> calculateAllDetailGraduation(User user,
TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) {
if (user.getStudentCategory() == StudentCategory.DUAL_MAJOR) {
TakenLectureInventory copiedTakenLectureForPrimaryBasicAcademicalCulture = takenLectureInventory.copy();
TakenLectureInventory copiedTakenLectureForDualBasicAcademicalCulture = takenLectureInventory.copy();
DetailGraduationResult primaryBasicAcademicalCultureDetailGraduationResult = calculateSingleDetailGraduation(
user, PRIMARY_BASIC_ACADEMICAL_CULTURE, copiedTakenLectureForPrimaryBasicAcademicalCulture,
graduationRequirement);
DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult = calculateSingleDetailGraduation(
user, DUAL_BASIC_ACADEMICAL_CULTURE, copiedTakenLectureForDualBasicAcademicalCulture,
graduationRequirement);
syncOriginalTakenLectureInventory(takenLectureInventory,
primaryBasicAcademicalCultureDetailGraduationResult, dualBasicAcademicalCultureDetailGraduationResult);
return List.of(primaryBasicAcademicalCultureDetailGraduationResult,
dualBasicAcademicalCultureDetailGraduationResult);
}
DetailGraduationResult primaryBasicAcademicalCultureGraduationResult = calculateSingleDetailGraduation(
user, PRIMARY_BASIC_ACADEMICAL_CULTURE, takenLectureInventory, graduationRequirement);
return List.of(primaryBasicAcademicalCultureGraduationResult);
}

private GraduationManager<BasicAcademicalCultureLecture> determineBasicAcademicalCultureGraduationManager(
String userMajor) {
return basicAcademicalGraduationManagers.stream()
.filter(basicAcademicalManager -> basicAcademicalManager.isSatisfied(userMajor))
.findFirst()
.orElse(new DefaultBasicAcademicalGraduationManager());
}

private void syncOriginalTakenLectureInventory(TakenLectureInventory originalTakenLectureInventory,
DetailGraduationResult primaryBasicAcademicalCultureDetailGraduationResult,
DetailGraduationResult dualBasicAcademicalCultureDetailGraduationResult) {
List<Lecture> primaryBasicAcademicalCultureTakenLectures =
primaryBasicAcademicalCultureDetailGraduationResult.getDetailCategory().get(0).getTakenLectures();
List<Lecture> dualBasicAcademicalCultureTakenLectures =
dualBasicAcademicalCultureDetailGraduationResult.getDetailCategory().get(0).getTakenLectures();

Set<Lecture> basicAcademicalCultureTakenLectures = new HashSet<>();
basicAcademicalCultureTakenLectures.addAll(primaryBasicAcademicalCultureTakenLectures);
basicAcademicalCultureTakenLectures.addAll(dualBasicAcademicalCultureTakenLectures);
originalTakenLectureInventory.sync(basicAcademicalCultureTakenLectures);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@

import java.util.Set;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;
import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCommonCultureGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.commonculture.CommonCultureGraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.commonculture.CommonGraduationManager;
import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindCommonCulturePort;
import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCulture;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
Expand All @@ -24,22 +22,21 @@
@UseCase
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CalculateCommonCultureGraduationService implements CalculateCommonCultureGraduationUseCase {
public class CalculateCommonCultureGraduationService implements CalculateDetailGraduationUseCase {

private final FindCommonCulturePort findCommonCulturePort;
private final CommonGraduationManager commonCultureGraduationManager;

@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == COMMON_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
public DetailGraduationResult calculateSingleDetailGraduation(User user, GraduationCategory graduationCategory,
TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) {
Set<CommonCulture> graduationCommonCultures = findCommonCulturePort.findCommonCulture(user);
GraduationManager<CommonCulture> commonCultureGraduationManager = new CommonCultureGraduationManager();
return commonCultureGraduationManager.createDetailGraduationResult(
user, takenLectureInventory, graduationCommonCultures, graduationRequirement.getCommonCultureCredit());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,15 @@

import java.util.Set;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.plzgraduate.myongjigraduatebe.core.meta.UseCase;
import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateCoreCultureGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.application.usecase.CalculateDetailGraduationUseCase;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory;
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationRequirement;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.GraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.commonculture.CommonCultureGraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.coreculture.CoreCultureGraduationManager;
import com.plzgraduate.myongjigraduatebe.graduation.domain.service.coreculture.CoreGraduationManager;
import com.plzgraduate.myongjigraduatebe.lecture.application.port.FindCoreCulturePort;
import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CommonCulture;
import com.plzgraduate.myongjigraduatebe.lecture.domain.model.CoreCulture;
import com.plzgraduate.myongjigraduatebe.takenlecture.domain.model.TakenLectureInventory;
import com.plzgraduate.myongjigraduatebe.user.domain.model.User;
Expand All @@ -26,21 +22,20 @@
@UseCase
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class CalculateCoreCultureGraduationService
implements CalculateCoreCultureGraduationUseCase {
public class CalculateCoreCultureGraduationService implements CalculateDetailGraduationUseCase {

private final FindCoreCulturePort findCoreCulturePort;
private final CoreGraduationManager coreCultureGraduationManager;

@Override
public boolean supports(GraduationCategory graduationCategory) {
return graduationCategory == CORE_CULTURE;
}

@Override
public DetailGraduationResult calculateDetailGraduation(User user, TakenLectureInventory takenLectureInventory,
GraduationRequirement graduationRequirement) {
public DetailGraduationResult calculateSingleDetailGraduation(User user, GraduationCategory graduationCategory,
TakenLectureInventory takenLectureInventory, GraduationRequirement graduationRequirement) {
Set<CoreCulture> graduationCoreCultures = findCoreCulturePort.findCoreCulture(user);
GraduationManager<CoreCulture> coreCultureGraduationManager = new CoreCultureGraduationManager();
return coreCultureGraduationManager.createDetailGraduationResult(
user, takenLectureInventory, graduationCoreCultures, graduationRequirement.getCoreCultureCredit());
}
Expand Down

This file was deleted.

This file was deleted.

Loading
Loading