[개발]음력 생일 캘린더 변환기 개발기: 시행착오와 해결 과정
이번 프로젝트를 진행하면서 겪었던 주요 시행착오와 해결 방법을 정리했습니다.
1. 기획의 단순화 (Frontend/UI)
처음에는 사용자가 매우 구체적인 설정을 원할 것이라 생각하여 시작 시간, 종료 시간, 알람 시간까지 모두 선택할 수 있게 만들었습니다.
- 문제점: 생일은 보통 '하루 종일' 이벤트입니다. 굳이 몇 시부터 몇 시까지인지 설정하는 것은 UI를 복잡하게 만들고 사용자에게 불필요한 입력을 요구했습니다.
- 해결: 과감하게 시간 설정과 알람 기능을 모두 제거했습니다. 구글 캘린더 링크 생성 시
dates=YYYYMMDD/YYYYMMDD+1형식을 사용하여 강제로 종일(All-day) 일정으로 등록되도록 변경했습니다. 덕분에 UI가 훨씬 깔끔해졌습니다.
2. "다가오는" 생일 계산 로직 (Backend)
처음에는 단순히 입력받은 **출생 연도(예: 1980년)**의 음력 날짜를 양력으로 변환해주는 기능만 생각했습니다.
- 문제점: 1980년 5월 20일이 양력으로 언제였는지는 사실 캘린더 등록에 중요하지 않았습니다. 사용자가 진짜 원하는 건 "올해(또는 내년) 생일이 양력으로 며칠인가?" 였습니다.
- 해결:
- 입력받은 출생 연도는 무시하고, 올해 연도를 기준으로 먼저 변환을 시도합니다.
- 만약 변환된 날짜가 이미 지난 날짜라면? (예: 오늘이 5월인데 생일이 1월인 경우)
- 자동으로 내년 연도로 (+1) 하여 다시 변환합니다. 이 로직을 추가하여 항상 "가장 가까운 다가오는 생일"을 알려주도록 개선했습니다.
3. 리모트 서버 배포와 아키텍처 문제 (DevOps)
가장 많은 삽질(?)을 했던 구간입니다. 로컬(Mac) 개발 환경과 배포할 서버(Ubuntu) 환경이 달라서 발생한 문제들이었습니다.
3-1. CPU 아키텍처 불일치 (ARM64 vs AMD64)
- 문제점: 제 개발 장비는 M1 Max (ARM64) 칩셋을 사용합니다. 여기서
docker build를 하면 ARM64용 이미지가 생성됩니다. 이걸 그대로 Intel/AMD64 리눅스 서버에 배포하니 컨테이너가 실행되지 않거나 포맷 에러가 발생했습니다. - 해결: 도커 빌드 시
--platform linux/amd64옵션을 명시하여, M1 맥에서도 강제로 AMD64 호환 이미지를 빌드하도록 수정했습니다.docker build --platform linux/amd64 -t lunar-birthday:v8 .
3-2. 자동 배포 스크립트
- 문제점: 매번
scp로 파일을 보내고ssh로 접속해서 명령어를 치는 과정이 번거로웠고, 무엇보다 쉘 스크립트만으로는 비밀번호 입력을 자동화하기 어려웠습니다. - 해결:
expect라는 도구를 사용했습니다. 이 도구는 터미널의 대화(프롬프트)를 감지해서 자동으로 텍스트를 입력해줄 수 있습니다. 이를 통해 파일 전송부터 컨테이너 재시장까지 원클릭 배포 스크립트(deploy_remote.exp)를 완성했습니다.
3-3. sudo 권한 문제
- 문제점: 리모트 서버에서
docker명령어를 쓰려면sudo가 필요했습니다. 스크립트에서 그냥 명령어를 날리면 권한 에러로 실패했습니다. - 해결:
expect스크립트 내에서sudo명령어를 실행하고, "password for..." 프롬프트가 뜨면 자동으로 비밀번호를 다시 입력해주는 로직을 추가하여 해결했습니다.
4. 프로젝트 구조 정리
기존에 다른 프로젝트와 파일이 섞여 있어 관리가 힘들었습니다.
해결: docker-calendar-set이라는 별도 폴더를 생성하여 관련 소스코드와 Dockerfile을 격리했습니다. 이를 통해 빌드 컨텍스트를 명확히 하고, 향후 유지보수를 용이하게 만들었습니다.
결론: 단순한 기능이었지만, 사용자 경험(UX) 개선과 이기종 간 배포 자동화 과정에서 많은 것을 배울 수 있었습니다.
링크:https://trans-lunar-solar.gorilladoll.kr/
