영업 CRM의 Gmail 및 Calendar 동기화
암호화된 토큰, 백그라운드 작업자, 매일 실행되는 Go 대조 작업을 포함해 제가 만든 두 가지 Google OAuth 연동입니다.
내 역할: 단독 개발. OAuth 연동 두 개와 동기화 함수를 제가 만들었습니다. 주변 CRM은 3인 팀과 공동 개발했습니다.
2025년 10월부터 2026년 7월까지
- C#/.NET 8
- Go
- Google OAuth
- GCP Cloud Scheduler
CRM에 받은편지함이 필요한 이유
파이프라인 보드의 카드 하나는 거래 한 건을 나타내지만, 실제 활동의 상당 부분은 다른 곳에서 일어납니다. 이메일로 견적을 보내고, 고객의 답장을 받고, 현장 방문을 캘린더에 추가합니다.
영업팀에 이 내용을 모두 CRM에 직접 복사해 달라고 할 수는 없습니다. 시간이 지나면 보드의 정보가 낡고, 사람들은 그 안의 내용을 믿지 않게 됩니다.
이를 피하려고 CRM에서 Gmail과 Google Calendar를 직접 동기화합니다. 이 과정에는 개인의 받은편지함에 접근할 수 있는 장기 유효 Google refresh token을 저장해야 하므로 주의가 필요합니다.
제가 만든 것
운영 콘솔에서 사용하는 .NET 8 API 안에 두 연동을 모두 만들었습니다. 주변 CRM은 3인 팀이 공동 개발했지만, OAuth 흐름부터 백그라운드 동기화까지 Google 연동은 제가 담당했습니다.
Gmail 연동은 약 1,200줄이며, 중심에 약 500줄의 서비스가 있습니다. OAuth 흐름과 토큰 갱신을 관리하고, 새 메시지를 가져온 다음 관련 이메일을 올바른 설치 건에 연결합니다.
Google Calendar 연동에는 약 1,400줄이 추가됐습니다. 일정과 참석자를 동기화하고 파이프라인의 설치 건에 연결합니다. 캘린더의 방문 일정과 카드에 표시된 일정이 별개 기록으로 갈라지지 않고 같은 데이터를 사용합니다.
모든 access token과 refresh token은 저장 전에 AES로 암호화합니다.
데이터를 최신 상태로 유지하는 두 가지 방법
동기화에는 두 가지 방법을 사용합니다. .NET API 안에서 돌아가는 백그라운드 작업자와, GCP Cloud Scheduler가 하루에 한 번 시작하는 Go Cloud Function입니다.
API 내부 작업자는 사용자별로 증분 동기화합니다. 사람들이 콘솔을 사용하는 동안 이메일과 캘린더 일정을 최신 상태로 유지합니다. 데이터베이스 컨텍스트와 토큰 복호화 기능이 이미 있는 곳에서 실행되므로, 작고 잦은 업데이트를 처리하기 쉽습니다.
예약된 함수는 하루에 한 번 전체를 처리합니다. 현재 보고 있는 설치 건만이 아니라 전체 파이프라인의 Gmail 스레드를 확인합니다. 작업 시간이 길고 빠른 응답이 필요하지 않으므로, API 밖에서 실행해 일반 요청과 자원을 다투지 않게 했습니다.
별도로 실행되기 때문에 이 함수에는 자체 제한 시간과 메모리가 있습니다. 함수가 멈춰도 API는 계속 동작하고, Cloud Scheduler가 다음 날 새 실행을 시작할 수 있습니다.
실패를 알아볼 수 있게 하기
함수 시작 시 필수 환경 변수를 모두 검증하고, 모든 외부 요청에 제한 시간을 두고, 2xx가 아닌 응답은 무시하지 않고 오류로 반환합니다. 아무 일도 하지 않고 성공을 보고하는 예약 작업은 명확하게 실패하는 작업보다 발견하기 훨씬 어렵습니다.
시간대 버그
한때 같은 API의 알림 날짜가 일부 사용자에게 하루 어긋나게 표시됐습니다. 알림은 정확한 시각이 아니라 날짜를 저장하는데, 타임스탬프처럼 처리되어 시간대가 바뀔 때 날짜도 달라진 것이었습니다. 원인을 DateOnly 처리에서 찾아 수정했습니다. UTC에서 실행되는 테스트 환경에서는 나타나지 않던 종류의 문제였습니다.
수치로 보면
Gmail 연동은 약 1,200줄이며 그 안에 500줄의 서비스가 있습니다. Calendar 연동으로는 약 1,400줄이 추가됐습니다. 두 연동과 백그라운드 작업자는 제가 작성했고, 매일 실행되는 Go 대조 함수는 하나의 완성된 커밋으로 배포했습니다.
API 전체에서 저는 총 1,287개 커밋 중 554개(43%)를 작성해, 저장소를 만든 엔지니어 다음으로 많이 기여했습니다. 이 연동을 사용하는 보드는 별도 글에 정리했습니다.
연락하기
원격 프리랜서 업무가 가능합니다. 이메일로 연락해 주시면 가장 빠르게 답변할 수 있습니다.