포스트

2024-01-03-TIL

Today I Learned

Developing a RESTful API with Go

Go 공식 문서의 튜토리얼 Developing a RESTful API with Go and Gin을 기준으로 정리했다. 빈티지 재즈 음반 가게를 예로 들어, 음반 목록을 다루는 API를 Gin 웹 프레임워크로 만든다. 튜토리얼은 Gin이 요청 라우팅, 요청 정보 조회, 응답 JSON 변환 같은 일을 단순하게 해 준다고 소개한다.

만드는 엔드포인트는 세 개다.

  • GET /albums: 전체 음반 목록을 JSON으로 돌려준다.
  • POST /albums: 요청 본문의 JSON으로 음반을 추가한다.
  • GET /albums/:id: ID로 음반 하나를 찾는다.

튜토리얼의 main 함수와 핸들러 하나를 줄이면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
func main() {
    router := gin.Default()
    router.GET("/albums", getAlbums)
    router.GET("/albums/:id", getAlbumByID)
    router.POST("/albums", postAlbums)
    router.Run("localhost:8080")
}

func getAlbums(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, albums)
}

Spring과 비교하면 대응 관계가 잘 보인다. gin.Default()로 라우터를 만들고, router.GET이 @GetMapping처럼 경로와 핸들러를 묶는다. 핸들러는 *gin.Context 하나로 요청과 응답을 모두 다룬다. c.BindJSON(&newAlbum)이 @RequestBody처럼 본문을 구조체로 바꾸고, c.Param("id")가 @PathVariable처럼 경로 변수를 꺼낸다. c.IndentedJSON은 구조체를 들여쓰기한 JSON으로 써서 응답한다. JSON 필드 이름은 구조체 필드의 json:"title" 같은 태그로 정한다.

튜토리얼은 데이터를 메모리의 슬라이스에 두기 때문에 서버를 재시작하면 추가한 음반이 사라진다. 실제 서비스라면 DB가 필요하고, 세 번째 링크가 Gin과 GORM으로 DB까지 붙이는 과정을 다룬다. 두 번째 링크는 Gin 말고도 쓸 수 있는 Go REST API 프레임워크들을 비교한다.

  • https://go.dev/doc/tutorial/web-service-gin
  • https://www.moesif.com/blog/api-product-management/api-analytics/Top-5-GO-REST-API-Frameworks/
  • https://blog.logrocket.com/rest-api-golang-gin-gorm/
  • https://pkg.go.dev/google.golang.org/api

AI 키워드: Phi-2

12월 12일 Microsoft Research가 27억 파라미터의 작은 언어 모델 Phi-2를 공개했다. 교과서 수준의 품질을 목표로 고른 합성 데이터와 걸러낸 웹 데이터로 학습했고, 복잡한 벤치마크에서 최대 25배 큰 모델과 비슷하거나 더 나은 성능을 냈다고 밝혔다(Microsoft Research 블로그).

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다