카테고리 없음

[Go 프로그래밍] open env/dev.dev: no such file or directory

하루설렘 2022. 7. 31. 15:05

 

open env/dev.dev: no such file or directory

env로 prod, dev, test로 나누던 과정에서 godotenv.Load err가 발생했다. 

config.Init()으로 env file 위치를 전역 변수로 저장하고 db.Connect()를 하기 때문에 문제가 없을거라 생각했다. 

하지만 error가 왜 생겼을까?

 

결론적으로, main함수보다 main 패키지에 있는 import 되어있는 echo_sample/domain에 있는 것을 먼저 실행하고, 그 후 main함수가 실행된다. 그래서 echo_sample/domain/dao.go가 먼저 실행되면서 에러가 발생되었다. (main함수의 config.Init()전에 실행됨) 

echo_sample
├── config
│   └── config.go
├── db
│   ├── db.go
│   └── user.custom.go
├── domain
│   └── user
│       ├── app.go
│       ├── dto
│       │   └── user.dto.go
│       ├── router
│       │   └── user.router.go
│       └── service
│           ├── dao.go
│           ├── user.service.go
│           └── user.service_test.go
├── env
│   ├── dev.env
│   ├── prod.env
│   └── test.env
├── go.mod
├── go.sum
├── main.go
└── util
    └── util.go
package main

import (
	"echo_sample/config"
	"echo_sample/db"
	"echo_sample/domain/user"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

func main() {
	config.Init()
	// Database init
	db.Connect()
	defer db.Close()

	// Echo instance
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())
	// Service init
	user.Init(e)
	// Start server
	e.Logger.Fatal(e.Start(":3000"))
}
package service

import (
	"database/sql"
	"echo_sample/db"
)

var (
	dao = db.Connect()
)

===========변경============
package service

import (
	"database/sql"
	"echo_sample/db"
)

var (
	dao *sql.DB
)

func Init() { // main함수 내에서 호출
	dao = db.Connect()
}

 


서칭을 해보니 아래 그림과 같은 순서로 실행된다고 한다. main함수 안에 config.Init()가 실행되기 전에 domain/service/dao.go의 var가 먼저 실행되기 때문에 문제가 발생한다. 

 

참고로 go 패키지에 init()함수를 지원하지만 사용하지 않고, Init()으로 별도 함수로 구현했다. 그 이유는 단계가 복잡해지면 에러를 잡기 힘들어 보이고, 눈에 보이는 순서로 진행시키는게 마음에 편하다. 

 

 

https://stackoverflow.com/questions/24790175/when-is-the-init-function-run 



-----domain/user/service/dao.go-----
package config

import (
	"echo_sample/util"
	"flag"
	"fmt"
	"os"

	"github.com/joho/godotenv"
)

var (
	Profile string
	EnvFile string
)

func Config(key string) string {
	fmt.Println(EnvFile, "check")
	err := godotenv.Load(EnvFile)
	if err != nil {
		fmt.Println("err")
	}
	return os.Getenv(key)
}

func Init() {
	wordPtr := flag.String("profile", "", "")
	flag.Parse()

	Profile = "dev"
	if wordPtr != nil && util.Contain(*wordPtr, []string{"prod", "test"}) {
		Profile = fmt.Sprintf("%s", *wordPtr)
	}
	EnvFile = fmt.Sprintf("env/%s.env", Profile)

	fmt.Println("Active profile: ", Profile)
}

 

 

** 틀린 부분이 있으면 댓글 부탁드립니다. 

** 똑같은 실수는 없도록 기록하고 성장하기!