개발놀이터

온라인 쇼핑몰 ver.3 (1) : Docker + Nginx + Jenkins 무중단 배포 본문

사이드 프로젝트/온라인 쇼핑몰 ver.3

온라인 쇼핑몰 ver.3 (1) : Docker + Nginx + Jenkins 무중단 배포

마늘냄새폴폴 2023. 6. 12. 22:52

기왕 시작한거 끝을 보자는 느낌으로 배포까지 진행하자고 생각했습니다. 또한, 단순히 배포하는 것이 아니라 실제 프로덕트에서 사용중인 무중단 배포를 진행해보고 싶었습니다. 

 

무중단 배포에는 크게 세가지 방법이 있었는데 그 중 블루 그린 배포가 매력적이라고 느껴져 무중단 배포에 블루그린 배포를 진행하였습니다. 

 

1. 기존 프로젝트의 배포

  • Cafe 24의 웹 호스팅을 이용해 배포
  • WAR 파일을 이용해 배포

 

2. 기존 프로젝트에서 배포의 문제점

  • 단일 서버이기 때문에 DB 서버만 키운다던가 하는 유연한 대처가 불가능
  • 가장 큰 문제점은 배포를 하고 나서 정상적으로 배포가 안되는 경우가 많았음 
  • 항상 서버를 몇번씩 재시작을 해줘야 정상적으로 서버가 작동되었는데 이 시간이 대략 5분정도 걸렸음

 

3. ver.2에서 개선한 점

  • AWS 클라우드를 이용해 확장성과 유연성을 개선
  • Docker를 이용한 배포로 버저닝을 쉽게 개선
  • Docker와 Nginx를 이용해 블루 그린 배포로 무중단 배포

 

4. ver.2에서 추가적으로 더 개선한 점

  • Jenkins를 이용해 CI / CD 자동화

 

이번 무중단 배포 프로젝트에서 컴포트 존을 벗어나기 위해 다양한 시도들을 했습니다. 

 

  1. AWS 생태계에 대해서 학습 : EC2, Route 53, S3, ACM, ELB, IAM, ECR 등 제가 지금 당장 써야하는 클라우드 서비스에 대해서 학습했습니다. 이를 통해 하나의 프로덕트가 배포될 때 진행되는 사이클을 이해할 수 있게 되었습니다. 
  2. AWS를 위한 linux 학습 : 저는 리눅스를 공부하는 것을 주저했습니다. Windows에 익숙해져있어서 시작하는 것이 쉽지 않았지만 기본 문법부터 차근차근 공부해가니 오히려 Windows보다 리눅스가 더 편한 것도 있었습니다. 
  3. linux 환경에서만 작동하는 docker : 대부분 사람들이 도커를 이용해 배포를 진행했고 Baeldung같은 튜토리얼 사이트에서도 도커를 이용했기 때문에 이참에 docker에 대해 배워야겠다고 생각했습니다. 
  4. Ningx와 같은 프록시 서버 학습 : 기본적인 Nginx의 동작 방식이라든가 configuration 파일을 작성하는 방법에 대해서 학습했습니다.
  5. Jenkins와 같은 CI / CD 자동화 툴 학습 : Jenkins를 공부하면서 점점 편해지는 배포를 맛볼 수 있어서 정말 뜻깊은 경험이었습니다. 

 

다양한 기술들을 접할 수 있는 소중한 경험이었습니다. 

 

5. 이번 프로젝트를 통해 느낀점

CI / CD의 대략적인 개념을 직접 몸으로 체득할 수 있었습니다. 어떤 방식으로 진행이 되며 어떤 방식으로 구현해야 하는지에 대한 전체적인 맥락을 이해하는데 도움이 많이 됐습니다. 

 

특히 도커를 이용한 애플리케이션의 컨테이너화에 대한 개념을 이해하는데 좋은 경험이 되었습니다. 또한, 컴포트 존을 벗어나야 성장할 수 있다는 느낌도 받을 수 있었습니다. 

 

또한, 점점 배포가 쉬워지고 간편해지는 것을 느끼면서 왜 요즘 시대에 배포가 잦아졌는지에 대해서 느낄 수 있었던 좋은 경험이었습니다. 

 

 

6. 추가 설명

1. Cafe 24 배포

