ASHD Dev_Blog

HTTP_1 : API in GO / gin

이재룡
이재룡Jun 26, 2025

[ 1. gin.Engine & MiddleWare ]

import “gin” - ListenAndServe를 편리하게

미들웨어 : 요청과 핸들러(Controller) 사이에서 공통 작업을 처리하는 함수

요청을 전처리 or 응답을 후처리할 수 있는 중간 단계 로직

  • logging
  • recovery
  • CORS
  • JWT 검증 + 인증/인가

gin module을 활용한 통신 활성화 및 미들웨어 함수 설정

  1. engin이라는 *gin.Engin 형태의 값을 가지는 Network 구조체 생성
  1. NewServer( ) 함수 = engin을 가지는 Nework 구조체를 생성 및 return
    • gin 객체 생성 = gin.New( )로 engin 생성
    • Network 구조체 n에 engin 추가
  1. StartServer( ) 함수 = n.Engin.Run(”:포트번호”)를 통해 해당 포트를 open
    • Network 구조체를 받아서
type Network struct {
	engin *gin.Engine
}

func NewServer() *Network {
	n := &Network{engin: gin.New()}
	}))
	return n
}

func (n *Network) StartServer() error {
	log.Println("Starting server...")
	return n.engin.Run(":8080")
}
go

여기에 미들웨어 함수 추가 (n.engin.Use를 통해 )

func NewServer() *Network {
	n := &Network{engin: gin.New()}

	n.engin.Use(gin.Logger())
	n.engin.Use(gin.Recovery())
	n.engin.Use(cors.New(cors.Config{
		AllowWebSockets:  true,
		AllowOrigins:     []string{"*"},
		AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
		AllowHeaders:     []string{"*"},
		AllowCredentials: true,
	}))
	return n
}
go

[ 2. Network Routing ]

Router는 Spring에서의 controller와 유사

var (
	userRouterInit     sync.Once
	userRouterInstance *userRouter
)

type userRouter struct {
	router *Network
}
go
  • sync.Once.Do : 동일한 userRouter가 여러 개 생기는 것을 방지

    ⇒ Spring에서의 Bean을 등록하는 @Component 와 유사한 역할

func newUserRouter(router *Network) *userRouter {
	userRouterInit.Do(func() {
		userRouterInstance = &userRouter{router: router}

		router.registerPOST("/", userRouterInstance.create)
		router.registerGET("/", userRouterInstance.get)
		router.registerUPDATE("/", userRouterInstance.update)
		router.registerDELETE("/", userRouterInstance.delete)
	})
	return userRouterInstance
}
go
  • userRouterInstance = &userRouter{router: router}

    ⇒ &userRouter로 포인터로, 원본 데이터를 수정이 가능하도록 설정

  • .create 등은 모두 핸들러의 역할

[ 3. Handler & IRoutes ]

handler는 Spring에서의 Controller의 method와 유사

서비스(동작)으로 가기전 필요한 데이터 req, res, session 등을 추출하는 메소드

func (r *Network) registerGET(path string, handler ...gin.HandlerFunc) gin.IRoutes {
	return r.engin.GET(path, handler...)
}

type HandlerFunc func(*gin.Context)
go
  • *gin.Context 실제 http 데이터 (Spring에서의 servlet 객체)

    ⇒ HttpServletRequest request, HttpServletResponse response의 통합 느낌

  • IRoutes는 메서드 체이닝을 위한 리턴 인터페이스
    router.GET("/hello", HelloHandler).
          Use(AuthMiddleware).
          POST("/next", NextHandler)
    go

    ⇒ 이런 식으로 하나의 라우터에서 여러 endpoint를 등록하기 위함