지난 글에서 간단한 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 을 연결해봅시다.