사건의 발달

난 SNS에 사실 업무와 관련된 공적인 글을 자주 쓰는편은 아니다. 하지만 JCE에서 신입시절부터 프로그래밍을 하면서 다른것들은 개선하거나 개인 프로젝트를 통해서 테스트해 볼 수 있었지만 유독! 요(YO)! 빌드 및 배포 프로세스를 개선하기란 쉽지가 않았다. 올해는 프로젝트에 적용하겠다는 신념으로 소문부터 내보았다.

When 신입 1년차

아무생각이 없다. 정말로 아무생각이 없었다!

2년차

TDD에 관심을 가지게 되면서 먼가 이상하다는 것을 느낀다…응(?) 프로그래머는 반복되고 귀찮은 문제를 개선하고 자동화시키는 사람이 아닌가! 팀장님을 설득해본다. 하지만 아쉽게도 내 능력이 부족해 설득하지 못했다(!)

현재

부딪히고 부딪힌다. 무엇보다 현재의 나는 새로운 프로젝트를 시작할 때 단위 테스트를 위한 환경부터 만드는데, CI 서버가 없다는 것은 축구공은 있는데 뛰어놀 그라운드가 없다는것과 무엇이 다르단 말이냣! 올해는 결코 포기할수 없었고, 더욱이 코드가 한 줄만 수정이 되어도 반복적으로 수동으로 빌드하고 배포 일을 기계처럼 하고 싶지 않았다.

안해도 된다는것을 명확히 알았을 때의 차이는 크다!

그래서 먼저 애플리케이션의 빌드, 배포 자동화를 도입하기 위해 팀원들을 설득하기 위한 생각을 간단하게 정리해 보았다. 사실 그 전부터 실행에 옮기고 있었다.(히히)

  • 플랫폼 단위의 서비스를 위해서는 개발, QA, 통합, 운영에 대한 환경이 존재해야하며 이를 효율적으로 관리하고 배포하기 위해서는 Maven 또는 Ant와 같은 빌드 도구 그리고 Jenkins 서버에서 빌드 및 배포 자동화가 꼭 필요하다.
  • 애플리케이션을 배포하기 위해 빌드 하는 과정은 복잡할 뿐만 아니라 개발자가 매번 로컬 환경에서 수동으로 진행할 경우 개발자의 실수로 인해 배포 Version에 이상이 생길 위험이 크다.
  • 같은 이유로 어플리케이션 빌드 및 배포를 처음 접하는 개발자에게는 수동적인 절차 역시 학습에 대한 비용이 부담된다.
  • 웹 어플리케이션 또는 클라이언트 SDK를 배포 하기 위해 의존되는 라이브러리 및 프로젝트는 통합적으로 쉡 스크립트를 통해 자동으로 빌드 또는 배포 버전을 생성할 수 있어야 하며 버전 관리를 통해 얻을 수 있는 점은 장애시에 롤백에 대한 부담이 없어진다는 것이다.
  • Subversion과 같은 SCM을 통해 일정한 주기로 프로젝트의 단위 테스트 코드를 수행 한다면 보다 건강한 애플리케이션을 만나 볼 수 있을 것이다.
  • 서비스와 직접적으로 연관되는 서버 애플리케이션의 빌드 및 배포 프로세스 뿐만아니라 외부 라이브러리 및 SDK를 배포하는 과정도 자동화한다면 상당한 비용을 줄일 수 있을 것 입니다. (바이너리 버전을 자동으로 업로드, API 가이드 문서를 자동으로 생성)

아무튼 이러한 고민의 결과와 포기하지 않았더니 부분적으로 Product에 적용하여 빌드, 배포 프로세스 자동화를 완료하였다. 그 내용을 요약하면 아래와 같다.

  • 개발자는 Subversion에 개발 결과물을 Commit하고, Jenkins 서버에서 빌드 도구를 통해 빌드를 자동화한다.
  • Spring 애플리케이션은 Maven을 통해 빌드하게 되면, 알파/베타/리얼 배포 환경별로 수동으로 설정 파일을 개발자가 관리하지 않아도 된다.
  • Android/iOS와 같은 클라이언트 SDK는 빌드 과정에서 매번 배포되는 API 문서를 자동으로 생성하는 Task를 추가하였다.
  • 클라이언트 SDK의 빌드 결과물을 Redmine API를 이용해 Redmine 게시물에 자동으로 업로드하는 쉡 스크립트를 적용하였다.

아쉬운 부분과 앞으로 해결해야할 과제는 다음과 같다.

  • 테스트 코드를 지속적으로 검증하기 위해 Jenkins를 통해 CI서버를 운용
  • CI서버를 통해 Test Coverage 확인 및 Coverage와 장애발생 비율에 대한 분석한 내용을 공유
  • Test Coverage 뿐만 아니라 Code Quality 를 높히기 위한 다양한 플러그인을 CI서버에 적용
  • CI서버의 히스토리 및 이슈를 프로젝트 담당자에게 Notification 한다

마지막으로 점진적으로 이러한 경험을 확대하고 개발할 때 보다 더 즐겁고 행복할 수 있다는 감정을 공유하고 싶다.