1. 프로젝트 개요

- 한 줄 소개: "복잡한 항공 인력 스케줄링과 인사 행정을 한눈에 관리하는 SaaS 플랫폼"
- 개발 기간: 2026.01.06 - 2026.03.03 (팀 프로젝트)
- 기술 스택: Java, Spring Boot, React, MySQL, AWS (EC2), Spring AI, Nginx
- 주요 기능: 대시보드를 통한 실시간 인력 현황 모니터링
- ERD 설계를 기반으로 한 체계적인 인사 데이터 관리
- Spring AI를 활용한 명함 인식 회원가입 및 이미지 기반 근태 정정 신청
- AWS를 활용한 안정적인 클라우드 배포
2. 나의 역할
이번 프로젝트에서 형상관리자와 풀스택 개발자 역할을 겸임했습니다.
- Frontend: 전체적인 프론트엔드 UI/UX 구현 (React)
- Backend: 근태/휴가 관리 시스템, 건강 프로그램 신청 로직 구현
- AI Integration: Spring AI를 활용한 이미지 OCR 기반 데이터 처리
- DevOps: AWS EC2 환경 구축 및 Nginx를 이용한 서비스 배포

3. 핵심 트러블슈팅: 땀 흘리며 배운 배포와 형상관리
① 보안 사고 방지: .gitignore와 캐시 삭제
프로젝트 초기, 팀원이 실수로 DB 비밀번호와 JWT 설정이 담긴 application_secret.yaml을 GitHub에 업로드하는 일이 발생했습니다. 형상관리자로서 가장 먼저 대응한 이슈였습니다.
- 문제: 이미 원격 저장소에 올라간 파일은 .gitignore에 추가해도 계속 추적됨.
- 해결: git rm --cached 명령어를 통해 원격 저장소의 캐시를 삭제하고, 팀 전체에 Pull -> Conflict 해결 -> Push 워크플로우를 전파하여 보안 이슈를 해결했습니다.
② Nginx 설정과 실시간 통신(SSE, Chat) 삽질기
가장 고생했던 부분은 AWS 배포 환경에서의 양방향 통신 설정이었습니다. 로컬에서는 잘 작동하던 채팅과 알림 기능이 배포만 하면 작동하지 않았습니다.
- 고충: 배포 환경에서는 수정 사항을 확인하려면 매번 빌드와 배포를 반복해야 했고, CMD를 통해 로그를 트래킹하며 에러를 예상해야 하는 과정이 힘들었습니다.
- 해결: Nginx가 WebSocket과 SSE를 제대로 전달하지 못하는 것이 원인이었습니다. 설정 파일에 Upgrade, Connection 헤더 설정을 명시하고, 타임아웃 시간을 넉넉히 늘려주어 문제를 해결했습니다.
4. 프로젝트 후기: 기술보다 값진 '사람'에 대한 이해
🤝 협업의 경험: "신뢰가 곧 효율이다"
처음에는 깃 충돌(Conflict)이 무서워 팀원들의 푸시/풀 과정을 일일이 옆에서 확인하고 직접 머지해줬습니다. 하지만 문득 이것이 팀원을 신뢰하지 못하는 행동이라는 것을 깨달았습니다. 저 또한 과거에 충돌을 겪으며 성장했듯이, 팀원들에게도 그 과정이 필요함을 인정하기로 했습니다. 팀원들을 믿고 권한을 나눈 결과, 우리 팀 모두가 깃 사용법에 익숙해졌고 협업 속도는 더욱 빨라졌습니다.
🚀 기술적 성장
- React & MVC: 리액트의 컴포넌트 구조와 Spring MVC 패턴의 데이터 흐름을 완벽히 체득했습니다.
- AI 활용: 단순히 코드를 짜는 것을 넘어, Figma AI로 UI를 그리거나 API 명세 초안을 잡는 등 AI를 효율적인 조력자로 활용하는 법을 배웠습니다.
- 코드 분석: 동료들의 코드를 리뷰하며 타인의 로직을 빠르게 분석하는 힘을 길렀습니다.
🌱 아쉬운 점과 향후 계획
현재는 수정 사항이 생길 때마다 수동으로 빌드하고 SCP로 파일을 전송하고 있습니다. 이 비효율을 줄이기 위해 차후 프로젝트에서는 GitHub Actions나 Jenkins를 활용한 CI/CD 파이프라인을 구축하여 자동 배포 환경을 만들어보고 싶습니다.
마치며: 기술적 완성도를 넘어 협업의 가치를 깨닫다
'Control Tower' 프로젝트는 단순한 코드의 집합이 아니라, 한 명의 개발자로서 제가 가진 기술적 고집과 팀원들에 대한 신뢰 사이의 균형을 배우게 해준 소중한 경험이었습니다.
처음에는 형상관리자로서 모든 것을 완벽하게 통제해야 한다는 강박에 팀원들의 코드를 일일이 확인하기도 했습니다. 하지만 그 과정을 내려놓고 팀원들을 믿기 시작했을 때, 오히려 프로젝트는 더 역동적으로 흘러갔고 예상치 못한 창의적인 해결책들이 쏟아져 나왔습니다.
또한, 처음 시도해 본 AWS 배포와 Nginx 설정 과정에서의 '삽질'은 저에게 시스템의 흐름을 이해하는 안목을 선물해 주었습니다. 눈에 보이는 화면 뒤에서 데이터가 어떻게 흐르고, 보안이 왜 중요한지를 몸소 깨달은 시간이었습니다.
이제 이 경험을 발판 삼아, 다음에는 수동 배포의 번거로움을 해결할 CI/CD 자동화에 도전해 보려 합니다. '멈춰있는 개발자'가 아닌, 어제의 문제를 오늘의 동력으로 삼는 개발자가 되겠습니다. 긴 글 읽어주셔서 감사합니다!