티스토리 뷰
Photo by Muhannad Ajjan on Unsplash
개요
하나의 구조체의 필드가 너무 길면 한눈에 보기 어렵다. 그렇다고 구조체 속에 구조체를 넣어서 구조화하면 너무 정신이 없다.
실무에서 아래와 같이 적용을 해보니 편하여 공유해본다. JSON marshaling/unmarshaling 에 대한 이해에 도움이 되기도 하였다.
더 좋은 방법이 있거나, 잘못알고 있는 부분이 있다면 알려주시면 좋겠다
* omitempty 태그도 언급하면 좋았겠지만 이번 글에서는 제외하였다.
* 예제의 몇몇 error 처리는 예제코드의 길이를 줄이려 생략하였다. 모든 에러는 처리되어야 한다.
기본 구현
Playground: https://play.golang.org/p/jmVzyTFeXZR
필드들을 나열하여 정의한 구조체이다. |
|
인스턴스화 하였다. nest 되어 있지 않아서 초기값 설정은 쉽다.
|
|
JSON 필드들이 이렇게 나열된다. 참고로 출력은 아래와 같이 간단히게 구현해보았다. |
구조적 구현
Playground: https://play.golang.org/p/JAPcQM0KUI4
1) 분류가 되어 좀더 알아보기 쉬워졌다.
2) 구조체 타입이름과 필드명이 같다면 구조체 타입이름을 생략 가능하다
|
|
1) 대신 초기값을 넣어서 인스턴스를 만드는 건 손이 조금 더 간다
2) 재미있는게 Title 이라는 필드는 - 정확히는 john.Job.Title 이지만 - 현재 구현과 같이 다른 필드명과 혼동될 걱정이 없으면 john.Title 로 써도 된다. * 인스턴스 초기화 할때는 안되니 주의 |
|
JSON 직렬화의 결과는 이처럼 좀 더 구조화되어 있다. |
다른 구현
Go 내에서는 좀더 구조화 하여 관리하면서도 JSON 으로 직렬화 하였을때에 좀더 심플하다.
어떤게 더 좋은 것인지 정확히는 모르겠다.
Playground: https://play.golang.org/p/SKk-ijmsXro
위 구현과의 차이는 JSON tag 를 뺀 것이다. |
|
1) 실행하는 부분도 똑같다.
2) 다만 직접 접근하거나, 정확하게 명시해서 접근하거나 동일하다는 것을 보여주는 코드를 추가해보았다. john.Title = "Software Architect" john.Job.Salary = 72000
|
|
JSON tag 를 뺀 것 만으로 JSON 직렬화가 심플하게 바뀌었다. |
또다른 영감
또다른 인싸이트도 얻었다. JSON 으로 직렬화되어 이렇게 단순화되어 들어오면
나만의 구조, 나만의 계층으로 선언한 구조체로 받을 수도 있게 된다
- 받으려는 구조체에서 구조를 변경하고, 불필요한 필드는 빼보았다.
- 그리고, 심지어는 없는 필드를 추가해보았다.
Playground: https://play.golang.org/p/EVcUjHHszIm
기존의 구조체 정의에 더해서 새로운 조합으로 왼쪽과 같이 Person2, 그리고 Member2 를 정의해 보았다.
* AdditionalInfor 라는 Member 구조체에는 없던 필드가 추가되었다. |
|
그리고 한 번 JSON Marshaling 했던 것을 이번에는 Member2 구조체로 Unmarshaling 을 하였다.
member2 는 아래와 같은 구조체 인스턴스가 된다. (출력을 정리하였다.) * AdditionalInfo 필드가 zero value (="") 로 추가되어 있음을 보자
출력되는 전체 내용은 아래와 같다. |
'golang' 카테고리의 다른 글
exec.Command() 간단 활용 (0) | 2021.02.18 |
---|---|
Go 슬라이스 가지고 놀아보자 (0) | 2020.10.21 |
WSL2 에서 gvm 사용하기 (Go Version Manager) (0) | 2020.09.13 |
WSL2 에 Go 설치하기 (3) | 2020.09.11 |
NoSQL 을 쓰는 이유 (0) | 2020.08.20 |
- Total
- Today
- Yesterday
- Shortcut
- go
- 체호프
- JIRA
- 영화
- Gin
- 클린 애자일
- bun
- agile
- 2023
- pool
- 제이펍
- 노션
- solid
- golang
- Bug
- 독서
- API
- 인텔리제이
- postgres
- notion
- websocket
- intellij
- strange
- folklore
- github
- ChatGPT
- 독서후기
- 잡학툰
- OpenAI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |