Go언어에서는 여러가지 API 서버를 제공하기 위한 Web Framework가 존재한다. 나는 fiber를 사용하여 최근 프로젝트에 적용했다.
1. Gin
https://github.com/gin-gonic/gin
- Github stars: 77.1K github stars(24.07.27)
- 최초 커밋: 약 2014년
- 중점: 속도, 효율성, 안정성
- 기반 패키지: net/http
속도, 효율성에 중점을 둔 최소한의 디자인을 가진 프레임워크 라이브러리.
라우팅을 Tree 기반의 알고리즘을 기반으로 처리한다.
진 토닉 할때 그 ‘진’이다..
샘플코드
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "안녕")
})
r.RunTLS(":3000", "../certs/server.crt", "../certs/server.key")
}
2. fiber
https://github.com/gofiber/fiber
- 글쓰는 시점 기준(24.07.27) - 32.3K github stars
- 최초 커밋: 약 2020년
- 중점: 속도, 최신 트렌드 기술
- 기반 패키지: fasthttp
속도를 최우선으로 하며, Express.js와 유사한 구조를 가진 프레임워크 라이브러리.
라우팅을 더 빠르게 처리하기 위해 Radix Tree 알고리즘을 사용한다. 이 알고리즘이 URL 패턴 매칭이 더 빠르고 메모리 효율성이 높다고 한다. 또한 Express.js와 비슷한 느낌으로 API를 설계할 수 있도록 제공한다.
샘플코드
package main
import (
"log"
"github.com/gofiber/fiber"
)
func main() {
app := fiber.New()
port := ":3000"
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("안녕")
})
log.Fatal(app.ListenTLS(port, "../certs/server.crt", "../certs/server.key"))
}
프로젝트 내에서의 선택
fiber라는 존재를 최근에 알게되었고 성능이 Gin 보다 나은 성능을 보이고 가볍고 기존에 다른 api 서버에서 사용중인 fastapi와 비슷한 느낌을 Go에서 사용하기 딱이였다. 물론 아래와 같은 조건들을 만족하기에 좋았던 것도 있었다.
- 가벼울 것.
- 괜히 메모리와 프로세스를 많이 사용해서 좋을 것이 없다고 생각
- 챔버를 제어하는 프로그램이 실행되는 PC이므로 꺼지면 안됨
- API 수정이 간단할 것.
- Windows 환경에서 수행 가능할 것
- API 서버 기능 OK, API 따른 다른 제어도 쉬울 것
- 러닝 커브가 적어서 빠르게 적용할 수 있을 것
- API가 웹서비스 처럼 엄청나게 burst하게 들어오는 CASE는 없음
위의 사항과 맞아 떨어져 나는 적용했고 성공적으로 프로그램이 잘 수행되고 있다. :)