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

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

그리고, 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 을 연결해봅시다.