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

[2단계 - 출석 다시 구현하기] 코기(장재현) 미션 제출합니다. #109

Merged
merged 69 commits into from
Mar 3, 2025
Merged
Changes from 1 commit
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
aa343c3
chore: 기존 코드 전부 삭제
jaehyeon2650 Feb 26, 2025
af6c59b
docs(readme): 구현할 기능 목록 정리
jaehyeon2650 Feb 26, 2025
6224c37
feat(domain): AttendanceHistory 도메인 생성
jaehyeon2650 Feb 26, 2025
8787435
feat(domain): AttendanceHistory 출석 결과 도출 기능 추가
jaehyeon2650 Feb 26, 2025
fd1be46
feat(domain): AttendanceHistories 도메인 생성
jaehyeon2650 Feb 26, 2025
0de98ac
feat(domain): AttendanceHistory 해당 날짜 존재 여부 확인 기능 추가
jaehyeon2650 Feb 26, 2025
8743ed9
feat(domain): AttendanceHistory 출석 추가 기능 검증 추가
jaehyeon2650 Feb 26, 2025
67c557a
feat(domain): Crew 도메인 생성
jaehyeon2650 Feb 26, 2025
1eb1c23
feat(domain): Crews 도메인 생성
jaehyeon2650 Feb 27, 2025
af1ade8
feat(view): InputView 생성
jaehyeon2650 Feb 27, 2025
67f2db9
feat(view): OutputView 생성
jaehyeon2650 Feb 27, 2025
4204fc6
feat(utils): FileReader 생성
jaehyeon2650 Feb 27, 2025
7f5f410
feat(domain): 생성자 변경
jaehyeon2650 Feb 27, 2025
39f26a6
feat(controller): AttendanceController 생성
jaehyeon2650 Feb 27, 2025
dd42979
refactor(AttendanceHistory): AttendanceHistory 맴버 변수 변경
jaehyeon2650 Feb 27, 2025
5374029
feat(AttendanceHistories): AttendanceHistories 도메인 로직 추가
jaehyeon2650 Feb 27, 2025
2b345cc
feat(AttendanceHistories): AttendanceHistories 도메인 로직 추가
jaehyeon2650 Feb 27, 2025
f6e3e15
feat(constants): Holiday enum 클래스 추가
jaehyeon2650 Feb 27, 2025
ed5605a
feat(domain): AttendanceHistories 생성자 변경
jaehyeon2650 Feb 27, 2025
3d24800
feat(domain): 출석 수정 기능 추가
jaehyeon2650 Feb 27, 2025
6dd302e
feat(domain): Crews 이전 기록 조회 기능 추가
jaehyeon2650 Feb 27, 2025
17e5606
feat(view): OutputView 수정 결과 출력 기능 추가
jaehyeon2650 Feb 27, 2025
1b4ff93
feat(view): InputView 기능 추가
jaehyeon2650 Feb 27, 2025
c97e0e5
feat(domain): 출석 검증 추가
jaehyeon2650 Feb 27, 2025
c1a7a6b
feat(controller): AttendanceController 수정 기능 추가
jaehyeon2650 Feb 27, 2025
dd961bb
feat(domain): AttendanceResult enum 타입 추가
jaehyeon2650 Feb 27, 2025
ead7eb9
feat(domain): AttendanceHistory 정렬 기능 추가
jaehyeon2650 Feb 27, 2025
e5c3702
feat(domain): AttendanceStatus enum 클래스 생성
jaehyeon2650 Feb 28, 2025
3665500
feat(domain): AttendanceAnalyze 도메인 추가
jaehyeon2650 Feb 28, 2025
ea52c5d
feat(domain): AttendanceHistory 로직 추가
jaehyeon2650 Feb 28, 2025
31b1991
feat(domain): AttendanceHistories 로직 추가
jaehyeon2650 Feb 28, 2025
739a5dc
feat(domain): AttendanceHistories 로직 추가
jaehyeon2650 Feb 28, 2025
769ca2f
feat(domain): Crews 로직 추가
jaehyeon2650 Feb 28, 2025
59e6805
feat(domain): Crews 로직 추가
jaehyeon2650 Feb 28, 2025
1cb4c8e
feat(dto): 출석 기록 관련 dto 생성
jaehyeon2650 Feb 28, 2025
32ff7a3
feat(view): 이달의 출석 기록 출력 기능 추가
jaehyeon2650 Feb 28, 2025
bf2900e
feat(controller): 이달의 출석 기록 출력 기능 추가
jaehyeon2650 Feb 28, 2025
70a27ab
feat(domain): AttendanceAnalyze 제적 대상자인지 판별하는 로직 추가
jaehyeon2650 Feb 28, 2025
5ebef02
feat(domain): Crew 제적 대상자인지 확인하는 메서드 추가
jaehyeon2650 Feb 28, 2025
0967d3f
feat(domain): Crews 기능 추가
jaehyeon2650 Feb 28, 2025
de1cf12
feat(dto): 제적 위험자 dto 추가
jaehyeon2650 Feb 28, 2025
6261b91
feat(view): 제적 위험자 출력 기능 추가
jaehyeon2650 Feb 28, 2025
9dd9a18
feat(controller): 제적 위험자 출력 기능 추가
jaehyeon2650 Feb 28, 2025
5a5026c
feat(view): 에러 메시지 출력 기능 추가
jaehyeon2650 Feb 28, 2025
43080e8
feat(controller): 재입력 기능 추가
jaehyeon2650 Feb 28, 2025
e6049c5
feat(util): DateFormatter 생성
jaehyeon2650 Feb 28, 2025
9278d6e
refactor(util): FileReader 메서드 정리
jaehyeon2650 Feb 28, 2025
f71010d
refactor(constant,controller): Selection enum 생성 및 컨트롤러 리펙토링
jaehyeon2650 Feb 28, 2025
4796a7f
feat(InputView): 검증 기능 추가
jaehyeon2650 Feb 28, 2025
55c4d4c
refactor(view): outputView 줄바꿈 추가
jaehyeon2650 Feb 28, 2025
6d5ff82
refactor(domain): AttendanceHistories 메서드 추출
jaehyeon2650 Feb 28, 2025
8b7e334
refactor: 메서드 위치 정리 및 공백 수정
jaehyeon2650 Feb 28, 2025
2bfd29d
refactor(domain): AttendanceResult 상수화
jaehyeon2650 Feb 28, 2025
709486f
refactor(domain): Username 포장 객체 생성
jaehyeon2650 Feb 28, 2025
e274851
feat(config): Config 객체 생성
jaehyeon2650 Feb 28, 2025
4878eb9
refactor: 코드 컨벤션 정리
jaehyeon2650 Feb 28, 2025
d269b0e
refactor(domain): 이름 최대 글자 상수화
jaehyeon2650 Mar 1, 2025
6a98fe7
feat(constants): 캠퍼스 운영 시간 상수화
jaehyeon2650 Mar 1, 2025
60c85b2
fix(constants): 운영 시간 로직 버그 수정
jaehyeon2650 Mar 1, 2025
c5c5c65
refactor(constants): Holiday 필드 수정
jaehyeon2650 Mar 1, 2025
553c73a
docs(readme): 기능 최종 정리
jaehyeon2650 Mar 1, 2025
b691be1
docs: 템플릿 작성
jaehyeon2650 Mar 1, 2025
92b8a0d
refactor(domain): CampusOpenTime 패키지 이동
jaehyeon2650 Mar 3, 2025
1b72865
test(domain): Crew 도메인 테스트 추가
jaehyeon2650 Mar 3, 2025
145267e
refactor(domain): AttendanceAnalyze 인스턴스 변수 변경
jaehyeon2650 Mar 3, 2025
978a560
refactor(domain): CampusOpenTime 메서드 이름 변경
jaehyeon2650 Mar 3, 2025
8f36339
refactor(domain): 정렬 인터페이스 구현 삭제
jaehyeon2650 Mar 3, 2025
4f07f7b
refactor(domain): AttendanceHistories getBeforeAttendanceHistories 메서…
jaehyeon2650 Mar 3, 2025
7875674
refactor: Optional 메서드 메개변수 삭제
jaehyeon2650 Mar 3, 2025
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
Prev Previous commit
Next Next commit
refactor(domain): 정렬 인터페이스 구현 삭제
jaehyeon2650 committed Mar 3, 2025
commit 8f36339b298340d362fc12d197e0e421f0bb0dbb
34 changes: 18 additions & 16 deletions src/main/java/domain/AttendanceHistories.java
Original file line number Diff line number Diff line change
@@ -4,8 +4,8 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

