Gin을 사용하여 나의 첫 번째 실제 Go API 구축하기

이론에서 실습으로 넘어가는 중입니다.

struct, interface, goroutine, 그리고 error handling을 공부한 후, Go와 Gin 프레임워크를 사용하여 실제로 작동하는 Orders API를 구축했습니다.

이 API는 세 가지 작업을 수행합니다:

  • 주문 생성 (Create an order)
  • ID로 주문 조회 (Fetch an order by ID)
  • 모든 주문 목록 조회 (List all orders)

Gin을 선택한 이유는 라우팅과 미들웨어를 단순화해주기 때문입니다. c.JSON이나 c.AbortWithStatusJSON과 같은 헬퍼 함수를 제공하여 반복적인 코드를 줄여줍니다.

프로젝트 구조: 깔끔한 구성을 위해 플랫(flat) 패키지 레이아웃을 사용했습니다:

  • handler: HTTP 로직 관리.
  • model: 데이터 구조 정의.
  • store: 데이터 저장 처리.
  • middleware: 로깅 및 요청 관리.

주요 기술적 선택 사항:

• 데이터 검증 (Data Validation) JSON 직렬화를 위해 struct tag를 사용했습니다. 또한 Gin binding tag도 사용했습니다. 이를 통해 필수 필드가 존재하는지, 금액이 0보다 큰지 등을 확인할 수 있습니다.

• 영속성 및 동시성 (Persistence and Concurrency) 현재 버전은 인메모리(in-memory) 저장소를 사용합니다. 동시 접근을 관리하기 위해 sync.RWMutex를 사용했습니다. 이를 통해 여러 개의 읽기 작업은 허용하면서 쓰기 작업은 안전하게 보호합니다.

• 인터페이스 (Interfaces) handler는 OrderStore 인터페이스에 의존합니다. 데이터가 메모리에 있는지 데이터베이스에 있는지 상관하지 않으므로, 저장 계층(storage layer)을 교체하기가 매우 쉽습니다.

• 에러 처리 (Error Handling) ErrNotFound와 같은 특정 에러를 확인하기 위해 errors.Is를 사용했습니다. 이를 통해 API가 사용자에게 적절한 404 상태 코드를 반환할 수 있습니다.

• 미들웨어 (Middleware) 커스텀 로거를 구축했습니다. 메서드, 경로, 상태 코드 및 요청 소요 시간을 추적합니다.

이 설정은 이전 파트에서 배운 모든 내용을 하나로 모아줍니다. 기능적이고 구조적이며 확장 가능한 기반이 됩니다.

여러분은 Go 프로젝트를 어떻게 구성하시나요? 플랫한 패키지를 선호하시나요, 아니면 도메인 중심의 깊은 계층 구조를 선호하시나요?

출처: https://dev.to/mihirmohapatra/building-my-first-real-api-in-go-with-gin-3kio