Go 언어로 Rest API 개발 시, 구조체를 이용하여 JSON이나 XML로 직렬화하여 사용하는 경우가 대부분입니다.
구조체를 바로 직렬화 할 수 있지만, Go 언어의 경우 직렬화를 하려면 구조체 내의 필드들의 첫 글자를 모두 대문자로 써야 합니다.
Tag 없이 직렬화를 하면 대문자 그대로 직렬화가 되죠.
type User struct {
ID int
Name string
Age int
}
func main() {
user := User{
ID: 1,
Name: "yeo",
Age: 30,
}
userMarshal, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(userMarshal))
}
출력 결과
{"ID":1,"Name":"yeo","Age":30}
직렬화 되었을 때 JSON의 Key 값을 소문자로 하고 싶다고, 구조체 필드를 소문자로 쓰면, JSON 직렬화 시 소문자 필드는 무시됩니다.
Go 언어에서 구조체 필드가 대문자로 시작해야 Public 하게 접근할 수 있기 때문이죠.
아래에서 age 필드를 소문자로 선언해봅시다.
type User struct {
ID int
Name string
age int
}
func main() {
user := User{
ID: 1,
Name: "yeo",
age: 30,
}
userMarshal, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(userMarshal))
}
출력 결과, age 필드는 직렬화 시 무시된 것을 알 수 있습니다.
{"ID":1,"Name":"yeo"}
바로 이런 점 때문에, Go 언어에서는 Tag 를 지원합니다.
아래와 같이 tag를 선언해서 JSON 직렬화 시에 Key 값을 지정해 줄 수 있습니다.
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
Tag 지정 후 출력 결과는 아래와 같습니다.
{"id":1,"name":"yeo","age":30}
이 Tag는 방금 보여드린 JSON 직렬화 외에도, JSON 데이터를 구조체로 Unmarshal할 때도 해당 Key와 맵핑되는 기능을 수행합니다.
또한 Tag는 데이터 직렬화 외에도 여러 가지로 쓰일 수 있습니다. 커스텀으로 태그를 만들어서 쓸 수도 있죠.
설명하다 보니, 본래의 주제와 다르게 Tag에 대한 설명이 너무 길어지는 것 같아, 이 쯤에서 마무리하도록 하고 이 글의 주제인 gomodifytags 라는 툴에 대해 설명 드리겠습니다.
Tag 가 요긴하게 쓰이는 만큼 Go 개발자들은 이 태그를 써야하는 일이 많은데, 구조체 선언 시 이 Tag를 쓰는 것이 여간 귀찮은 일이 아닙니다. 그래서 이 Tag를 자동으로 써주는 툴이 만들어졌고, 그것이 gomodifytags입니다.
* gomodifytags Github 주소 : https://github.com/fatih/gomodifytags
설치
설치는 아래와 같이 go get 으로 설치합니다.
$ go get github.com/fatih/gomodifytags
혹시, VSCode 의 Go 익스텐션을 설치하신 분이라면 아마 Go 익스텐션 설치 시 설치 되었을 겁니다.
사용법
자 그럼 gomodifytags 는 어떻게 사용할까요?
기본적으로 커맨드라인에서 명령어로 사용할 수 있습니다.
type user struct {
UserID int
User string
Password string
Age int
}
위 예시에 있는 user 구조체에 gomodifytags로 tag를 생성해보겠습니다.
$ gomodifytags -file main.go -struct user -add-tags json -w
위 옵션 중 -file 은 파일명 옵션이고, -struct는 구조체 이름, -add-tags는 어떤 태그를 입력할 것인 지, 그리고 -w 옵션은 파일에 쓰라는 옵션입니다.
위 명령어를 실행하면 아래와 같이 자동으로 태그가 생성된 것을 확인할 수 있습니다.
type user struct {
UserID int `json:"user_id"`
User string `json:"user"`
Password string `json:"password"`
Age int `json:"age"`
}
UserID가 JSON으로는 user_id로 생성된 것을 볼 수 있는데, Default로 snakecase 로 생성해주기 때문입니다.
snakecase 란 띄어쓰기를 언더바(_)로 표현하는 방식입니다.
camelcase 로 제너레이팅하고 싶으면 -transform 옵션을 주면 됩니다.
$ gomodifytags -file main.go -struct user -add-tags json -transform camelcase -w
camelcase로 옵션을 주면 아래와 같이 제너레이팅 되는 것을 볼 수 있습니다.
type user struct {
UserID int `json:"userID"`
User string `json:"user"`
Password string `json:"password"`
Age int `json:"age"`
}
json과 xml로 태그를 모두 생성하고 싶은 경우, -add-tags 옵션에 json,xml 로 두 개를 콤마로 구분하여 넣어줍니다.
$ gomodifytags -file main.go -struct user -add-tags json,xml -transform camelcase -w
type user struct {
UserID int `json:"userID" xml:"userID"`
User string `json:"user" xml:"user"`
Password string `json:"password" xml:"password"`
Age int `json:"age" xml:"age"`
}
vscode 사용 시
위와 같이 명령어를 사용해서 제너레이팅 할 수도 있지만, VSCode Go 익스텐션 설치 시, 이 툴을 더더욱 간단히 사용할 수 있게 지원합니다.
먼저 VSCode User Settings에 들어가서 'Go: Add Tags' 에서 아래와 같은 옵션들을 설정할 수 있습니다.
설정한 후에 구조체 중괄호 스코프 내부를 오른쪽 클릭한 뒤, Go: Add Tags To Struct Fields 를 클릭해주면 자동으로 제너레이팅 됩니다.
아니면 커서가 구조체 스코프 내에 위치한 상태에서 Ctrl, Shift + P를 눌러서 Go: Add Tags To Struct Fields 를 실행해도 됩니다.
이 글에서는 gomodifytags라는 툴을 이용해서 Go 개발자들이 자주 사용하는 Tag를 자동으로 생성해주는 팁을 알려 드렸습니다.
얼핏보면 별 거 아닐 것 같지만, 이런 반복적인 작업을 쉽게 툴로 잘 해결하면 개발할 때 생산성이 조금이나마 올라가지 않을까 싶습니다.
아마 Go 개발을 기존에 하셨더라도 이 방법을 모르는 분들이 많으셨을거라 생각합니다. 왜냐면 제가 그랬으니깐요. ㅎ