이번 포스팅은 고랭으로 API 서버 구축 시리즈의 1탄으로,
디렉터리 구조 설정 및 Echo 웹 프레임워크 사용 등의 내용입니다:)
환경 구축
Golang 설치 및 사용
soyoung-new-challenge.tistory.com/84?category=893866
> 위 포스팅을 참고하여, Golang 처음 환경을 세팅한다.
Golang 문법 익히기
soyoung-new-challenge.tistory.com/85
> 위 포스팅부터 시작하는 튜토리얼을 참고하여 사용법을 익힌다
Echo : Go Web Framework
soyoung-new-challenge.tistory.com/102?category=893866
> 위 포스팅의 Installation을 참고하여 환경을 준비한다
API 서버
현재 디렉토리 구조
현재 디렉토리디렉터리 구조는 다음과 같이 구성되어있다. 상황과 용도에 맞게 디렉터리 구조를 정하면 된다.
폴더 단위
> auth/ : 승인관련 로직 구현
> docs/ : API document 생성 관련
> handler/ : 실제 사용되는 함수 로직 구현
> models/ : struct 구조체 선언
> mongo/ : MongoDB 요청 함수 관련 요구 사항 정의
ㄴ crud/ : MongoDB에 직접적으로 요청하는 로직
ㄴ mongodb_auth.json : MongoDB 접속 정보가 있는 json 파일
> router/ : Echo Router 정의
> utils/ : 자주 사용하는 utils
파일 단위
> .gitignore : git ignore 파일
> Dockerfile : 도커 생성 파일
> main.go : Go 실행을 위한 메인 파일
main.go 파일
실제 서버 구동을 위한 main.go 파일
package main
import (
"fmt"
router "[실제 router 폴더가 있는 위치]"
)
func main() {
// debug mode on and off
debug := false
// router를 정의한 파일을 Import 후, router 선언
echoR := router.Router()
fmt.Println("Start echo server..")
if debug {
// 일반적인 http 서버 실행
echoR.Logger.Fatal(echoR.Start(":1323"))
} else {
// 보안 접속을 위한 https 서버 실행
// "cert.pem"과 "privkey.pem" 파일이 필요함
echoR.Logger.Fatal(echoR.StartTLS(":1323", "cert.pem", "privkey.pem"))
}
}
> Import 할 때, 파이썬과 같이 별명을 붙여서 사용이 가능함
> [사용할 별명] "실제 import 파일의 경로" 순서로 선언하여 사용한다
Echo Router
Echo의 라우터는 radix tree 기반으로 수행함으로, 경로 조회가 굉장히 빠르다. 또한 동기화 pool을 활용하여 메모리를 재사용하고 GC 오버 헤드 없이 동적 메모리 할당을 수행하지 않는다.
> 실제 사용 방법은 아래 router.go 에서 확인
Echo Server Start
> e.Logger.Fatal(e.Start()) : http 서버 실행
> e.Logger.Fatal(e.StartTLS()) : https 보안 접속 서버 실행
[ 참고 ] pem 키 생성
보안 접속을 위해 키가 필요할 때, 무료로 인증서를 생성해서 사용할 수 있는 사이트
아래 사이트를 통해 인증서 pem 키 2개를 발급받은 뒤, 보안 서버 실행 시 매개변수로 넣어준다
Echo Router 정의
아래는 main.go 에서 import 한 router.go 파일이다
package router
import (
"net/http"
echo "github.com/labstack/echo"
middleware "github.com/labstack/echo/middleware"
auth "[auth 폴더 위치]"
handler "[handler 폴더 위치]"
)
// Router function
func Router() *echo.Echo {
// echo.New()를 사용하여 *Echo를 리턴 받는다
e := echo.New()
// debug 모드로 사용하기 위해서는 디버그 설정을 true로 변경
e.Debug = true
// echo middleware func
e.Use(middleware.Logger()) //Setting logger
e.Use(middleware.Recover()) //Recover from panics anywhere in the chain
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ //CORS Middleware
AllowOrigins: []string{"*"},
AllowMethods: []string{http.MethodGet, http.MethodPut, http.MethodPost, http.MethodDelete},
}))
// Health check!
e.GET("/healthy", func(c echo.Context) error {
return c.String(http.StatusOK, "Healthy!")
})
// Router List
getList := e.Group("/get")
{
getList.GET("[path]", handler.[요청함수])
getList.GET("[path][:pathParameter]", handler.[요청함수])
}
admin := e.Group("/admin")
{
admin.GET("[path]", handler.[요청함수])
admin.GET("[path]", handler.[요청함수], auth.[로그인체크함수], auth.[어드민체크함수])
}
'''
[중략]
'''
login := e.Group("/login")
{
login.POST("", auth.auth.[로그인함수])
}
return e
}
필요한 패키지
vscode를 사용한다면, 자동으로 필요한 패키지는 import 된다.
그 외 사용하는 handler와 auth 도 해당 위치에 맞게 import
Router 함수 생성
func Router() *echo.Echo {}를 리턴하는 함수를 생성.
📌 echo.New() : *Echo를 리턴
📌 e.Debug = true : 디버깅 모드 true 설정
📌 e.Use(middlewear.Logger) : 로그 출력을 위한 middleware 설정
📌 e.Use(middleware.Recover()) : 에러가 발생해도 서버가 바로 죽지 않고, 다시 살아나도록 middleware 설정
📌 e.Use(middleware.CORSWithConfig()) : CORS 에러 방지를 위한 middleware 설정
📌 e.Group() : group로 묶어 route 할 수 있도록 설정