본문 바로가기
프로그래밍/Go

고 (Golang) | 이것만 알면 나도 개발 전문가 | Gin 을 이용한 CRUD RESTful API 개발 Part-4

by K-인사이터 2023. 3. 2.
반응형

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

 

 

안녕하세요

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/

 

Bitbucket

 

bitbucket.org

 

Docker 의 설치와 docker-compose util 의 사용 

Docker 는 여러분의 컴퓨터에 가상환경을 구성해주는 편리한 도구입니다. 아래의 링크에 접근하여 편리하게 설치가 가능합니다. 

또한, 근래에는 Docker Desktop 의 유료화 선언으로 인해 podman 혹은 rancher desktop 또한 부상하는 추세이니 

만약, 회사에서 이 튜토리얼을 진행하신다면 Docker Desktop 이용에 대해 한번더 검토가 필요합니다. 

 

저는 Rancher Desktop 을 사용하고 있습니다. 그러나 docker engine 을 사용하는 것은 변함이 없기에 명령어는 모두 동일합니다. 

아래의 링크들을 참고해서 여러분이 원하는 유틸리티를 설치해주세요. 

 

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

https://podman-desktop.io/

 

Podman Desktop - Containers and Kubernetes | Podman Desktop

Podman Desktop - An open source graphical tool for developing on containers and Kubernetes

podman-desktop.io

https://rancherdesktop.io/

 

Rancher Desktop

Container Management Container management to build, push, and pull images and run containers. It uses the same container runtime as Kubernetes. Built images are immediately available to use in your local workloads without any pushing, pulling, or copying.

rancherdesktop.io

설치가 완료되었다면 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:

 

  1. mongodb 는 서비스 이름을 의미합니다. 도커 내의 컨터이너에 이름을 붙인다고 여기면 됩니다. 중복되지 않도록 여러분 만의 이름으로 변경해도 무방합니다. 
  2. docker 는 docker 허브에 업로드된 이미지(image)를 내려 받아 구성하도록 설계되어 있습니다. (물론, 여러분 만의 허브를 만들수도 있습니다만 이 이야기는 본 글의 주제를 벗어나기에 기회가 되면 다루겠습니다) mongo 이미지는 공식 mongo 이미지를 사용하고 있습니다. (이 링크를 참고해주세요. https://hub.docker.com/_/mongo
  3. 컨테이너의 이름을 지정합니다. 서비스 이름과 동일하게 지정하였습니다. 
  4. 컨테이너가 종료(exit)될 시에 정책을 지정합니다. 지금은 항상(always) 재시작으로 설정해둡니다. (필요에 따라 no, always, on-failure 등을 설정할 수 있으며 관련 내용은 https://docs.docker.com/compose/compose-file/compose-file-v3/#restart 를 참고해주세요) 
  5. 환경 변수 파일을 지정하는 설정입니다. 프로젝트에 이미 만들어진 app.env 파일을 참조하도록 설정합니다. 
  6. 여러개의 환경 변수 파일을 지정할 수 있으므로 "-" (dash, 대시) 기호 문자를 이용해 리스트 형태로 작성합니다. 
  7. mongodb 는 기본적으로 27017 포트를 사용합니다. 그러나 가상환경이기도 하며 현재 우리 PC 가 사용하는 포트와 겹칠 수 있습니다. 따라서, 6000 포트를 통해서 접근하도록 포트포워딩 설정을 해줍니다. 
  8. mongodb 는 가상화 환경 내에서 /data/db 디렉토리에 정보를 저장합니다. (9)번에서 설명하겠지만 docker 는 volume 자원을 설정가능하고 이름을 지정하여 각 컨테이너에 부여가 가능합니다. volumes 절에서 정의한 mongodb 볼륨을 /data/db 와 연동하여 데이터를 보호 및 다른 서비스와 공유가 가능하도록 합니다. 
  9. (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 는 웹 어플리케이션에서 사용할 환경변수입니다.)

 

mongo 이미지에서 제공하는 미리 약속된 환경변수들 (출처: https://hub.docker.com/_/mongo)

 

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/

 

Bitbucket

 

bitbucket.org

 

 

이상으로 K-IN 이었습니다.

즐거운 하루되세요 

반응형