완성된 코드 파일 Github 링크
오늘은 데이터를 저장하기 위한 PostgresSQL
, Redis
와
접속 정보를 통합 관리할 수 있는 .env
파일을 연결해보겠다.
DB 연결은 관리가 편한 ORM gorm
과 go-redis
을 이용하겠다.
아직 .env 파일을 만들지 않았다면 1편을 보고 오자
.env
파일을 연결하기 위한 코드 파일 configs/configs.go
을 생성하자
파일 상단에 패키지 선언과 모듈을 import해주자
package configs
import (
"os"
"strconv"
)
다음으로는, .env
파일의 내용을 저장하기 위한 변수의 type을 선언하고 내용을 읽어올 함수와 변수를 만들자
package configs
import (
"os"
"strconv"
)
type WASConfig struct {
Host string
Port string
}
type DBConfig struct {
Host string
Port int
User string
Pass string
Database string
}
type RedisConfig struct {
Host string
Port int
Password string
DB int
}
type MainConfig struct {
WAS WASConfig
DB DBConfig
Redis RedisConfig
}
func getEnv_s(key string) string { // 환경변수를 가져오고 없으면 에러를 발생시키는 함수
if value, ok := os.LookupEnv(key); ok {
return value
}
panic("Environment variable " + key + " not found")
}
func getAllEnv() MainConfig { // 모든 환경변수를 가져오는 함수
var err error
dbPort, err := strconv.Atoi(getEnv_s("POSTGRES_PORT"))
if err != nil {
panic("Environment variable DB_PORT is not a number")
}
redisPort, err := strconv.Atoi(getEnv_s("REDIS_PORT"))
if err != nil {
panic("Environment variable REDIS_PORT is not a number")
}
return MainConfig{
WAS: WASConfig{
Host: getEnv_s("WAS_HOST"),
Port: getEnv_s("WAS_PORT"),
},
DB: DBConfig{
Host: getEnv_s("POSTGRES_HOST"),
Port: dbPort,
User: getEnv_s("POSTGRES_USER"),
Pass: getEnv_s("POSTGRES_PASSWORD"),
Database: getEnv_s("POSTGRES_DB"),
},
Redis: RedisConfig{
Host: getEnv_s("REDIS_HOST"),
Port: redisPort,
Password: getEnv_s("REDIS_PASSWORD"),
DB: 0,
},
}
}
var Config = getAllEnv() // 환경변수 객체
앞서 연결한 .env
파일을 바탕으로 PostgreSQL
과 Redis
를 연결 해보도록 하겠다.
먼저, 해당 코드를 터미널에서 실행해 의존성을 설치하자
go get "github.com/redis/go-redis/v9"
go get "gorm.io/gorm"
go get "gorm.io/driver/postgres"
다음으로 database/database.go
파일을 생성하고 다음과 같이 작성하자
// pentag.kr/BuildinAuthVelog/database/database.go
package database
import (
"github.com/redis/go-redis/v9"
"gorm.io/gorm"
)
// DB gorm connector
var DB *gorm.DB
// Redis go-redis connector
var RDB *redis.Client
변수 DB
, RDB
는 각각 PostgreSQL
, Redis
연결을 저장하는 변수이다.
이제는 각각의 변수에 담아줄 연결 정보를 생성하는 파일을 작성해보자
database/connect.go
파일을 생성하고 다음과 같이 작성하자
// pentag.kr/BuildinAuthVelog/database/connect.go
package database
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"pentag.kr/BuildinAuthVelog/configs"
)
func ConnectDB() {
var err error // define error here to prevent overshadowing the global DB
dbConfig := configs.Config.DB
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Seoul", dbConfig.Host, dbConfig.User, dbConfig.Pass, dbConfig.Database, dbConfig.Port)
DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// err = DB.AutoMigrate(
// &models.User{},
// )
if err != nil {
panic(err)
}
}
func ConnectRedis() {
redisConfig := configs.Config.Redis
ctx := context.Background()
RDB = redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
Password: redisConfig.Password,
DB: 0, // use default DB
})
RDB.Ping(ctx)
}
위의 코드에 중간에 있는 주석 처리된 부분은 모델을 DB에 자동으로 마이그레이션해주는 코드인데,
다음강에서 모델을 생성한 뒤에 다루도록 하겠다.
이제 작성한 코드를 main.go
에 적용해보자
// pentag.kr/BuildinAuthVelog/main.go
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"pentag.kr/BuildinAuthVelog/database" // 추가
)
func main() {
app := fiber.New()
database.ConnectDB() // 추가
database.ConnectRedis() // 추가
log.Fatal(app.Listen(":" + "3000"))
}
오늘은 DB 연결을 다루어 보았다.
다음 편에서는 모델 구축과 간단한 CRUD를 제작해 보겠다.