Go로 인증서버 만들기 #3 .env, DB, Redis 연결

펜타곤·2023년 4월 17일
0

완성된 코드 파일 Github 링크

0. 들어가며

오늘은 데이터를 저장하기 위한 PostgresSQL, Redis
접속 정보를 통합 관리할 수 있는 .env 파일을 연결해보겠다.

DB 연결은 관리가 편한 ORM gormgo-redis 을 이용하겠다.


1. env 파일 연결

아직 .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() // 환경변수 객체

2. DB 연결

앞서 연결한 .env 파일을 바탕으로 PostgreSQLRedis를 연결 해보도록 하겠다.

먼저, 해당 코드를 터미널에서 실행해 의존성을 설치하자

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"))
}

3. 마무리

오늘은 DB 연결을 다루어 보았다.
다음 편에서는 모델 구축과 간단한 CRUD를 제작해 보겠다.

profile
모난 예비 개발자 펜타곤

0개의 댓글