1515
1616import java .util .ArrayList ;
1717import java .util .List ;
18- import java .util .Map ;
1918import java .util .Set ;
2019import java .util .stream .Collectors ;
2120
@@ -26,73 +25,38 @@ public class TrackService {
2625 private final TrackRepository trackRepository ;
2726 private final StudentCourseRepository studentCourseRepository ; // 기존 기능
2827
29- /**
30- * 모든 트랙 정보를 학과별로 그룹화하여 반환하는 메서드
31- */
32- public Map <String , List <Track >> getAllTracksGroupedByDepartment () {
33- // 1. DB에서 모든 트랙과 관련 과목들을 한번에 조회
34- List <Track > allTracks = trackRepository .findAllWithCourses ();
35-
36- // 2. 조회된 트랙 리스트를 '학과' 이름으로 그룹화하여 Map으로 변환 후 반환
37- return allTracks .stream ()
38- .collect (Collectors .groupingBy (Track ::getDepartment ));
39- }
40-
41- /**
42- * 학생이 이수한 과목 이름을 Set으로 반환하는 private 메서드
43- */
4428 public List <TrackProgressDto > calculateTrackProgress (String studentId ) {
45- // 1. 학생의 이수 과목 목록 조회
46- Set <String > completedCourseNames = studentCourseRepository .findByStudentId (studentId )
47- .stream ()
48- .map (StudentCourse ::getCourseName )
49- .collect (Collectors .toSet ());
50-
51- // 2. 모든 트랙 정보 조회
52- List <Track > allTracks = trackRepository .findAllWithCourses ();
53-
54- List <TrackProgressDto > progressList = new ArrayList <>();
55-
56- // 3. 각 트랙별로 진행 현황 계산
57- for (Track track : allTracks ) {
29+ Set <String > completedCourseNames = getCompletedCourseNames (studentId ); // 이수 과목명 목록
5830
59- // 현재 트랙에서 완료한 과목과 남은 과목을 담을 리스트 초기화
60- List <CourseDto > completedInThisTrack = new ArrayList <>();
61- List <CourseDto > remainingInThisTrack = new ArrayList <>();
31+ List <Track > allTracks = trackRepository .findAll ();
6232
63- // 현재 트랙에 속한 모든 교과목을 하나씩 확인
64- for (TrackCourse trackCourse : track .getCourses ()) {
33+ return allTracks .stream ().map (track -> {
34+ List <TrackCourse > courses = track .getCourses (); // 이 트랙의 모든 과목
35+ List <CourseDto > completed = new ArrayList <>();
36+ List <CourseDto > remaining = new ArrayList <>();
6537
66- // 학생이 해당 과목을 이수했는지 확인 (현재 이름 또는 과거 이름으로 체크)
67- if (completedCourseNames .contains (trackCourse .getCourseName ()) ||
68- (trackCourse .getCourseAlias () != null && completedCourseNames .contains (trackCourse .getCourseAlias ()))) {
69- // 이수한 경우: 완료 리스트에 추가
70- completedInThisTrack .add (new CourseDto (trackCourse .getCourseName (), trackCourse .getCourseAlias ()));
38+ for (TrackCourse course : courses ) {
39+ CourseDto dto = new CourseDto (course .getCourseName (), course .getCourseAlias ());
40+ if (isCourseCompleted (course , completedCourseNames )) {
41+ completed .add (dto );
7142 } else {
72- // 이수하지 않은 경우: 남은 과목 리스트에 추가
73- remainingInThisTrack .add (new CourseDto (trackCourse .getCourseName (), trackCourse .getCourseAlias ()));
43+ remaining .add (dto );
7444 }
7545 }
7646
77- // 최종 결과를 담을 DTO 객체 생성 및 데이터 세팅
78- TrackProgressDto progressDto = new TrackProgressDto ();
79- progressDto .setTrackName (track .getName ());
80- progressDto .setDepartment (track .getDepartment ());
81-
82- int completedCount = completedInThisTrack .size ();
83- progressDto .setCompletedCount (completedCount );
84- progressDto .setRequiredCount (6 ); // 트랙 이수 요구 과목 수는 6개
85- progressDto .setCompleted (completedCount >= 6 ); // 6개 이상이면 true
86-
87- progressDto .setCompletedCourses (completedInThisTrack );
88- progressDto .setRemainingCourses (remainingInThisTrack );
47+ return new TrackProgressDto (
48+ track .getName (),
49+ track .getDepartment (),
50+ completed .size (),
51+ courses .size (),
52+ completed .size () == courses .size (),
53+ completed ,
54+ remaining
55+ );
56+ }).toList ();
57+ }
8958
90- // 완성된 DTO를 최종 결과 리스트에 추가
91- progressList .add (progressDto );
92- }
9359
94- return progressList ;
95- }
9660
9761 /**
9862 * 학생이 이수한 과목 이름을 Set으로 반환하는 메서드
0 commit comments