[Docker 부터 Kubernetes 까지] [#7] Polling Server, Express Server, Nginx 작업하기

Ji Ho Choi
Nov 6 · 13 min read

안녕하세요 소프트웨어 엔지니어 최지호입니다.

아래 블로그로 가시면 더욱 많은 정보를 접해보실 수 있습니다.

오늘은 Polling Server를 작업해보는 시간을 갖어보도록 하겠습니다. 아래는 저희가 기획하는 아키텍쳐의 리뷰입니다.

우선 아래와같은 현재 프로젝트 파일시스템에 Polling Server라는 폴더를 아래와같이 생성해줍니다.

이후 Polling Server 에서 터미널을 실행후 아래 커맨드를 실행해 npm 프로젝트를 초기화 해줍니다

완료되면 package.json 파일이 생성되는걸 보실 수 있으십니다.

Polling Server를 개발할때 필요한 패키지들을 설치해줍니다

개발환경 스크립트를 아래와같이 package.json에 추가해줍니다

위 스크립트를 기반으로 npm run dev를 실행시켰을때 nodemon server.js 가 실행되도록 하는 스크립트를 추가하였습니다.

기존에 nodeJS 도커파일을 생성했던것처럼 Dockerfile을 Polling Server 폴더에 생성하여 아래 내용을 붙여넣도록 하겠습니다.

Polling Server 폴더에 server.js 라는 파일을 생성해주고 아래 코드를 복붙 해주세요.

위 코드는 Hacker News API에서 탑 스토리들의 ID를 먼저 가져오고 각 ID마다 룹을 돌려가며 상세내용을 가져오는 코드입니다. 마지막엔 모든 정보를 array에 넣어 MongoDB에 저장을 해주고 Client에 OK 리스폰스를 보내줍니다. 상세내용은 코드의 주석을 참조해주세요.

Docker Compose를 사용하다보면 가끔 컨테이너끼리 코드를 쉐어링 하고싶은 부분이 있습니다. Stateless App이 디폴트라 최대한 코드쉐어링은 지양하는게 좋지만 Mongoose 스키마 같은경우 오히려 공유가 안되면 컨테이너별로 스키마 버젼이 다를 수 있어서 공유를 해주는게 좋습니다. 이런 문제를 해결하기위해 Docker에서는 Volume Sharing 이라는 기능이 있습니다.

우선 프로젝트 루트에 Shared라는 폴더를 생성해주시고 내부에 mongoose라는 폴더를 추가 생성해주세요. 아래와 같은 폴더구조가 나와야합니다.

mongoose 폴더에 Post.js 라는 파일을 생성해주고 아래의 코드를 복붙 해주세요.

이제 마지막으로 Docker Compose 파일을 작업해주면 됩니다. 아래 코드를 Docker Compose에 추가해주세요.

volume 키의 세번째 값이 shared 폴더에 있는 mongoose 스키마들을 polling server의 도커 내부 파일시스템과 공유하는 부분입니다. 이 똑같은 코드를 나중에 다른 컨테이너를 생성할때도 사용하게되고 결과적으로 Shared 폴더의 코드만 바꾸면 모든 컨테이너에서 mongoose 스키마가 변경됩니다.

추가로 .env 파일에 PollingServer 의 환경변수를 설정해주세요. 아래 코드를 추가해주시면 됩니다.

터미널에서 docker-compose up --build 커맨드를 실행해주세요. Polling Server와 MongoDB가 동시에 실행되실 겁니다. 혹시 MongoDB를 찾을 수 없다는 아래와같은 에러가 난다면 MongoDB가 시작될때쯤 PollingServer 폴더의 server.js 파일에 들어가 // 를 아무 위치에나 입력하고 저장을 해주시면 nodemon 이 코드를 재실행하고 DB에 연결이 되실겁니다.

이제 ExpressServer 를 작업해보겠습니다.

PollingServer 폴더를 그대로 복사해서 이름만 ExpressServer 라고 변경해주세요.

server.js 파일은 위 코드와같이 변경하시면 됩니다.

위 코드는 클라이언트에서 GET /posts 요청을 받고 MongoDB에 posts가 있는지 확인한 후 posts 가 하나도 없으면 PollingServerGET 요청을 하여 Post 들을 데이터베이스에 저장해달라는 요청을 합니다. 여기에서 DNS를 polling_server 로 사용하게 되는데 Docker Compose 에서는 설정 파일에서 지정한 이름들이 자동으로 DNS 등록이 되게 됩니다. docker-compose.yml 파일에 PollingServerpolling_server 로 등록해놨기 때문에 polling_server 라는 도메인으로 요청을 보내게되면 Docker Compose 에 있는 polling_server 컨테이너로 요청이 보내집니다.

이제 .env 파일과 docker-compose.yml 파일을 작업하면 되겠습니다.

.env 파일에 아래 코드를 붙여넣어주세요.

docker-compose.yml 파일에는 아래 코드를 붙여넣어주세요.

PollingServer 와 형태가 유사하고 컨테이너 이름, 폴더등만 살짝 바뀌었습니다.

이제 마지막으로 ExpressServerproxy 해줄 Nginx 의 설계만 남았습니다. 프로젝트 루트에 Nginx 폴더를 생성하고 하위에 conf , logs 폴더들을 생성해주세요. 추가적으로 Nginx 폴더 바로 하위에 Dockerfile 을 생성해주시고 아래 코드를 붙여넣어주세요.

COPY 커맨드 부분은 잠시후 생성할 Nginx Conf 파일을 Nginx 컨테이너 내부의 conf 폴더로 이동시키는 코드입니다.

conf 폴더에 dev.conf 라는 파일을 생성해주시고 아래 코드를 붙여넣어주세요. 설명은 주석으로 작성하였습니다.

이제 마지막으로 docker-compose.yml 파일 작업을 진행하겠습니다. 아래 코드를 docker-compose.yml 파일에 추가해주세요.

Nginx 컨테이너를 호스드 디바이스의 8080 포트로 매핑을 해주고 로그 폴더를 도커와 호스트에서 공유하게 해놓았습니다. 현재 NginxGET /api 를 요청하면 ExpressServerproxy 되도록 세팅을 해놓았기 때문에 포스트맨으로 GET http://localhost:8080/api/posts 요청을 하게되면 아래와같은 플로우가 진행됩니다.

  • GET http://localhost:8080/api/posts
  • Nginx 에서 /api/posts/posts 로 변경 후 ExpressServer 로 전송
  • ExpressServer 에서 /posts 요청 수행
  • Post 가 하나도 없는경우 ExpressServer 에서 PollingServerGET / 요청을 보내 Hacker News 에서 인기 포스트들을 가져와 MongoDB에 저장합니다.
  • PollingServer 에서 ExpressServer 로 OK 리스폰스를 보내고 ExpressServer 에서 클라이언트로 데이터를 포함한 리스폰스를 보냅니다.

이로서 Hacker News의 데이터를 저장하고 클라이언트로 리스폰스를 보내는 플로가 모두 완료되었습니다. 그 과정에서 네개의 microservice 및 Docker Container 들을 제작하였고 이들의 연동 과정에 대해 알아보았습니다. 완성된 코드는 아래 GitHub 링크를 참조해주세요.

다음 글에선 React 프론트엔드 설계 및 Redis 연동하는 과정을 알아보도록 하겠습니다.

withj-kr

초보부터 고수까지 소프트웨어 엔지니어들을 위한 공간

Ji Ho Choi

Written by

withj-kr

withj-kr

초보부터 고수까지 소프트웨어 엔지니어들을 위한 공간

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade