
한화시스템 BEYOND SW 캠프의 다섯 번째 프로젝트인 최종 프로젝트는 약 7주의 기간 동안 기획, 개발 및 AWS 배포의 과정으로 이루어졌다. DAO 팀은 근속 전망을 예측하여 구성원의 이탈을 방지하는 인사관리 시스템을 개발하였다.
최종 프로젝트는 주어진 6가지의 주제 중 하나를 선정하는 방식으로 진행되었으며, 이 중 인사관리 시스템을 선택하였다. 필자는 이전 직장에서 출퇴근 등록 및 휴가 신청을 위해 flex라는 인사관리 시스템을 사용해본 경험이 있어 이를 공유하였다. 덕분에 flex 서비스를 무료체험 해보며 기획에 참고할 수 있었고, 이 외에도 생소한 용어나 직장 생활 경험이 있어야 알 수 있는 부분에 대한 정보를 제공하였다.
최종 프로젝트는 지난 네 번째 프로젝트 팀원들과 함께 했는데, 프로젝트 주제 및 이름도 변경되는 만큼 팀명에 대한 투표 또한 다시 진행하였다. 그 결과 프로젝트명은 다른 팀원이 제안한 이름이 채택되었지만, 팀명은 필자가 제안했던 기존 이름인 DAO를 다시 사용하게 되었다.
README 파일의 팀 소개는 DAO를 다오로 읽을 수 있다는 점에서 크레이지 아케이드 게임의 캐릭터로 구성하기로 했는데, 덕분에 기획 회의를 하다가 지친 상황에서 리프레시 할 수 있었다.

근태 관리 기능에 대한 ERD 및 초기 데이터 생성, 근태 관리 기능과 사원 관리 기능에 대한 백엔드, 프론트엔드 개발을 담당하였다.
팀원 모두에게 영향을 주는 버그를 수정하고 백엔드 및 프론트엔드 경고 로그에 대한 조치를 취하였다. 자세한 내용은 하단의 3. 트러블 슈팅에서 다룬다.

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.
employees/ids에 leading slash를 작성하지 않은 것이 원인이었다./employees/ids로 수정하였다.
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 속성을 삭제하였다.

defineEmits , defineProps를 import하여 사용한 것이 원인이었다.
설명: 백엔드 서버가 아래와 같이 스택 트레이스를 뱉으며 중지되었다.

원인: DevTools를 사용하고 있을 때, 코드 수정 후 서버를 재가동하지 않으면 MyBatis와 충돌하는 것이 원인이었다. 아래는 관련 ChatGPT 답변 내용이다.
DevTools는 코드를 수정하면 "context만" 재시작하려고 하지, 서버 전체 프로세스를 재시작하진 않아요.
하지만 MyBatis는 mapper xml 등 리소스를 다시 로딩해야 하는 구조인데, 이때 WebApp이 이미 내려가 있어서 IllegalStateException이 발생하는 겁니다.

isWeekend, isHoliday가 각각 weekend, holiday로 수정된 것이 원인이었다. 이는 예상에 없던 시나리오였기에, 프론트엔드 코드에서 잘못된 필드를 참조하였다.


translateX가 문제였다.

전체 결재 내역 -> 상세 조회 -> 전체 결재 내역 순으로 이동하면 빈 페이지가 출력되었다.
hrefs 내 경로를 상대 경로로 작성한 것이 문제였다.
아래 이미지와 같이 올바른 경로 /approvals가 아닌 /approval/approvals로 매핑하고 있음을 확인할 수 있다.


AWS 배포 환경에서 MariaDB RDS에 SQL 명령어가 적용되지 않는 문제를 해결하였다. 팀원에게 전달받은 엔드포인트 이름이 잘못된 게 원인이었다.
본 프로젝트에서 공지사항 관리, 결재 문서 관리, 계약서 관리 기능에 파일 업로드 및 다운로드가 필요했다. 공지사항 담당 팀원께서 파일 업로드 시 S3 Key로 발급받은 presigned URL을 통해 업로드하고, 다운로드 시 signed URL을 이용하도록 공통 메서드로 작성하고 이를 공유해주셨다.
서버 부담을 줄이기 위한 방법이라고 말씀해 주셨는데, 실제로 이후 현직 개발자 지인을 통해 알아보니 Multipart File이 OOM(Out Of Memory)의 원인이 된다며 잘 한 부분이라고 말씀해주셨다.
특정 서비스를 개발하기 위해서는 해당 분야에서 사용되는 용어를 잘 알아야 함을 배웠다. 이는 강사님께서 처음 프로젝트 가이드를 잡아주실 때도 말씀해주신 부분이었지만, 진행 과정에서 그 중요성을 실감할 수 있었다.
특히 회사 생활 경험이 없는 다른 팀원들의 경우 그 어려움이 더 컸는데, 직위, 직급, 직무, 직군, 직책 등의 업무 관련 용어, 동의, 합의, 병렬, 기안, 상신 등의 결재 관련 용어, 통상 임금, 포괄 임금, 취업 규칙 등의 회사 생활 관련 용어를 새로 배우게 되었다.