이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
안녕하세요
K-IN 입니다.
서론
"이것만 알면 나도 개발 전문가" 시리즈입니다.
이번 시간에는 Gin Web Framework 를 이용해 CRUD RESTful API 를 만드는 방법을 소개해드리겠습니다.
개발 프로젝트의 종류는 매우 다양합니다.
라이브러리, 유틸리티, 웹 어플리케이션, 데몬, 미들웨어, GUI 프로그램 등등 매우 다양합니다.
이중에 우리가 실제 업무에 자주 사용하는 프로그램의 타입은 웹 어플리케이션입니다.
다음, 네이버 등등의 모든 서비스들은 웹 서버를 통해 구현되었습니다.
이 모든 것들이 웹 어플리케이션입니다.
이번 시간은 Golang, Gin, MongoDB 을 이용해 CRUD RESTFul API 를 만드는 방법을 알아보겠습니다.
이를 이용해 회원가입, 로그인 등의 기본적인 기능을 제작해보겠습니다.
Gin Web Framework 소개
Gin 은 Go 로 작성된 웹 프레임워크입니다. 빠른 속도와 미들웨어 지원 그리고 Crash 발생에 자유롭습니다.
RESTFul API, HTML 렌더링 등 다양한 구현이 가능합니다.
https://github.com/gin-gonic/gin
Gin 프로젝트 기본 구성
간단한 Gin 프로젝트부터 시작해서 서서히 기능을 붙여 가능 방향으로 진행해보겠습니다.
우선 프로젝트 세팅을 해볼까요? Go 언어 버전은 최신인 1.20.1 버전입니다.
gin-gonic01 폴더를 생성하고 Go 프로젝트를 세팅해봅시다.
mkdir gin-gonic01
cd gin-gonic01
go mod init k-in.com/gin-gonic01
그리고 gin-gonic 을 프로젝트에서 사용하기 위해 모듈을 설치해볼까요?
$ go get -u github.com/gin-gonic/gin
프로젝트 구성을 위해 아래와 같이 폴더를 구성합니다.
- config : dotenv 와 같은 환경 설정 파일을 읽어오는 소스코드가 위치합니다.
- controllers : 비즈니스 로직을 정의하는 컨트롤러 코드가 위치합니다. 회원가입, 로그인 등의 처리를 담당합니다.
- middleware : JWT 와 같은 토큰을 역직렬화하고 이를 컨트롤러에 넘겨줍니다.
- routes : 정의된 컨트롤러에 접근하는 URI 를 정의합니다. 보통 라우팅을 설정한다고 말합니다.
- services : MongoDB 등의 데이터베이스 등에 접근 및 데이터를 끌어오는 역할을 합니다.
- templates : 메일 발송 및 렌더링할 HTML 템플릿 파일을 지정합니다. 여기서는 Go 에서 제공하는 기본 템플릿 라이브러리르 사용합니다.
- utils : 토큰 파싱, 메일 발송 등의 소스가 위치합니다.
- cmd: main 함수가 위치하며 서버 생성 등의 코드가 위치합니다.
프로젝트 볼륨이 너무 커서 걱정이신가요? 걱정하지 마세요.
작은 기능부터 하나씩 개념을 덧붙이며 성장하는 방식으로 여러분들을 가이드할 예정입니다.
아래의 명령어로 간단히 폴더들을 생성해봅시다.
mkdir config controllers middleware routes services templates utils cmd
tree 명령어를 이용해 폴더 구조를 한번 볼까요? tree 명령어가 없다면 아래와 같이 설치해주세요.
$ brew install tree
위와 같이 구성하였다면 개발을 위한 기본적인 프로젝트 구조를 갖추었습니다.
이제 gin 을 이용해 간단한 웹 어플리케이션을 만들어보겠습니다.
Gin 을 이용한 간단한 웹 어플리케이션 작성
무엇이든 간단한데서 출발해서 복잡한 구현으로 나아갑니다.
우선 간단히 웹 어플리케이션이 활성화되어 있는지 체크하는 로직을 작성해봅시다.
우선, cmd/main.go 파일을 함께 작성해 볼까요.
- (0) : Default 함수는 Engine 인스턴스를 리턴한다. 반환된 인스턴스는 Logger 와 Recovery 미들웨어가 부착된 상태입니다.
- (1) : /health URI 로 접근하는 경우 ok 를 리턴하는 간단한 JSON 응답을 리턴하는 로직을 작성하기 위해 Engine 인스턴스에 GET 함수를 불러와 URI 값과 Handler 를 정의해봅시다. Handler 는 HandleFunc 타입으로 func(*Context) 와 같이 정의되어 있습니다. 즉, gin 패키지에서 제공하는 Context 만을 인자로하는 함수 타입만 제공되어야 합니다.
- (2) : gin 패키지에서 제공하는 Context 타입은 JSON 함수를 내장하고 있으며 JSON 응답을 지원합니다. 우리는 200 OK 상태를 리턴함과 동시에 message: ok 라는 json 데이터를 내려주어야 합니다. 여기서 gin.H 를 이용해 내려줄 데이터를 Key-Value pair 데이터 형태로 내려줍니다. gin.H 는 map[string]any 타입입니다.
- (3) : TCP 8000 번 포트로 서비스를 제공할 예정이기에 ":8000" 를 지정합니다. log.Fatal 함수를 통해 서버가 어떠한 이유로 종료할 경우 error 정보를 로깅하도록 설정합니다.
// FileName: cmd/main.go
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
server := gin.Default() // (0)
server.GET("/health", func(ctx *gin.Context) { // (1)
ctx.JSON(http.StatusOK, gin.H{"message": "ok"}) // (2)
})
log.Fatal(server.Run(":8000")) // (3)
}
아래는 gin 에서 정의하는 핸들러의 타입(HandlerFunc)과 H 타입(map[string]any)입니다.
// FileName: github.com/gin-gonic/gin@v1.9.0/gin.go
// (중략)
// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)
// FileName: github.com/gin-gonic/gin@v1.9.0/utils.go
// (중략)
// H is a shortcut for map[string]interface{}
type H map[string]any
작성한 프로그램을 한번 실행해볼까요?
$ go run cmd/main.go
http://127.0.0.1:8000/health URL 로 접근합니다. 접근하면 아래와 같이 의도한 응답이 내려졌음을 확인할 수 있습니다.
맺음말
오늘은 "Gin 을 이용한 CRUD RESTful API 개발" 시리즈의 Part-1 을 다루어보았습니다.
간단한 웹 어플리케이션 작성으로 Gin 웹 프레임워크의 간단한 기본구조를 살펴보았습니다.
오늘 진행한 튜토리얼의 소스는 아래의 경로에서 다운받아서 살펴볼 수 있습니다.
아래 웹 사이트에 방문하셔서 Clone 버튼을 꾹 눌러주세요.
https://bitbucket.org/kinstory/gin-tutorial/src/part1/
이상으로 K-IN 이었습니다.
즐거운 하루되세요