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 블로그).
댓글
아직 댓글이 없습니다