본문 바로가기
Programming Language/Go

[4] Go yaml - yaml 파일을 Go로 쉽게 읽기

by Riverandeye 2020. 10. 3.

프로그램의 외부 시스템이 변경하게 되면 이를 적용해야 하는데, 코드에 그대로 반영할 수는 없으니

외부 설정 파일을 생성해서 이를 읽어 시스템에 반영하게 됩니다. 

예를 들면, DB 서버의 ip 주소나 포트 같은 것들을 매번 코드상에서 변경해주는건 이상하니

전역으로 config 변수를 설정해서 주입해주는 것입니다.

 

이러한 외부 설정 파일은 ini, yaml, json 형식으로 작성되는데

자주 사용되는 yaml 형식의 파일을 Go에서 읽어서 사용하는 예시를 이 글에서 소개하겠습니다.

 

yaml 예시

database:
  Type: mysql
  User: Riverandeye
  Password: hello
  Host: 1.2.3.4:5
  Name: todo
  TablePrefix: todo_

server:
  RunMode: debug
  HTTPPort: 4000
  ReadTimeout: 60
  WriteTimeout: 60

 

다음은 yaml 파일의 예시입니다. yaml은 보다시피 계층 구조를 가지고 있고 이를 탭을 이용해서 분리합니다.

Go는 강타입 언어이기 때문에 yaml에서 읽은 계층에 대한 타입을 명시해야 합니다. 

읽은 yaml 하나를 통채로 하나의 타입으로 지정해주어야 합니다. 

 

다음은 위 yaml에 대한 타입 명시입니다. 

// DatabaseConfig Type
type DatabaseConfig struct {
	Type        string `yaml:"Type"`
	User        string `yaml:"User"`
	Password    string `yaml:"Password"`
	Host        string `yaml:"Host"`
	Name        string `yaml:"Name"`
	TablePrefix string `yaml:"TablePrefix"`
}

// ServerConfig Type
type ServerConfig struct {
	RunMode      string `yaml:"RunMode"`
	HTTPPort     string `yaml:"HTTPPort"`
	ReadTimeout  int    `yaml:"ReadTimeout"`
	WriteTimeout int    `yaml:"WriteTimeout"`
}

// Config Type
type Config struct {
	Database DatabaseConfig `yaml:"database"`
	Server   ServerConfig   `yaml:"server"`
}

전체 yaml에 대한 타입은 Config 이고, 각 Database, Server에 대한 타입을 분리하여 작성하였습니다. 

각 property에 대한 타입을 명시해주고, 태그로 yaml에 명시되어있는 key를 작성해주면 됩니다. 

매칭되는 태그를 가진 property에 yml에 명시된 값이 주입됩니다.

예를 들어, `yaml:"Name"`이 아니라 `yaml:"name"` 이라고 되어있으면, yaml 파일엔 Name: 이 아니라 name: 으로 되어있어야 합니다.

 

타입을 명시한 후엔, ioutil으로 파일을 읽은 후 yaml 모듈로 Unmarshal 해주면 됩니다. 

filename, _ := filepath.Abs("config/config.yml")
yamlFile, err := ioutil.ReadFile(filename)
var config Config

err = yaml.Unmarshal(yamlFile, &config)

if err != nil {
	panic(err)
}

파일을 읽은 후 yaml.Unmarshal 메소드를 이용하여 config 변수에 써줍니다.

Marshalling 이 Object를 저장 혹은 전송하기 좋은 형식으로 변환하는 것이라면

Unmarshalling 은 그 반대로 직렬화 혹은 저장된 정보를 객체로 변환하는 것입니다. 

 

기존에 작성한 yaml 이 있을때

만약 미리 작성해둔 yaml을 타입으로 변환하고 싶다면

이 사이트에서 타입을 자동으로 지정해주기 때문에 편하게 사용할 수 있습니다. 

타입명은 직접 변경해주어야 하고, 위에 작성된 예시처럼 분리하고 싶다면 개별 타입을 지정하여 명시해주면 됩니다. 

'Programming Language > Go' 카테고리의 다른 글

[3] Go 웹 프레임워크 Gin  (0) 2020.10.03
[2] Go mod - Go의 패키지 관리 시스템  (2) 2020.09.25
[1] Golang 개념 및 기초  (4) 2020.08.20

댓글