일상적 이야기들.

Conf, Init 파일 사용하기 본문

프로그래밍/GOLang

Conf, Init 파일 사용하기

noveljava 2021. 11. 9. 16:27

Ini

  • 프로그램 구동시 가장 먼저 Load 되어야할 정보들을 기록해둔다.
  • Section, Key 로 구성이 되어있다.
[property]
path    = "/Users/everspin/Public/company/next_gen_server_library_go/policy"
fileName = "property.ini"
  • [] 는 Secion을 의미한다.
  • 하위는 Secion의 key를 의미한다.

Code

  • go get gopkg.in/ini.v1
package main

import "gopkg.in/ini.v1"

func main() {
    cfg, err := ini.Load("setting.ini")
    if err != nil {
        fmt.Println(err)
    }

    propertySection := cfg.Section("property")
    path, fileName := propertySection.Key("path").String(), propertySection.Key("fileName").String()
}
  • xxSection := cfg.Section("가져올 Section의 keyword")
  • xxSection.Key("가져올 key값").[Type을 정의]
    • xxSection.Key("path").String()
    • xxSection.Key("SomeIntValue).Int()

Conf

Conf 의 형태를 json 혹은 yaml 이라고 가정을 한다.

  • json.Marshal(), json.Unmarshal()
  • yaml.Marshal(), yaml.Unmarshal()

여기서는 json 형태의 Conf 파일을 정의한다.

{
    "AppInfo": {
        "addID":"AppID3",
        "uuid":"UUID"
    },
    "PolicyInfo": {
        "blah":"Blah",
        "blahBlah":"BlahBlah"
    }
}
type AppInfo struct {
    AppID string `json:"addID"`
    UUID string `json:"uuid"`
}

type PolicyInfo struct {
    Blah string `json:"blah"`
    BlahBlah    string `json:"blahBlah"`
}

type Property struct{
    AppInfo AppInfo
    PolicyInfo PolicyInfo
}

json 형태를 받아줄 수 있는 golang의 Structure를 정의를 한다.

json: "xxx"은 실제 json으로 저장될 때 표기될 대소문자구분의 문자열을 의미한다.

package main

func main() {
    payload := `{"appInfo":{"addID":"AppID3","uuid":"UUID"},"PolicyInfo":{"blah":"Blah","blahBlah":"BlahBlah"}}`

    propertyManager := manager.PropertyManager{}
    propertyManager.Initialize(path, fileName)
    propertyManager.Save(payload)
    fmt.Println(propertyManager.Load())
}
package conf

import (
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "os"
)

type PropertyManager struct {
    path    string
    fileName    string
}

type AppInfo struct {
    AppID string `json:"addID"`
    UUID string `json:"uuid"`
}

type PolicyInfo struct {
    Blah string `json:"blah"`
    BlahBlah    string `json:"blahBlah"`
}

type Property struct{
    AppInfo AppInfo `json:"appInfo"`
    PolicyInfo PolicyInfo
}

func (p *PropertyManager) Initialize(path string, fileName string) {
    p.path = path
    p.fileName = fileName
}

func (p *PropertyManager) Save(info string) {
    var propertyInfo Property

    saveFileName := fmt.Sprintf("%s/%s", p.path, p.fileName)
    // Check byte information.
    if err := json.Unmarshal([]byte(info), &propertyInfo); err != nil {
        panic(err)
    }

    // for pretty print
    e, _ := json.MarshalIndent(&propertyInfo, "", "\t")

    existsProperty, err := p.Load()
    if err == nil && existsProperty == string(e){
        fmt.Println("Already saved")
        return
    }

    if err == nil && existsProperty != string(e)    {
        if err := os.Rename(saveFileName, saveFileName + ".bak"); err != nil {
            panic(err)
        }
    }

    if err := ioutil.WriteFile(saveFileName, e, 0644); err != nil {
        panic(err)
    }
}

func (p *PropertyManager) Load() (string, error) {
    var propertyInfo Property

    bytes, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", p.path, p.fileName))
    if err != nil {
        return "", errors.New("not exists ini file")
    }

    if err = json.Unmarshal(bytes, &propertyInfo); err != nil {
        panic(err)
    }
    return string(bytes), nil
}

Property에 대한 정의는 Sample로 구성을 함.

Save

  • 기존의 데이터가 있는지 확인하여 불러온다.
    • 있다면, 기존 데이터가 현재 수신된 데이터와 동일한지 확인을 한다.
      • 동일한 데이터라면, 굳이 저장을 할 필요가 없으므로 Log를 찍고 종료한다.
      • 동일하지 않다면, 기존의 데이터를 .bak으로 옮긴다.
  • 데이터를 저장한다.

Load

  • 데이터를 불러온다.
    • 없다면 Error를 Return 한다.
    • Golang은 Excetpion을 발생시키기보다는 error return이 일반적인 것으로 보인다.

'프로그래밍 > GOLang' 카테고리의 다른 글

LoadImpact/K6  (0) 2021.07.28
Comments