인프런 워밍업 클럽 스터디(BE) 0기 / 3주차 발자국

인프런 워밍업 클럽 스터디(BE) 0기 / 3주차 발자국

일주일 간의 학습 내용에 대한 간단한 회고📕

어느덧 마지막 3주차 회고 작성입니다. 인프런 워밍업 클럽 스터디 0기(BE)에 참여하면서, 어설프게 할 생각이었다면 시작조차 안 하는 것이 백배 낫다고 생각하며 진정성 있는 참여를 하기 위해 미션과 미니 프로젝트를 수행하기 위해 최선을 다하려고 끊임없는 도전과 열정을 코드로 보이기 위해 노력했습니다. 3주의 시간이 정말 짧게 느껴질 정도로, 수많은 고민과 반복적인 공부를 통해 스스로의 객관화를 가질 수 있는 매우 유익한 시간이라고 확신합니다.

🔥미니 프로젝트 4단계까지 구현을 성공했습니다. 비록💡한 걸음 더! 는 마감 기간 내에 구현하지 못했지만, 처음 시작할 때의 열정과 목표를 잊지 않으면서 강의를 통해 멘토님께서 전달하고자 하는 지혜와 경험을 바탕으로 3주 동안 스스로 많이 성장한 모습에 놀라며 끊임없는 도전으로 구현 능력의 한계를 극복할 수 있게 된 특별한 경험이었습니다. 이 경험으로 취업에 성공하여 회사에 의미를 더해줄 훌륭한 개발자로 성장을 목표로 오늘도 어김없이 정진하겠습니다.

  • 일주일 동안 스스로 칭찬하고 싶은 점 미니 프로젝트를 진행하면서 정말 많은 고민을 통해 구현한 코드는 매우 의미가 있습니다. 4단계까지 무사히 마칠 수 있는 스스로에게, 한계를 넘어 벽에 부딪히는 것에 두려워하지 말고 한계를 도달하고 뛰어 넘을 수 있다는 가능성을 눈 앞에서 증명했다는 것에 감사하다고 전하고 싶습니다.

  • 아쉬웠던 점 회사 이력서를 작성하면서 4단계 💡한 걸음 더! 배포를 기간 내에 마치지 못한 것에 많은 아쉬움을 갖고 있지만, 이 또한 나의 부족함과 나태함의 결과로 승복하였습니다. 하루라도 더, 몇 시간이라도 더, 조금만 더 잠을 안자고 했더라면 충분히 할 수 있었음에도 불구하고 못한 자신에게 아쉬움을 표합니다.

  • 보완하고 싶은 점 아무리 코드를 따라 치고, 강의를 보더라도 스스로 고민을 하고 아무것도 없는 상황에서 해결하지 못한다면 의미가 없다는 것을 크게 느꼈습니다. 단기 기억 공간과 다른 모든 인지 기억에 마치 잘 알고 있다는 착각에 빠지지 않고, 철을 관철하는 정신으로 공부한 모든 내용을 체득할 것입니다.

  • 다음주에는 어떤 식으로 학습하겠다는 스스로의 목표 강의 PDF, PPT 를 통해 처음부터 끝까지 다시 복습을 진행하며, 백엔드 개발 관련 책을 구매하여 함께 병행할 예정입니다. 소중한 경험을 소홀히 하지 않고 앞으로의 부족함을 채우는 행보에 지치고 힘들며 한계에 부딪히는 순간들을 맞이하고 뛰어 넘기를 목표합니다.

     

학습 내용 정리

미니 프로젝트 1단계

API 에 따라 정상적인 동작을 수행하는지 과정을 검증하는 공간입니다. 직원과 팀 엔티티 확인하기 #4 직원과 팀의 컨트롤러, 서비스, 리포지토리 확인하기 #6

커밋 메세지와 코드 확인은 위의 이슈로 이동하면 확인할 수 있습니다.

0. 데이터 API

팀 등록하기

  • POST / /api/v1/team

  • [
    {
      "name" : "여신관리팀"
    }
    ]

     

모든 팀 조회하기

  • GET / /api/v1/team

  • [
      {
          "name": "여신관리팀",
          "manager": "김민수",
          "memberCount": 2
      },
      {
          "name": "영업1팀",
          "manager": "박현준",
          "memberCount": 2
      },
      {
          "name": "전산팀",
          "manager": "박준우",
          "memberCount": 1
      }
    ]

     

직원 등록하기

  • POST / /api/v1/members

  • [
    {
      "name" : "김사원",
      "role" : "MEMBER",
      "birthday" : "1999-11-02",
      "workStartDate" : "2023-11-01",
    }
    ]

     

  • [
    {
      "name" : "김사원",
      "teamName" : "여신관리팀", // 직원 등록 시점에 팀 등록을 할 수 있습니다.
      "role" : "MEMBER",
      "birthday" : "1999-11-02",
      "workStartDate" : "2023-11-01",
    }
    ]

     

