본문 바로가기

Project/MeerkatOnAir

[Golang] 고랭으로 API서버 구축, 디렉토리 구조 및 라우터

반응형

이번 포스팅은 고랭으로 API 서버 구축 시리즈의 1탄으로, 

디렉터리 구조 설정 및 Echo 웹 프레임워크 사용 등의 내용입니다:)

 

 

 

환경 구축

Golang 설치 및 사용

soyoung-new-challenge.tistory.com/84?category=893866

 

[Go] Go 언어 시작하기 (VS Code 사용 및 설치)

이번 포스팅은 GO언어와 vscode 설치에 관한 포스팅입니다. 1. Mac에 VScode 설치 - 아래 홈페이지에 접속해서 Mac 버전의 vscode를 설치 https://code.visualstudio.com Visual Studio Code - Code Editing. Rede..

soyoung-new-challenge.tistory.com

> 위 포스팅을 참고하여, Golang 처음 환경을 세팅한다.

 

 

Golang 문법 익히기

soyoung-new-challenge.tistory.com/85

 

[Go] Go언어 튜토리얼1_상수와 변수

아래 포스팅은 노마트코더의 Go언어 강의를 바탕으로 작성 된 튜토리얼 입니다 Export / Private Function 사용 - 현재 폴더 디렉터리 구조는 /learngo 아래에 main.go 파일이 생성된 상태 - export func 테스트��

soyoung-new-challenge.tistory.com

> 위 포스팅부터 시작하는 튜토리얼을 참고하여 사용법을 익힌다

 

 

Echo : Go Web Framework

soyoung-new-challenge.tistory.com/102?category=893866

 

[ECHO] 공식 문서 번역 Guide 1탄 (Go web framework)

앞으로 순차적으로 업데이트 될 포스팅은 Golang의 웹 프레임 워크인 Echo의 공식문서 번역입니다. 번역을 진행하며 echo에서 지원하는 많은 기능을 사용해보고, 실제 프로젝트에 적용 해 볼 예정 ��

soyoung-new-challenge.tistory.com

> 위 포스팅의 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개를 발급받은 뒤, 보안 서버 실행 시 매개변수로 넣어준다

 

letsencrypt.org/ko/

 

Let's Encrypt - 무료 SSL/TLS 인증서

 

letsencrypt.org

 

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 할 수 있도록 설정

 

 

 

반응형