식대앱 개발기 #2: 외부 접속 불가 위기를 AWS와 Google API로 우회하기

사내 서버의 한계를 넘어 클라우드와 API 연동으로 사용자 경험을 극대화한 여정을 공유합니다.

AWSGoogle SheetsFullCalendarHammer.js
--

💡 해결 방안: 클라우드로의 과감한 전환

사내 서버를 고집하는 대신, AWS Lightsail을 메인 서버로 채택하고 데이터를 외부에서도 접근 가능한 곳으로 옮기기로 했습니다.

Amazon Lightsail 로고

핵심 아이디어: "데이터의 탈출"

  1. AWS Lightsail: 안정적인 외부 접속 포인트 확보.
  2. S3 Bucket: 기존 엑셀 파일을 클라우드 저장소로 이전.
  3. Google Sheets API: 협업과 실시간 정산 확인을 위한 간이 DB로 활용.

🛠️ 주요 구현 기능: "사용자 경험(UX)에 집착하기"

단순히 기능만 옮기는 것이 아니라, 실제 사용자가 "와, 진짜 편하다"라고 느낄 수 있는 요소들을 채워 넣었습니다.

1. 점심조 제비뽑기: GSAP으로 구현한 역동성

단순한 텍스트 결과보다는 '뽑는 즐거움'을 주고 싶었습니다. **GSAP(GreenSock)**을 활용해 실제 카드가 섞이고 뒤집히는 듯한 애니메이션을 구현했습니다.

  • 성능: 60fps의 부드러운 움직임 보장.

  • 제어: JavaScript로 복잡한 타임라인을 정밀하게 제어.

    실제 점심조 뽑기 화면

2. Google Sheets: 서버 없는 실시간 DB

P&C팀이 개발 지식 없이도 데이터를 관리할 수 있도록 Google Sheets API를 연동했습니다.

  • 점심조 관리: 시트에 이름만 넣으면 결과가 앱과 실시간 동기화.

    P&C 팀에서 관리하는 점심조 구글시트

  • 자동 정산: 모든 직원의 잔액을 계산하여 초과 인원을 자동으로 하이라이트.

    P&C 팀에서 관리하는 식대 정산 구글시트

3. FullCalendar & 공공데이터 API: 똑똑한 달력

매달 공휴일을 수동으로 입력하는 번거로움을 한국천문연구원 특일 정보 API로 해결했습니다.

  • 근태 상태 표시: 🍙(정상), ⏱️(반차), 🏠(재택), 🌴(휴가) 아이콘 자동 매칭.

  • 공휴일 자동 업데이트: API를 통해 누락된 공휴일을 엑셀에 자동 기입.

    캘린더 화면

4. HammerJS: 모바일 퍼스트 제스처

모바일 사용성을 극대화하기 위해 터치 제스처를 도입했습니다.

  • Swipe (좌/우): 달력의 이전 달, 다음 달 이동.
  • Pan (드래그): 식대 내역을 오른쪽으로 밀어서 즉시 삭제.

Tip: 버튼을 누르는 것보다 스와이프로 삭제할 때 사용자의 '심리적 마찰'이 크게 줄어듭니다.


📊 엑셀 처리 라이브러리 비교: 왜 ExcelJS인가?

기존 엑셀의 복잡한 수식과 스타일을 유지하는 것이 핵심이었기에 두 라이브러리를 면밀히 비교했습니다.

항목ExcelJSxlsx (SheetJS)
스타일 유지✅ 셀 색상, 테두리 완벽 보존❌ 기본형은 스타일 초기화
수식 지원✅ 엑셀 수식 그대로 활용 가능⚠️ 제한적
API 편의성✅ 직관적이고 현대적인 방식⚠️ 다소 복잡한 셀 주소 방식

결론: 기존 사내 엑셀 폼을 그대로 활용해야 했기에 ExcelJS가 압승이었습니다.


🏗️ 전체 시스템 아키텍처

AWS Lightsail을 중심으로 한 새로운 구조는 다음과 같습니다.


🚀 마치며: 위기는 곧 성장의 기회

사내망의 벽에 가로막혔을 때 클라우드로 눈을 돌린 것은 신의 한 수였습니다.

덕분에 외부 접속 문제 해결은 물론, Google API를 활용한 업무 자동화까지 이뤄낼 수 있었습니다.

기술적 제약이 올 때 그것을 "안 된다"고 포기하기보다,

"다른 길은 없을까?" 고민하는 과정에서 진짜 실력이 쌓인다는 것을 체감한 프로젝트였습니다.

다음 편 예고

이제 기능은 완성되었습니다! 하지만 매번 브라우저로 접속하긴 번거롭죠. 다음 편에서는 **PWA(Progressive Web App)**를 통해 앱처럼 설치하고 사용하는 방법과 보안 강화 과정을 다루겠습니다.

댓글

0/2000
Newsletter

이 글이 도움이 되셨나요?

새로운 글이 발행되면 이메일로 알려드립니다.

뉴스레터 구독하기