모든 직원 조회하기

  • GET / /api/v1/members

  • [
      {
          "name": "김민수",
          "teamName": "여신관리팀",
          "role": "MANAGER",
          "birthday": "1970-11-11",
          "workStartDate": "2010-02-23"
      },
      {
          "name": "이민혁",
          "teamName": "여신관리팀",
          "role": "MEMBER",
          "birthday": "1984-06-12",
          "workStartDate": "2017-08-11"
      },
      {
          "name": "박현준",
          "teamName": "영업1팀",
          "role": "MANAGER",
          "birthday": "1980-09-29",
          "workStartDate": "2012-02-13"
      },
      {
          "name": "이현민",
          "teamName": "영업1팀",
          "role": "MEMBER",
          "birthday": "1990-11-15",
          "workStartDate": "2017-08-26"
      },
      {
          "name": "박준우",
          "teamName": "전산팀",
          "role": "MANAGER",
          "birthday": "1994-03-15",
          "workStartDate": "2019-02-05"
      },
      {
          "name": "서포터",
          "teamName": null, // 팀에 포함되지 않은 직원은 null 표시합니다.
          "role": "MEMBER",
          "birthday": "2001-11-12",
          "workStartDate": "2024-03-04"
      }
    ]

     


1. 테이블 생성

직원과 팀 테이블은 다음과 같은 쿼리를 통해 자동으로 생성됩니다.

image

팀 테이블

image

직원 테이블

image


2. 데이터 추가

팀 테이블에 여신관리팀, 영업1팀, 전산팀 을 등록합니다. 직원 테이블에 다수의 직원 데이터를 등록합니다.

2.1 팀 등록하기

팀 등록(POST / /api/v1/team)을 통해 여신관리팀, 영업1팀, 전산팀 데이터를 팀 테이블에 저장합니다.

image

image

image

팀 테이블

여신관리팀, 영업1팀, 전산팀 데이터를 성공적으로 저장한 것을 확인합니다.

image


2.2 직원 등록하기

직원 등록(POST / /api/v1/members)을 통해 다수의 직원들을 등록합니다.

image

image

image

image

image

image

직원 테이블

team_id 를 통해 해당 팀에 알맞게 데이터를 성공적으로 저장합니다. 팀에 속하지 못한 경우에는 null 으로 표시됩니다.

image

팀 테이블

회원 등록과 함께 직원이 팀에 포함되면 member_count 를 증가합니다. manager 는 회원 등록 roleMANAGER 만 가능합니다. 이미 MANAGER 가 존재하는 팀에다가 MANAGER 인 직원을 포함하려고 하면 예외가 발생합니다.

image


3. 데이터 조회

3.1 직원 조회

모든 직원 조회(GET / /api/v1/members)으로 정보를 출력합니다. 팀에 속하지 못한 직원은 teamNamenull 으로 출력됩니다.

image

3.2 팀 조회

모든 팀을 조회합니다.

image


미니 프로젝트 2단계

0. 데이터 API

  • 출근 / POST / http://localhost:8080/api/v1/commute/start?memberId=1

  • 퇴근 / POST / http://localhost:8080/api/v1/commute/end?memberId=1

  • 특정 직원의 날짜별 근무시간 조회 / GET / http://localhost:8080/api/v1/commute?id=1&date=2024-03

  • {
      "detail": [
          {
              "date": "2024-03-05",
              "workingMinutes": 12
          },
          {
              "date": "2024-03-04",
              "workingMinutes": 600
          },
          {
              "date": "2024-03-03",
              "workingMinutes": 583
          },
          {
              "date": "2024-03-02",
              "workingMinutes": 987
          }
      ],
      "sum": 2182
    }

     


1.테이블 미리보기

출퇴근 동작 확인을 위해 미리 팀과 직원 데이터를 작성합니다.

팀 테이블

image

직원 테이블

image

출퇴근 테이블

image


2. 출근하기

-http://localhost:8080/api/v1/commute/start?memberId=1 으로 id1인 회원이 출근 처리됩니다.

  • 그림 첨부는 없지만, 회원 id2, 3, 4 또한 출근으로 등록한 상태라는 점을 참고합니다.

image

출퇴근 테이블

  • 출근에 성공한 직원은 출퇴근 테이블에 다음 그림과 같이 저장됩니다.

image


3. 퇴근하기

-http://localhost:8080/api/v1/commute/end?memberId=1 으로 id1인 회원이 퇴근 처리됩니다.

  • 그림 첨부는 없지만, 회원 id2, 3, 4 또한 퇴근으로 등록한 상태라는 점을 참고합니다.

image

출퇴근 테이블

  • 퇴근에 성공한 직원은 출퇴근 테이블에 다음 그림과 같이 저장됩니다.

image


4. id=1 직원에게 2024-03 근무한 데이터 추가하기

  • id1, 2, 3, 4 인 직원은 모두 2024-03에 한 번은 출퇴근한 상태입니다.

  • 비교를 위해 id1 인 직원에게 2024-03 에 해당하는 날짜에 출퇴근 기록 데이터를 INSERT 쿼리를 수행하여 출력 데이터를 준비합니다.

출퇴근 테이블

image


5. id=1 직원의 2024-03 출퇴근 조회하기

  • GET / http://localhost:8080/api/v1/commute?id=1&date=2024-03

  • 정상적으로 특정 직원의 날짜별 근무 시간을 조회하는 기능 을 확인할 수 있습니다.