기존 프로젝트는 배포를 하는데 아주 심각한 문제가 있었습니다. 제일 처음엔 Cafe 24에 WAR파일을 배포하면서 배포에 대한 기본적인 이해를 높였습니다. 

 

하지만 이 방법은 굉장히 문제가 있었습니다. 만약 업데이트해야 할 내용이 있으면 업데이트를 진행하고 WAR파일을 덮어씌운 다음 서버를 재시작하는데 한번에 서버가 안뜨고 버벅였습니다. 

 

그래서 여러번 재시작을 해줘야했고 이 시간이 5분에서 오래걸리면 10분도 걸릴 때가 있었습니다. 

 

2. AWS EC2 배포

어디서 AWS로 배포했다는 포스팅을 발견하고 저도 시도해보고 싶어서 AWS EC2로 배포를 해봤습니다. 

 

하지만 결과는 실패였습니다. 그 때 당시 리눅스 기본 명령어도 모르던 시기였는데 MySQL을 설치하고 기존 데이터와 마이그레이션 하는 과정에서 문제가 생겼습니다. 

 

MySQL Server도 깔아보고 MySQL client도 깔아보고 별에별 짓을 다했는데 결국 해결하지 못하고 저만치 밀어뒀습니다. 

 

3. AWS EC2 + Docker 배포

그렇게 1년이 지나고 이제 배포에 대해 본격적으로 관심을 가지고 Docker라는 기술을 배워야겠다는 생각을 가졌습니다. 

 

Docker를 이용한 배포는 정말 신세계가 아닐 수 없었습니다. 단순 EC2 배포에서 속을 썩였던 MySQL도 뚝딱 만들 수 있고 무엇보다 버전관리를 하는 것이 매우 편했습니다. 

 

만약 EC2 배포에서 MySQL 버전을 높여야한다면 MySQL의 그 지겹도록 복잡한 삭제부터 시작해서 다시 처음부터 다운로드 하는게 만만치않은 일일거라고 생각했습니다. 

 

Docker를 신세계였고 저에게 적잖은 충격을 줬습니다. 하지만 이 방법에도 문제는 있었습니다. 

 

Docker 컨테이너를 내렸다가 다시 배포할 때 30초~1분 가량 시간이 필요하다는 점이었습니다. 제 프로젝트 컨셉은 이용자수가 1000만명일 때 발생하는 문제들을 개선하는 것이기 때문에 이는 큰 문제가 됐습니다. 

 

만약 1000만명이 있다면 30초~1분내에 일어날 어마어마한 결제량이 모두 손실로 이어지는 것이었습니다. 

 

4. AWS EC2 + Docker + Nginx 무중단 배포

무중단 배포를 위해 블루 그린 배포에 대해서 공부하게 되었고 Nginx 와 같은 프록시 서버를 앞에 두고 로드밸런서로써 사용해 블루 그린 배포를 성공적으로 완료할 수 있었습니다. 

 

굉장히 혁신적이었습니다. 직접 경험해본 블루 그린 배포의 장점은 사용자 입장에서 새로고침 혹은 다른 액션을 취하면 곧바로 버전 업이 된 상태로 진행할 수 있다는 점이었습니다. 

 

하지만 이 방법의 문제점은 배포 과정이 엄청나게 복잡하다는 것이었습니다. 다른 버전으로 갈아 끼우기 위해선 8개의 단계를 거쳐야 했고 이는 굉장한 낭비였습니다. 

 

5. AWS EC2 + Docker + Nginx + Jenkins CI / CD 자동화

Jenkins를 이용해 배포를 자동화하는 경험은 저에게 그야말로 다른 세상이었습니다. 파이프라인을 구축하면서 다양한 트러블이 있었지만 모두 해결한 다음에는 정말 큰 충격이었습니다. 

 

여덟개의 복잡한 단계가 원클릭으로 해결되는 모습을 직접 보고있으니 점점 무서워지기 시작했습니다. 

 

(6. Kubernetes)

이 단계는 아직 적용하지 않았지만 쿠버네티스로 서버를 관리하는 모습을 본 적이 있습니다. 그 경험은 제가 Jenkins를 이용해 자동화에 성공했을 때와 같은 충격이었습니다. 

 

CI / CD 자동화를 넘어 컨테이너를 자동으로 관리해주는 기술이라니 미쳤다는 말 밖에 할 수 없었습니다. 

 

이 기술도 언젠가 꼭 경험해보고 싶은 기술 중 하나입니다.