소프트웨어는 바이트 단위로 데이터를 인식한다. 97이란 바이트 값을 정수로 보면 97이지만 문자로 보면 "a"다. 메모리 바이트는 해석하는 틀에 따라 달라지는데 이러한 변환을 '인코딩' 또는 '마샬링'이라고 한다.
Go의 encoding이 이를 담당하는 기본 패키지다.
논리적 구조를 로우 바이트로 변경하는 것을 '마샬링(Marshaling)' 혹은 '인코딩(Encoding)'이라 표현한다. json.Marshal 함수가 이 역할을 한다.
func Marshal(v interface{}) ([]byte, error)
b, _ := json.Marshal(true)
fmt.Println(b) // [116 114 117 101]
fmt.Println(string(b)) // "true"
기본 타입 중 하나인 ture 불리언(bool) 값을 마샬링하여 바이트 슬라이스를 얻어 내면 4개의 아스키 값이 나온다. 이를 문자열로 변환하면 "true"가 되는 것이다.
바이트 슬라이스나 문자열을 사용하려면 Marshal/Unmarshal 함수가 적합하다. 만약 표준 입출력이나 파일 같은 Reader/Writer 인터페이스를 사용하여 스트림 기반으로 동작하려면 Encoder/Decoder를 사용한다.
처리 속도는 스트림 방식이 더 낫다. 데이터 크기가 작다면 성능차이를 체감할 수 없지만 비교적 큰 데이터를 다룬다면 스트림 기반의 Encoder/Decoder가 거의 50% 정도 더 빠른 성능을 낸다.
스트림 : 파이프 라인과 같은 맥락으로 이해함. 연결하여 대량의 데이터를 흘려보낼 수 있다.
웹 서버와 클라이언트는 JSON으로 통신한다. 요청 바디로 들어온 JSON 문자열을 구조체로 변환 후 로직에 활용한다. 반대로 응답용 구조체는 JSON문자열로 변환하여 바디에 담아 클라이언트로 전달한다.
Go에서 유명한 웹 프레임웍인 에코(Echo)에서는 내부적으로 encoding/json 패키지를 사용해 이를 구현한다.