image


미니 프로젝트 3단계

0. 데이터 API

  • 휴가 등록 / POST / /api/v1/vacation

  • {
      "id" : 2,
      "date" : "2024-03-23"
    }

     

  • 남은 휴가 개수/ GET/ /api/v1/vacation?id=1

  • 14

     

  • 팀마다 며칠 뒤에 휴가 등록이 가능한 일 입력 / POST / /api/v1/vacation/role

  • {
    "name" : "여신관리팀",
    "minDay" : 3 // 오늘 기준으로 몇 일 뒤에 휴가 등록 가능한 지 숫자 입력
    }

     

  • 특정 직원의 날짜별 근무시간 조회 / GET / /api/v1/commute?id=2&date=2024-03

  • {
    "detail": [
    {
    "date": "2024-03-01",
    "workingMinutes": 670,
    "usingDayOff": false
    },
    {
    "date": "2024-03-02",
    "workingMinutes": 720,
    "usingDayOff": false
    },
    ... // 03 ~ 08 일 생략
    {
    "date": "2024-03-09",
    "workingMinutes": 0,
    "usingDayOff": true
    },
    ... // 10 ~ 30 일 생략
    {
    "date": "2024-03-31",
    "workingMinutes": 0,
    "usingDayOff": false
    }
    ],
    "sum": 1390
    }

     


1.테이블 미리보기

휴가 동작 확인을 위해 데이터를 작성합니다. 참고하기 바랍니다.

직원 테이블

image

팀 테이블

image

출퇴근 테이블

image

휴가 테이블

image

휴가룰 테이블

image


1. 휴가 정책

  • 팀마다 며칠 뒤에 휴가 등록이 가능한 일 입력 / POST / /api/v1/vacation/role

  • 에 휴가 정책을 지정합니다. 휴가룰 테이블에서 확인이 가능합니다.

image

휴가룰 테이블

image


2. 휴가 등록

  • id1 인 직원에게 2024-03-10 에 휴가를 등록합니다.

  • minDay3 휴가 정책에 따라서 만약 2024-03-08 이하로 입력하거나 중복된 휴가는 등록되지 않습니다.

image

휴가 테이블

image


3. 남은 휴가 개수

  • 남은 휴가 개수/ GET/ /api/v1/vacation?id=1

  • 남은 휴가 갯수를 숫자로 반환합니다.

  • 직원 번호 1 은 휴가 13 개를 정상적으로 반환하고 휴가를 모두 사용한 직원 번호 2는 휴가 0 개를 반환합니다.

imageimage


4. 특정 직원의 날짜별 근무시간 조회

  • 특정 직원의 날짜별 근무시간 조회 / GET / /api/v1/commute?id=2&date=2024-03

  • 해당 월의 모든 날짜를 휴가 유무와 출퇴근에 따라서 정상적으로 출력합니다.

imageimageimage


미니 프로젝트 4단계

0. 데이터 API

  • 초과 근무 계산 / GET / /api/v1/overtime

  • [
    {
    "id": 1,
    "name": "연**1",
    "overtimeMinutes": 11100
    },
    {
    "id": 2,
    "name": "연**2",
    "overtimeMinutes": 0
    }
    ]

     

1.테이블 미리보기

초과 근무 계산 동작 확인을 위해 데이터를 작성합니다. 참고하기 바랍니다.

직원 테이블

image

팀 테이블

image

출퇴근 테이블

image


2. 초과 근무 계산

  • 공공 데이터 포털로 대한민국의 공휴일과 대통령령의 대체 공휴일을 가져옵니다.

  • 요청한 년-월토요일, 일요일공휴일 그리고 휴가일 따라서 전체 근무 일자가 몇 일인지 구합니다.

  • 요구 사항에 따라 하루 기준 8시간으로 한 달동안 법적 근로 시간을 산출하여 초과 근무 시간을 계산하여 출력합니다.

  • 그림과 같이 포스트맨의 "id" = 1의 경우 다음과 같습니다.

  1. 2024-03 의 공휴일과 주말은 총 11 일입니다. 따라서 88시간 = 5280분

  2. 2024-03 의 전체 평일은 총 20 일입니다. 따라서 20일 * 8시간 = 160시간 = 9600분

  3. 2024-03 의 직원 (id = 1) 의 전체 근무 시간은 345 시간입니다. 따라서 345시간 * 60분 = 20,700분

  4. 포스트맨의 결과 동일하게 초과 근무 시간 = 20,700 - 9600 = 11000 으로 정상적으로 출력되는 것을 확인할 수 있습니다.

  5. 2024-03 의 직원 (id = 2) 는 초과 근무 시간 이 없으므로 0 으로 출력됩니다.

  6. 이름은 첫 글자와 마지막 글자를 제외한 모든 글자는 * 으로 표시합니다.

  7. 직원 테이블로부터 이름을 조회한 것으로 데이터베이스 안에는 정확한 이름이 존재합니다. * 는 서비스 로직에서 처리되어 연**1 처럼 응답합니다.

image


댓글을 작성해보세요.