Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- web-proxy lab
- Error Code: 1055
- strcpy
- strcat
- https://firecatlibrary.tistory.com/49?category=874970
- 정글#정글사관학교#3기#내일#기대#설렘#희망#노력
- DNS
- BSD소켓
- TCP
- ip
- mysql
- group by
- HTTP
- C언어
- https://coding-factory.tistory.com/641
- SQL
Archives
- Today
- Total
매일을 설렘으로
[Go 프로그래밍] open env/dev.dev: no such file or directory 본문
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)
}
** 틀린 부분이 있으면 댓글 부탁드립니다.
** 똑같은 실수는 없도록 기록하고 성장하기!