public class AttendanceHistories {
private final List<AttendanceHistory> attendanceHistories;
@@ -41,7 +41,12 @@ public AttendanceResult editAttendanceHistory(LocalDateTime editTime) {
public List<AttendanceHistory> getBeforeAttendanceHistories(LocalDate localDate) {
return attendanceHistories.stream()
.filter(attendanceHistory -> attendanceHistory.isBeforeAttendanceHistory(localDate))
.sorted()
.sorted(new Comparator<AttendanceHistory>() {
@Override
public int compare(AttendanceHistory o1, AttendanceHistory o2) {
return o1.getAttendanceDate().compareTo(o2.getAttendanceDate());
}
})
.toList();
}

@@ -51,23 +56,20 @@ public AttendanceAnalyze getAttendanceAnalyze(LocalDate standard) {

private void createAttendance(List<LocalDateTime> histories, LocalDate localDate,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional을 메서드 파라미터로 넘길 필요 없이 아래와 같이 findAny() 한 Optional 값을 mapping하고 없는 경우 AttendanceHistory(localDate, null)를 생성해주면 되지 않을까요?

    private void createAttendance(List<LocalDateTime> histories, LocalDate localDate, List<AttendanceHistory> allHistories) {
        if (!Holiday.isHoliday(localDate)) {
            AttendanceHistory attendanceHistory = histories.stream().filter(history -> {
                    LocalDate historyDate = history.toLocalDate();
                    return historyDate.isEqual(localDate);
                })
                .findAny()
                .map(AttendanceHistory::new)
                .orElseGet(() -> new AttendanceHistory(localDate, null));

            allHistories.add(attendanceHistory);
        }
    }

더 나아가서 if 문에 로직이 너무 커지는 것 같은데 early return을 활용해서 아래와 같이 개선해볼 수 있을 것 같아요.

    private void createAttendance(List<LocalDateTime> histories, LocalDate localDate, List<AttendanceHistory> allHistories) {
        if (Holiday.isHoliday(localDate)) {
            return;
        }

        AttendanceHistory attendanceHistory = histories.stream().filter(history -> {
                LocalDate historyDate = history.toLocalDate();
                return historyDate.isEqual(localDate);
            })
            .findAny()
            .map(AttendanceHistory::new)
            .orElseGet(() -> new AttendanceHistory(localDate, null));

        allHistories.add(attendanceHistory);
    }

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional을 생성자나 메서드 인자로 사용 금지

위 자료에서 나온 내용이네요! 메서드 인자로 사용안하도록 변경해보도록 하겠습니다!

List<AttendanceHistory> allHistories) {
if (!Holiday.isHoliday(localDate)) {
Optional<LocalDateTime> date = histories.stream().filter(history -> {
LocalDate historyDate = history.toLocalDate();
return historyDate.isEqual(localDate);
})
.findAny();
allHistories.add(makeAttendanceHistory(date, localDate));
if (Holiday.isHoliday(localDate)) {
return;
}
AttendanceHistory attendanceHistory = histories.stream()
.filter(history -> {
LocalDate historyDate = history.toLocalDate();
return historyDate.isEqual(localDate);
})
.findAny()
.map(AttendanceHistory::new)
.orElseGet(() -> new AttendanceHistory(localDate, null));
allHistories.add(attendanceHistory);
}

private AttendanceHistory makeAttendanceHistory(Optional<LocalDateTime> date, LocalDate standardDate) {
return date.map(AttendanceHistory::new)
.orElseGet(() -> new AttendanceHistory(standardDate, null));

}


public static class Validator {
public static void validateAddAttendanceHistory(List<AttendanceHistory> attendanceHistories,
LocalDateTime localDateTime) {
21 changes: 8 additions & 13 deletions src/main/java/domain/AttendanceHistory.java
Original file line number Diff line number Diff line change
@@ -8,25 +8,25 @@
import java.util.Optional;
import util.DateFormatter;

public class AttendanceHistory implements Comparable<AttendanceHistory> {
public class AttendanceHistory {
private final LocalDate attendanceDate;
private final LocalTime attendanceTime;
private final AttendanceResult AttendanceResult;
private final AttendanceResult attendanceResult;

public AttendanceHistory(LocalDateTime attendanceTime) {
AttendanceValidator.validateAttendanceTime(attendanceTime.toLocalTime());
AttendanceValidator.validateAttendanceDate(attendanceTime.toLocalDate());
this.attendanceDate = attendanceTime.toLocalDate();
this.attendanceTime = attendanceTime.toLocalTime();
this.AttendanceResult = findAttendanceResult(this.attendanceDate, this.attendanceTime);
this.attendanceResult = findAttendanceResult(this.attendanceDate, this.attendanceTime);
}

public AttendanceHistory(LocalDate attendanceDate, LocalTime attendanceTime) {
AttendanceValidator.validateAttendanceTime(attendanceTime);
AttendanceValidator.validateAttendanceDate(attendanceDate);
this.attendanceDate = attendanceDate;
this.attendanceTime = attendanceTime;
this.AttendanceResult = findAttendanceResult(this.attendanceDate, this.attendanceTime);
this.attendanceResult = findAttendanceResult(this.attendanceDate, this.attendanceTime);
}

private AttendanceResult findAttendanceResult(LocalDate attendanceDate, LocalTime attendanceTime) {
@@ -51,21 +51,16 @@ public boolean equals(Object o) {
}
AttendanceHistory that = (AttendanceHistory) o;
return Objects.equals(attendanceDate, that.attendanceDate) && Objects.equals(attendanceTime,
that.attendanceTime) && Objects.equals(AttendanceResult, that.AttendanceResult);
that.attendanceTime) && Objects.equals(attendanceResult, that.attendanceResult);
}

@Override
public int hashCode() {
return Objects.hash(attendanceDate, attendanceTime, AttendanceResult);
}

@Override
public int compareTo(AttendanceHistory o) {
return this.attendanceDate.compareTo(o.attendanceDate);
return Objects.hash(attendanceDate, attendanceTime, attendanceResult);
}

public AttendanceResult getAttendanceResult() {
return AttendanceResult;
return attendanceResult;
}

public LocalDate getAttendanceDate() {
@@ -78,7 +73,7 @@ public Optional<LocalTime> getAttendanceTime() {

public static class AttendanceValidator {
private static void validateAttendanceTime(LocalTime attendanceTime) {
if (attendanceTime != null && CampusOpenTime.cantAttendance(attendanceTime)) {
if (attendanceTime != null && CampusOpenTime.canNotAttendance(attendanceTime)) {
throw new IllegalArgumentException("[ERROR] 캠퍼스 운영 시간은 08:00 ~ 23:00 입니다.");
}
}