[ 1. gin.Engine & MiddleWare ]
import “gin” - ListenAndServe를 편리하게
go get
github.com/gin-gonic/gin
미들웨어 : 요청과 핸들러(Controller) 사이에서 공통 작업을 처리하는 함수
⇒ 요청을 전처리 or 응답을 후처리할 수 있는 중간 단계 로직
- logging
- recovery
- CORS
- JWT 검증 + 인증/인가
gin module을 활용한 통신 활성화 및 미들웨어 함수 설정
- engin이라는 *gin.Engin 형태의 값을 가지는 Network 구조체 생성
- NewServer( ) 함수 = engin을 가지는 Nework 구조체를 생성 및 return
- gin 객체 생성 = gin.New( )로 engin 생성
- Network 구조체 n에 engin 추가
- 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")
}
여기에 미들웨어 함수 추가 (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
}
[ 2. Network Routing ]
Router는 Spring에서의 controller와 유사
var (
userRouterInit sync.Once
userRouterInstance *userRouter
)
type userRouter struct {
router *Network
}
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
}
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)
*gin.Context
실제 http 데이터 (Spring에서의 servlet 객체)⇒ HttpServletRequest request, HttpServletResponse response의 통합 느낌
- IRoutes는 메서드 체이닝을 위한 리턴 인터페이스go
router.GET("/hello", HelloHandler). Use(AuthMiddleware). POST("/next", NextHandler)
⇒ 이런 식으로 하나의 라우터에서 여러 endpoint를 등록하기 위함