Skip to content

Conversation

@nunoria
Copy link
Collaborator

@nunoria nunoria commented May 9, 2025

2주차 과제 - 출근/퇴근 버튼 만들기

개요

출근 및 퇴근을 입력 받고, 팀원의 출퇴근 정보를 업데이트

구현 내용

1. 기본과제

  • 출근 버튼, 퇴근 버튼 구현

2. 선택과제

  • 출근 시간 및 퇴근시간 확인 후 상태 표시
  • 정해진 시간 이후 퇴근하지 않은 멤버가 있으면 자동 퇴근 처리
  • 출퇴근 기록을 localStorage 에 저장

3. 기타

  • 출퇴근 기록을 위한 AttendanceRecord 클래스 구현
  • Member 리스트를 json 파일로 분리
    • 기준 출퇴근시간 필드 추가(지각 및 조퇴 판정)
  • 화면 레이아웃을 네비게이션과 페이지로 분리

추가 Library

  • dayjs
  • react-router-dom

주요 학습내용

1. react-router-dom

  • 네비게이션 구현을 위한 router 사용

    function App() {
    
     //...
    
      return (
        <BrowserRouter>
          <Routes>
            <Route path="/" element={<Layout />}>
              <Route index element={<Attendance />} />
              {/* <Route path="Members" element={<Members />} /> */}
              <Route path="Members" element={<Members />} />
            </Route>
          </Routes>
        </BrowserRouter>
      );
    }

2. useEffect

  • 출퇴근 입력시 검색된 attendanceRecord 상태를 후킹하여, 근무시간 처리

  • App 에서 30초간격으로 시간 확인 후 정해진 시간에 도달하면 일괄 퇴근 처리

        useEffect(() => {
            if (!attendanceRecord) return;
    
            if (attendanceRecord.clockOutTime) {
                setWorkingTime(attendanceRecord.getWorkingDuration());
                return;
            }
            // 출근시간이 있는 경우에만 근무시간 계산
            const interval = setInterval(() => {
                setWorkingTime(attendanceRecord.getWorkingDuration());
            }, 1000);
            return () => clearInterval(interval);
        }, [attendanceRecord]);

3. AttendanceRecord 클래스 구현

  • storage저장(추후 DB)과 데이터 핸들링 위해 클래스로 구현

  • 속성은 String 으로 유지, 메서드에서 dayjs 라이브러리 사용

    /*
    * @class AttendanceRecord
    * @description 출퇴근 기록을 관리하는 클래스입니다.
    * @property {number} id - 출퇴근 기록 ID
    * @property {number} memberId - 팀원 ID
    * @property {string} date - 출퇴근 날짜 (YYYY-MM-DD 형식)
    * @property {string} standardClockInTime - 정규 출근시간 (HH:mm:ss 형식)
    * @property {string} standardClockOutTime - 정규 퇴근시간 (HH:mm:ss 형식)
    * @property {string} clockInTime - 출근시간 (HH:mm:ss 형식)
    * @property {string} clockOutTime - 퇴근시간 (HH:mm:ss 형식)
    * @property {string} status - 출퇴근 상태 (미출근, 지각, 정상, 조퇴, 지각+조퇴)
    * @property {string} workingDuration - 근무 시간 (HH:mm:ss 형식)
    * @method clockIn(date) - 출근 시간을 기록합니다.
    * @method clockOut(date) - 퇴근 시간을 기록합니다.
    * @method getWorkingDuration() - 근무 시간을 계산하여 반환합니다.
    * @method toJSON() - 출퇴근 기록을 JSON 형식으로 변환합니다.
    */

4. 사용 기술

  • useState, useEffect, react-router-dom

UI/UX 특징

  • Navigation , Page 레이아웃 분리
  • Badge 컴포넌트 추가

RoyKimDeveloper and others added 15 commits April 5, 2025 22:08
- CSS reset
- tailwind spacing에 "pxr" suffix 추가
- screen 사이즈 조정

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- TeamMemberCard 컴포넌트 구현
- lucide-react 라이브러리 설치

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- Modal 컴포넌트 구현
- TeamMemberCard 컴포넌트에 Modal 컴포넌트 적용

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- 조건부 tailwind uc 처리
- 중복 tailwind uc 제거

Signed-off-by: kibum.lee <kissyou7@gmail.com>
Signed-off-by: kibum.lee <kissyou7@gmail.com>
- onOpenChange, open prop을 사용하여 외부에서 상태 관리 가능하도록함
- ModalClose 추가 하여, Close 커스텀 가능하도록함
- aria 속성 추가

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- Card 컴포넌트는 공통 적용부분만 분리
- TeamMemberCard의 모달 state 직접관리
- 기타 코드 정리

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- mount, visible 상태 추가

Signed-off-by: kibum.lee(t14) <kissyou7@gmail.com>
- mount 상태에 따른 content 렌더링 버그 수정
- ModalTrigger 버그수정

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- ModalClose 존재하지 않는경우 Default 스타일로 ModalClose 스타일 적용

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- react-router-dom 을 이용하여 페이지 분리
- 네비게이션 컴포넌트 추가 및 레이아웃 구성

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- dayjs 라이브러리 설치
- member 리스트를 json 파일로 분리
- AttendanceRecord 클래스 구현
- 출퇴근 기록을 localStorage에 저장하는 기능 구현

Signed-off-by: kibum.lee <kissyou7@gmail.com>
- 배지 컴포넌트 분리
- 카드 컴포넌트에 배지로 오늘의 근태현황을 보여줌

Signed-off-by: kibum.lee <kissyou7@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants