BEYOND SW 캠프 15기 최종 프로젝트 회고

mijuckboon·2025년 8월 3일
post-thumbnail

한화시스템 BEYOND SW 캠프의 다섯 번째 프로젝트인 최종 프로젝트는 약 7주의 기간 동안 기획, 개발 및 AWS 배포의 과정으로 이루어졌다. DAO 팀은 근속 전망을 예측하여 구성원의 이탈을 방지하는 인사관리 시스템을 개발하였다.

1. 주요 기능

  1. 회사 관리: 부서, 직위, 권한, 휴일 관리
  2. 사원 관리: 사원, 계약서, 인사 발령 관리
  3. 프로필 관리: 개인 정보 조회, 수정, 본인 계약서 및 발령 내역 조회
  4. 근태 관리: 근태 내역 조회, 근태 등록, 수정, 삭제
  5. 결재 관리: 결재 내역 조회, 결재 문서 작성, 결재선 설정, 결재 승인/반려, 취소
  6. 평가 관리: KPI 및 다면 평가 조회, 작성
  7. 근속 전망 관리: 근속 전망 조회, 생성
  8. 공지사항 관리: 공지사항 등록, 수정, 삭제
  9. 챗봇: 사내 서비스 안내, 데이터 기반 안내 기능
  10. 알림: 결재 및 평가, 근속 전망 관련 알림 전송

2. 기여한 점

1. 경험 공유

최종 프로젝트는 주어진 6가지의 주제 중 하나를 선정하는 방식으로 진행되었으며, 이 중 인사관리 시스템을 선택하였다. 필자는 이전 직장에서 출퇴근 등록 및 휴가 신청을 위해 flex라는 인사관리 시스템을 사용해본 경험이 있어 이를 공유하였다. 덕분에 flex 서비스를 무료체험 해보며 기획에 참고할 수 있었고, 이 외에도 생소한 용어나 직장 생활 경험이 있어야 알 수 있는 부분에 대한 정보를 제공하였다.

2. 팀명 제안

최종 프로젝트는 지난 네 번째 프로젝트 팀원들과 함께 했는데, 프로젝트 주제 및 이름도 변경되는 만큼 팀명에 대한 투표 또한 다시 진행하였다. 그 결과 프로젝트명은 다른 팀원이 제안한 이름이 채택되었지만, 팀명은 필자가 제안했던 기존 이름인 DAO를 다시 사용하게 되었다.

README 파일의 팀 소개는 DAO를 다오로 읽을 수 있다는 점에서 크레이지 아케이드 게임의 캐릭터로 구성하기로 했는데, 덕분에 기획 회의를 하다가 지친 상황에서 리프레시 할 수 있었다.

README 팀 소개

3. 근태 관리 및 사원 관리 기능 구현

근태 관리 기능에 대한 ERD 및 초기 데이터 생성, 근태 관리 기능과 사원 관리 기능에 대한 백엔드, 프론트엔드 개발을 담당하였다.

4. 공통 버그 수정 및 경고 로그 관련 조치

팀원 모두에게 영향을 주는 버그를 수정하고 백엔드 및 프론트엔드 경고 로그에 대한 조치를 취하였다. 자세한 내용은 하단의 3. 트러블 슈팅에서 다룬다.

3. 트러블 슈팅

1. 로그 모니터링

1. Spring Security 관련 백엔드 서버 경고 로그 발생

  • 설명: 서버 재가동 시 아래와 같은 경고 로그가 발생하였다. (아래 사진의 4번째 줄)
    경고 로그
2025-07-04T14:51:43.211+09:00  WARN 18052 --- [  restartedMain] thorizationManagerRequestMatcherRegistry :
One of the patterns in [/holiday, employees/ids] is missing a leading slash.
This is discouraged; please include the leading slash in all your request matcher patterns.
In future versions of Spring Security, leaving out the leading slash will result in an exception.
  • 원인: request matcher 패턴 중 employees/idsleading slash를 작성하지 않은 것이 원인이었다.
  • 해결 방법: SecurityConfig에서 /employees/ids로 수정하였다.

SecurityConfig 수정

  • 시사점: 당장 단기간 내에 문제가 될 가능성이 높지는 않겠으나, 로그를 잘 확인한 덕분에 exception 발생 위험을 미연에 방지할 수 있었다. 로그 모니터링의 중요성을 알게 해준 일화였다.

1-2. Hibernate 관련 백엔드 서버 경고 로그 발생

  • 설명: 다음과 같은 경고 로그가 발생하였다.
2025-07-17T11:14:56.941+09:00  WARN 36028 --- [  restartedMain] org.hibernate.orm.deprecation : HHH90000025: 
MariaDBDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
  • 원인: MariaDBDialect를 직접 속성으로 명시한 것이 원인이었다.
  • 해결 방법: application.yml에서 hibernate.dialect 속성을 삭제하였다.

application.yml 수정

1-3. 프론트엔드 서버 경고 로그 발생

  • 설명: 프론트엔드 서버에서 다음과 같은 로그가 발생하였다.
    프론트엔드 서버 로그
  • 원인: defineEmits , defineProps를 import하여 사용한 것이 원인이었다.
  • 해결 방법: import 문을 제거하였다,
    프론트엔드 불필요한 import 문 제거

2. 백엔드 이슈

2-1. 백엔드 서버가 터지는 문제

  • 설명: 백엔드 서버가 아래와 같이 스택 트레이스를 뱉으며 중지되었다.
    백엔드 서버 스택트레이스

  • 원인: DevTools를 사용하고 있을 때, 코드 수정 후 서버를 재가동하지 않으면 MyBatis와 충돌하는 것이 원인이었다. 아래는 관련 ChatGPT 답변 내용이다.

