이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
안녕하세요
K-IN 입니다.
서론
"이것만 알면 나도 개발 전문가" 시리즈입니다.
"Gin 을 이용한 CRUD RESTful API 개발 Part-4" 를 진행하겠습니다.
Part-4 에서는 RESTful API 를 위한 MongoDB, Redis 를 Docker를 이용해 구성하는 방법을 학습해보겠습니다.
Part-3 의 내용을 아직 학습하지 않았다면 아래의 링크로 접속하여 학습을 순서대로 이어가주세요.
2023.03.02 - [Go] - 고 (Golang) | 이것만 알면 나도 개발 전문가 | Gin 을 이용한 CRUD RESTful API 개발 Part-3
Part-3 코드 내려받기
코드는 이전 시간에 작성한 코드에 이어서 진행하도록 하겠습니다. 아래의 링크에 접근하여 clone 후 코드를 내려 받아 주세요.
https://bitbucket.org/kinstory/gin-tutorial/src/part3/
Docker 의 설치와 docker-compose util 의 사용
Docker 는 여러분의 컴퓨터에 가상환경을 구성해주는 편리한 도구입니다. 아래의 링크에 접근하여 편리하게 설치가 가능합니다.
또한, 근래에는 Docker Desktop 의 유료화 선언으로 인해 podman 혹은 rancher desktop 또한 부상하는 추세이니
만약, 회사에서 이 튜토리얼을 진행하신다면 Docker Desktop 이용에 대해 한번더 검토가 필요합니다.
저는 Rancher Desktop 을 사용하고 있습니다. 그러나 docker engine 을 사용하는 것은 변함이 없기에 명령어는 모두 동일합니다.
아래의 링크들을 참고해서 여러분이 원하는 유틸리티를 설치해주세요.
https://www.docker.com/products/docker-desktop/
설치가 완료되었다면 docker ps 명령어를 통해 docker engine 과 통신이 가능한지 확인해봅니다.
아래의 스크린 샷과 같이 오류 없이 내용이 보인다면 제대로 설치가 완료된 것입니다.
$ docker ps
docker-compose 를 이용한 MongoDB, Redis 구성
docker-compose 는 docker 명령들을 YAML 포맷의 파일에 밀어 넣은 형태입니다.
매번 긴 명령어를 타이핑하다보면 반드시 필요하다고 여길 것이니 이번 기회에 사용해보면 좋습니다.
우선, mongodb 와 redis 사용을 위해 작성한 yaml 파일을 살펴보겠습니다.
$ touch docker-compose.yml
version: '3'
services:
mongodb: # (1)
image: mongo # (2)
container_name: mongodb # (3)
restart: always # (4)
env_file: # (5)
- ./app.env # (6)
ports:
- '6000:27017' # (7)
volumes:
- mongodb:/data/db # (8)
redis:
image: redis:alpine
container_name: redis
ports:
- '6379:6379'
volumes:
- redisDB:/data
volumes:
mongodb: # (9)
redisDB:
- mongodb 는 서비스 이름을 의미합니다. 도커 내의 컨터이너에 이름을 붙인다고 여기면 됩니다. 중복되지 않도록 여러분 만의 이름으로 변경해도 무방합니다.
- docker 는 docker 허브에 업로드된 이미지(image)를 내려 받아 구성하도록 설계되어 있습니다. (물론, 여러분 만의 허브를 만들수도 있습니다만 이 이야기는 본 글의 주제를 벗어나기에 기회가 되면 다루겠습니다) mongo 이미지는 공식 mongo 이미지를 사용하고 있습니다. (이 링크를 참고해주세요. https://hub.docker.com/_/mongo)
- 컨테이너의 이름을 지정합니다. 서비스 이름과 동일하게 지정하였습니다.
- 컨테이너가 종료(exit)될 시에 정책을 지정합니다. 지금은 항상(always) 재시작으로 설정해둡니다. (필요에 따라 no, always, on-failure 등을 설정할 수 있으며 관련 내용은 https://docs.docker.com/compose/compose-file/compose-file-v3/#restart 를 참고해주세요)
- 환경 변수 파일을 지정하는 설정입니다. 프로젝트에 이미 만들어진 app.env 파일을 참조하도록 설정합니다.
- 여러개의 환경 변수 파일을 지정할 수 있으므로 "-" (dash, 대시) 기호 문자를 이용해 리스트 형태로 작성합니다.
- mongodb 는 기본적으로 27017 포트를 사용합니다. 그러나 가상환경이기도 하며 현재 우리 PC 가 사용하는 포트와 겹칠 수 있습니다. 따라서, 6000 포트를 통해서 접근하도록 포트포워딩 설정을 해줍니다.
- mongodb 는 가상화 환경 내에서 /data/db 디렉토리에 정보를 저장합니다. (9)번에서 설명하겠지만 docker 는 volume 자원을 설정가능하고 이름을 지정하여 각 컨테이너에 부여가 가능합니다. volumes 절에서 정의한 mongodb 볼륨을 /data/db 와 연동하여 데이터를 보호 및 다른 서비스와 공유가 가능하도록 합니다.
- (8) 번 항목에서 설명한 이유로 mongodb 서비스를 위한 볼륨을 생성합니다. 이 볼륨은 Mongodb 컨테이너 내의 /data/db 디렉토리 경로에 마운팅됩니다.
docker-compose.yml 파일을 Project Root 경로에 배치합니다. tree 명령어로 보면 아래와 같습니다.
다음으로 app.env 파일에 설정을 추가합니다.
이전 시간에 Viper 를 이용해 환경 변수 파일을 로드하고 적용하는 방법을 배웠습니다.
기억이 나지 않는다면 Part-2 글을 참고해주세요.
2023.03.01 - [Go] - 고 (Golang) | 이것만 알면 나도 개발 전문가 | Gin 을 이용한 CRUD RESTful API 개발 Part-2
app.env 파일에 MongoDB 와 Redis 에 관련된 설정이 추가되었습니다.
docker-compose.yml 파일을 작성하면서 mongodb 서비스에 환경 변수 파일이 등록되는 것을 확인하였을 것입니다.
맞습니다. 이것은 예약된 환경변수 이름이고 mongo 이미지를 제공하는 측에서 미리 약속해둔 키워드입니다.
mongo 이미지는 컨테이너를 생성할 때 미리 약속된 환경 변수를 읽어들여서 mongodb 서비스를 구성하도록 세팅되어 있습니다.
# FileName: app.env
PORT=8001
# Mongo & Redis Configuration
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=password123
MONGODB_LOCAL_URI=mongodb://root:password123@localhost:6000
REDIS_URL=localhost:6379
도커 Hub 에서 mongo 이미지를 찾으면 문서에 아래와 같이 예약된 환경변수들을 확인할 수 있습니다.
(MONGODB_LOCAL_URI 는 웹 어플리케이션에서 사용할 환경변수입니다.)
Taskfile 을 이용한 Docker 컨테이너 셋업
다음으로 이전 시간에 다룬 Taskfile 을 이용해 서비스를 올렸다 내렸다 할 수 있도록 설정합니다.
Taskfile 이 기억나지 않는다면 아래의 Part2 를 잠시 살펴보고 다시 돌아오면 됩니다.
2023.03.02 - [Go] - 고 (Golang) | 이것만 알면 나도 개발 전문가 | Gin 을 이용한 CRUD RESTful API 개발 Part-3
Takefile.yml 파일을 열어 up 과 down 을 추가하고 실행하여 잘동작하는지 확인해봅시다.
version: "3"
tasks:
build:
desc: Build the app
cmds:
- GOFLAGS=-mod=mod go build -o bin/gin-tutorial cmd/main.go
- chmod +x bin/gin-tutorial
run:
desc: Run builded app
cmds:
- bin/gin-tutorial
dev:
desc: Run dev app
cmds:
- GOFLAGS=-mod=mod go run cmd/main.go
up:
desc: Run mongo & redis
cmds:
- docker-compose up -d
down:
desc: Shutdown mongo & redis
cmds:
- docker-compose down
--list 옵션으로 등록된 task 목록을 확인합니다.
차례로 up 과 down 을 실행해서 잘 동작하는지 확인해봅니다.
$ task up
$ task down
맺음말
오늘은 "Gin 을 이용한 CRUD RESTful API 개발" 시리즈의 Part-4 를 진행하였습니다.
docker-compose 유틸리티를 이용해 MongoDB 와 Redis 환경을 간편하게 구성해보았습니다.
이제, 본격적으로 RESTful API 를 개발할 준비 단계가 완료되었네요. (짝짝짝)
오늘 진행한 튜토리얼의 소스는 아래의 경로에서 다운받아서 살펴볼 수 있습니다.
아래 웹 사이트에 방문하셔서 Clone 버튼을 꾹 눌러주세요.
https://bitbucket.org/kinstory/gin-tutorial/src/part4/
이상으로 K-IN 이었습니다.
즐거운 하루되세요