fiber (2/3) : 컨트롤러 확장

지난 글에서 간단한 fiber 프레임워크를 이용한 서버를 만들어보았습니다. 그런데, API가 늘어날 수록 main.go 가 복잡해지는 문제가 있었어요. 이 핸들러를 별도의 폴더로 이동해서 서비스별로 구분을 하면, 조금 더 관리하기 수월해질 것입니다. 이렇게 분리하는 것을 컨트롤러라고 보통 부릅니다. 그래서, controller 폴더를 먼저 만들겠습니다. controller 폴더 하위에는 svc1svc2 폴더도 만듭니다.

그리고, svc1 폴더에 svc1.go 파일을 만들고, 다음과 같이 작성해줍니다.

package svc1

import "github.com/gofiber/fiber/v2"

func Req1(c *fiber.Ctx) error {
	return c.JSON(&fiber.Map{"SVC1": "REQ1"})
}

func Req2(c *fiber.Ctx) error {
	return c.JSON(&fiber.Map{"SVC1": "REQ2"})
}

마찬가지로, svc2 폴더에는 svc2.go 파일을 만들고, 다음처럼 작성해주세요.

package svc2

import "github.com/gofiber/fiber/v2"

func Req1(c *fiber.Ctx) error {
	return c.JSON(&fiber.Map{"SVC2": "REQ1"})
}

func Req2(c *fiber.Ctx) error {
	return c.JSON(&fiber.Map{"SVC2": "REQ2"})
}

그리고, main.go 를 아래처럼 수정해줍니다.

package main

import (
	"log"
	"os"

	"github.com/gofiber/fiber/v2"
	"github.com/joho/godotenv"

	"fapi/controller/svc1"
	"fapi/controller/svc2"
)

func main() {
	// .env 파일 로드
	if err := godotenv.Load(); err != nil {
		log.Fatalf("Error loading .env file: %v", err)
	}

	// 환경 변수에서 포트 가져오기
	port := os.Getenv("PORT")
	if port == "" {
		log.Fatal("PORT is not set in the .env file")
	}

	app := fiber.New()
	app.Get("/", func(c *fiber.Ctx) error {
		return c.JSON(&fiber.Map{"hello": "world"})
	})

	app.Get("/svc1/req1", svc1.Req1)
	app.Get("/svc1/req2", svc1.Req2)
	app.Get("/svc2/req1", svc2.Req1)
	app.Get("/svc2/req2", svc2.Req2)

	log.Fatal(app.Listen("0.0.0.0:" + port))
}

main.go 가 훨씬 간결해졌지요? 그런데.. 이 역시도 API 늘어갈수록 점점 커지겠지요. 이 것을 더 줄여보겠습니다. route 라는 폴더를 만들어주고, 그 안에 api.go 파일도 생성해줍니다. api.go 파일의 내용은 아래처럼 해줍니다.

package route

import (
	"fapi/controller/svc1"
	"fapi/controller/svc2"

	"github.com/gofiber/fiber/v2"
)

func Router() *fiber.App {
	// App 생성과 템플릿 설정
	app := fiber.New()

	// Route 설정
	app_svc1 := app.Group("/svc1")
	app_svc1.Get("/req1", svc1.Req1)
	app_svc1.Get("/req2", svc1.Req2)

	app_svc2 := app.Group("/svc2")
	app_svc2.Get("/req1", svc2.Req1)
	app_svc2.Get("/req2", svc2.Req2)

	return app
}

이제, main.go 를 아래처럼 수정해줍니다.

package main

import (
	"log"
	"os"

	"github.com/joho/godotenv"

	"fapi/route"
)

func main() {
	// .env 파일 로드
	if err := godotenv.Load(); err != nil {
		log.Fatalf("Error loading .env file: %v", err)
	}

	// 환경 변수에서 포트 가져오기
	port := os.Getenv("PORT")
	if port == "" {
		log.Fatal("PORT is not set in the .env file")
	}

	app := route.Router()

	log.Fatal(app.Listen("0.0.0.0:" + port))
}

main.go 파일이 완전히 간결해졌지요? 좋습니다. 이제 go run main.go 를 실행하고, http://localhost:8000/svc2/req2 을 호출해봅니다.   이렇게 해서, 컨트롤러 확장하기 성공~!!! 다음에는 MySQL 을 연결해봅시다.