DevTools는 코드를 수정하면 "context만" 재시작하려고 하지, 서버 전체 프로세스를 재시작하진 않아요.

하지만 MyBatis는 mapper xml 등 리소스를 다시 로딩해야 하는 구조인데, 이때 WebApp이 이미 내려가 있어서 IllegalStateException이 발생하는 겁니다.
  • 해결 방법: 코드가 수정될 때마다 서버를 재가동하였다.

2-2. 주말에 출근 모달이 뜨는 문제 (JSON 직렬화)

  • 설명: 주말에는 출근 버튼을 누르면 "승인 없는 주말 근무는 불가능합니다."라는 토스트 알림이 떠야 하지만, 실제로는 아래와 같이 평일처럼 출근 모달이 떴다.

주말 출근 모달

  • 원인: JSON 직렬화 과정에서 응답 객체의 필드 isWeekendisHoliday가 각각 weekendholiday로 수정된 것이 원인이었다. 이는 예상에 없던 시나리오였기에, 프론트엔드 코드에서 잘못된 필드를 참조하였다.

백엔드 코드 및 Postman 응답 결과

  • 해결 방법: 프론트엔드에서 필드명을 수정한 후 해결되었다.
    프론트엔드 코드 수정 내용

3. 프론트엔드 이슈

3-1. 사이드바 모달 문제

  • 설명: 사이드바의 종모양 버튼을 눌러도 알림창이 뜨지 않으며, 출근/퇴근 버튼을 눌렀을 때 사이트 중앙에 떠야 하는 모달이 아래 사진과 같이 사이드바 안에 갇힌 채로 나타났다.

모달 위치 문제

  • 원인: 사이드바에 애니메이션 효과를 주기 위해 작성한 스타일 코드 중 translateX가 문제였다.

사이드바 스타일 코드

  • 해결 방법: 해당 부분을 지운 이후 출퇴근 모달 및 알림창이 정상적으로 나타났다.

정상화 완료

3-2. 사이드바 라우팅 문제

  • 설명: 아래 사진과 같이 사이드바를 통해 전체 결재 내역 -> 상세 조회 -> 전체 결재 내역 순으로 이동하면 빈 페이지가 출력되었다.

이동 과정 사진

  • 원인: 사이드바의 hrefs 내 경로를 상대 경로로 작성한 것이 문제였다.

사이드바 코드

아래 이미지와 같이 올바른 경로 /approvals가 아닌 /approval/approvals로 매핑하고 있음을 확인할 수 있다.

링크

  • 해결 방법: 사이드바에 작성된 모든 경로를 절대 경로로 수정하여 해결하였다.
    사이드바 수정

4. 배포 이슈

AWS 배포 환경에서 MariaDB RDS에 SQL 명령어가 적용되지 않는 문제를 해결하였다. 팀원에게 전달받은 엔드포인트 이름이 잘못된 게 원인이었다.

4. 배운 점

1. S3 Presigned URL, CloudFront Signed URL

본 프로젝트에서 공지사항 관리, 결재 문서 관리, 계약서 관리 기능에 파일 업로드 및 다운로드가 필요했다. 공지사항 담당 팀원께서 파일 업로드 시 S3 Key로 발급받은 presigned URL을 통해 업로드하고, 다운로드 시 signed URL을 이용하도록 공통 메서드로 작성하고 이를 공유해주셨다.
서버 부담을 줄이기 위한 방법이라고 말씀해 주셨는데, 실제로 이후 현직 개발자 지인을 통해 알아보니 Multipart File이 OOM(Out Of Memory)의 원인이 된다며 잘 한 부분이라고 말씀해주셨다.

2. 도메인 용어

특정 서비스를 개발하기 위해서는 해당 분야에서 사용되는 용어를 잘 알아야 함을 배웠다. 이는 강사님께서 처음 프로젝트 가이드를 잡아주실 때도 말씀해주신 부분이었지만, 진행 과정에서 그 중요성을 실감할 수 있었다.
특히 회사 생활 경험이 없는 다른 팀원들의 경우 그 어려움이 더 컸는데, 직위, 직급, 직무, 직군, 직책 등의 업무 관련 용어, 동의, 합의, 병렬, 기안, 상신 등의 결재 관련 용어, 통상 임금, 포괄 임금, 취업 규칙 등의 회사 생활 관련 용어를 새로 배우게 되었다.

5. 느낀 점

  1. 부트캠프를 통해 프로젝트 경험을 쌓은 덕분에 맡은 기능 구현에만 급급했던 부족했던 사람에서 공통 버그 수정 및 경고 로그 해결까지 해낼 수 있을 만큼 많이 성장했다. 커서 기반 페이지네이션, Redis, 메시지 큐, lock, 캐싱, JWT 토큰을 이용한 계정 관리 등 아직 적용해보지 못한 부분이 많은데, 이들도 접해보며 꾸준히 앞으로 나아가야겠다.
  2. 백엔드 프로젝트 이후 오랜만에 MyBatis를 이용한 CQRS 구조로 코드를 작성하려니 초반에 많이 헤맸다. 코딩 테스트 뿐만 아니라 코드 작성 또한 꾸준히 해서 감각을 잃지 않도록 해야한다는 것을 느꼈다. 수료한 이후로도 작은 프로젝트를 진행하며 코드 작성 감각을 유지 혹은 발전시켜 나가야겠다.
profile
곽진웅, 백엔드 개발자 준비 중

0개의 댓글