팀과 기술의 리빌드 — 다시 일하는 법을 정비하다
요약: REINDEERS는 시스템을 다시 설계하기 전에 먼저 팀을 해체했다. 기존 인력 전원이 퇴사한 후, 기술 커트라인을 통과한 새로운 엔지니어들로 조직을 재구성했다. 이후 Drone 기반 CI/CD, Git 워크플로우, 테스트 자동화, AI 협업 체계까지 모든 기술 문화가 새롭게 정의되었다.
1. 리빌드의 시작 — 사람부터 바꿨다
2025년 4월 초, REINDEERS는 중대한 결정을 내렸다. 시스템을 새로 만드는 일보다 먼저, 사람을 바꾸기로 한 것이다. 플랫폼은 기술로 움직이지만, 운영의 일관성을 무너뜨리는 것은 언제나 사람이다.
결국 기존 직원들은 모두 퇴사했다. 이전 팀은 실험적이었지만, 운영 가능한 구조를 만들기엔 역부족이었다. 남은 것은 코드 일부와 배포 스크립트뿐이었다. 우리는 그 위에 새로운 문화를 세우기보다, 완전히 새 팀을 만드는 길을 선택했다.
“사람을 남긴 게 아니라, 기준을 남겼다.”
2. 새 팀의 탄생 — 기술 커트라인부터 통과해야 했다
신규 채용의 기준은 단순했다. “운영 가능한 기술을 이해하는가.” 단순히 코드를 작성할 줄 아는 개발자가 아니라, 시스템이 어떻게 동작하고 복제되며, 장애를 어떻게 복구해야 하는지를 아는 엔지니어만이 합류할 수 있었다.
기술 커트라인 (필수 항목)
- Nuxt 3 / Vue3 + SSR 구조 이해
- Python / Node.js 기반 API 서버 설계 경험
- Drone CI/CD 파이프라인 구축 및 유지 경험
- Tencent Cloud CLI 활용 및 COS/CDN 배포 자동화
- Redis TTL 관리, MQ(AMQP) 이벤트 설계 경험
- Git 브랜치 전략 및 Pull Request 프로세스 숙지
- 테스트 주도 개발(TDD) 및 ESLint / Vitest 환경 설정 경험
신규 구성원들은 모두 위 기준을 통과해야 했으며, 각자 DevOps·Front·API·Data·AI 셀로 배치되었다. 시스템 설계보다 먼저, 운영 가능한 인력을 확보하는 것이 첫 번째 과제였다.
3. 셀(Cell) 구조 — 기술 중심의 운영 단위
새 팀은 기능 중심이 아니라, 기술 중심으로 구성되었다. 각 셀은 자체 파이프라인을 가지고 있고, 코드 품질과 배포 성공률에 대한 책임을 스스로 진다.
엔지니어링 셀 구조
[CELL-A] Front-End (Nuxt + Vue3)
- i18n, SEO, CDN 최적화
[CELL-B] Back-End (Python, Node.js)
- API Gateway, MQ, Redis
[CELL-C] DevOps (Drone, COS/CDN, DNSPod)
- CI/CD, 보안, 배포 자동화
[CELL-D] Data/AI (FastAPI)
- AI 코드 리뷰, 로그 분석, 자동화 모듈
셀 간 통신은 MQ를 통해 이루어진다.
공통 이벤트는 reindeers.global 익스체인지에서 주제별로 분리된다.
4. Git 정책 — 일관성과 승인 절차의 표준화
모든 코드 변경은 Git Flow를 기반으로 하며, PR(Pull Request) 단위로 검토된다. 커밋 메시지는 Conventional Commits 형식을 따라야 하며, Signed Commit(GPG)만 Merge 가능하다.
main → 프로덕션 (자동 배포)
develop → 통합 테스트 환경
feature/* → 기능 단위 브랜치
release/* → 사전 배포
hotfix/* → 긴급 수정
코드 리뷰는 AI + 인간 리뷰 체계로 구성되어 있다. AI가 기본 문법·보안·리스크를 검토하고, 최종 승인은 사람이 담당한다.
5. Drone CI/CD — 완전 자동화와 환경 격리
새 팀은 Drone을 단순한 빌드 도구가 아닌 운영 자동화 엔진으로 사용한다. 각 환경(dev/stg/prod)은 격리되어 있으며, 환경 변수는 Tencent Cloud KMS로 암호화된다.
Drone 파이프라인 예시
kind: pipeline
type: docker
name: reindeers-deploy
trigger:
branch: [ main, develop ]
steps:
- name: build
image: node:20
commands:
- npm ci
- npm run lint
- npm run test
- npm run build
- name: upload
image: tencentcloud/tencentcloud-cli
environment:
COS_BUCKET: reindeers-fe
COS_REGION: ap-hongkong
commands:
- tccli cos PutObject --bucket $COS_BUCKET --region $COS_REGION \
--file ./.output/public --key / --acl public-read
- name: purge-cdn
image: alpine/curl
commands:
- curl -X POST https://cdn.tencentcloudapi.com/purge?path=https://static.reindeers.com/assets/*
- name: notify
image: plugins/slack
settings:
webhook: https://hooks.slack.com/services/xxxx/yyyy
channel: "#deploy"
template: "✅ Deploy completed for {{build.branch}}"
배포 성공률은 99.3% 이상을 유지하며, 모든 로그는 COS에 보존되어 트레이서빌리티가 확보된다.
6. 코드 품질과 테스트 자동화
모든 코드 빌드 전에 ESLint, Prettier, Vitest 테스트가 자동 실행된다. 한 단계라도 실패하면 Drone은 빌드를 중단한다.
테스트 예시
"scripts": {
"lint": "eslint --ext .ts,.vue src",
"format": "prettier --write src",
"test": "vitest run",
"build": "npm run lint && npm run test && nuxt build"
}
테스트 결과는 JSON 포맷으로 COS에 업로드되며, Grafana에서 대시보드로 시각화된다. 이는 DevOps 셀에서 실시간으로 모니터링된다.
7. 보안 및 접근 통제
새 팀의 접근 정책은 IAM 최소권한 원칙을 따른다. Git 접근은 GPG 서명된 커밋만 허용되고, Drone 환경 변수는 KMS 암호화를 거친다. Cloud Audit이 모든 API 호출 이력을 실시간으로 기록한다.
{
"Version": "2.0",
"Statement": [
{
"Effect": "Allow",
"Action": [ "cos:PutObject", "cdn:PurgePathCache" ],
"Resource": "qcs::cos:ap-hongkong:uid/1234567890:reindeers-*/*"
}
]
}
8. 문화적 전환 — 코드가 아니라 구조를 관리한다
새 팀의 원칙은 “누가 만들었는가”가 아니라 “어떻게 운영되는가”였다. 각 셀은 독립적으로 운영되지만, 코드 스타일·배포 규칙·보안 정책은 모두 일관화되어 있다.
AI 리뷰, Drone 자동화, 테스트 통합 덕분에 사람이 개입하는 비율은 줄었고, 개발자는 문제 해결과 설계에 더 많은 시간을 쓸 수 있게 되었다.
“이제 시스템은 사람의 개입 없이도 스스로 운영된다. 엔지니어는 구조를 설계하는 역할로 돌아왔다.”
9. 결론 — 팀이 바뀌자, 시스템이 바뀌었다
기존의 개발 방식은 실험적이었지만 지속 불가능했다. 인적 구조를 먼저 정리하고, 그 위에 새로운 시스템을 세웠기에 지금의 안정성이 가능했다.
REINDEERS는 이제 사람에 의존하지 않는 구조를 갖췄다. 팀이 시스템을 만들던 시대에서, 이제 시스템이 팀을 규정하는 시대로 전환되었다.
“퇴사로부터 시작된 리빌드는, 가장 기술적인 결정이었다.”