Go: Marshal에 대해서 알아보자

Olivia·2024년 4월 11일
0

[Go]

목록 보기
4/4
post-thumbnail

현재 쉘스크립트로 작성된 회사 솔루션 제품을 Go로 변경시키는 작업을 하고 있다.

여기서 사용자의 정보가 일치하면 해당 제품을 설치할 수 있어야하기 때문에, 사용자의 입력값을 서버에 전달해야했다.

이때 사용자의 입력값을 json.Marshal()을 통해 JSON으로 변환했다.
여기서 JSON.Marshal()에 대해서 조금 더 작성해보려 한다.


json.Marshal() 함수

json.Marshal() 함수는 Go 언어에서 사용되는 JSON 데이터를 생성하기 위한 함수다.
이 함수는 Go의 데이터 타입을 JSON 형식으로 인코딩하여 문자열이나 바이트 배열로 반환한다.

예를 들어, Person이라는 구조체가 아래와 같다고 가정하자.

type Person struct {
	Name string
    Age int
}

그리고 이 구조체를 JSON으로 인코딩해야한다.

person := Person{Name: "Olivia", Age: 30}

json.Marshal() 함수를 사용해서 이 정보를 JSON으로 변환할 수 있다.

jsonValue, err := json.Marshal(person)
if err != nil {
	fmt.Println("에러입니동~", err)
    return
}
fmt.Println("JSON 데이터: ", string(jsonValue))

// JSON 데이터: {"Name": "Olivia", "Age": 30}

json.Marshal() 함수를 사용한 이유

사용자가 입력한 정보가 맞는 정보인지 판단하기 위해서 사용자가 제공한 정보를 서버에 전달해야했다.
따라서 사용자의 정보를 JSON 형식으로 만들고, HTTP POST 요청의 본문에 JSON 데이터를 포함해서 서버에 전송했다.
서버는 이 데이터를 받아서 해당 사용자의 라이선스를 검증하고, 그 결과를 JSON 형식으로 다시 클라이언트에게 반환할 수 있다. 그럼 클라이언트는 이 응답을 받아서 처리하여 사용자에게 적절한 결과를 보여줄 수 있기 때문에 사용하게 되었다.


작성한 코드(예시)

회사 코드이기 때문에 코드 그대로 작성할 순 없고 최대한 비슷하게 작성해봤다.

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    dataType := "exampleType"
    data := "exampleData"

    isValid := validateData(dataType, data)
    if isValid {
        fmt.Println("데이터 유효")
    } else {
        fmt.Println("데이터 유효 X")
    }
}

func validateData(inputType, inputData string) bool {
    jsonData := map[string]string{"inputType": inputType, "inputData": inputData}
    jsonValue, _ := json.Marshal(jsonData)

    response, err := http.Post("https://example.com/validateData", "application/json", bytes.NewBuffer(jsonValue))
    if err != nil {
        fmt.Printf("오류 발생: %s\n", err)
        return false
    }
    defer response.Body.Close()

    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Printf("응답 본문을 읽는 중 오류 발생: %s\n", err)
        return false
    }

    var result map[string]interface{}
    if err := json.Unmarshal(body, &result); err != nil {
        fmt.Printf("JSON 응답을 파싱하는 중 오류 발생: %s\n", err)
        return false
    }

    if statusCode, ok := result["statusCode"].(string); ok && statusCode == "200" {
        if data, ok := result["data"].(map[string]interface{}); ok {
            if valid, ok := data["result"].(bool); ok && valid {
                fmt.Println("✅ 데이터 유효")
                return true
            }
        }
    }

    fmt.Println("❗️ 올바르지 않은 값")
    return false
}

profile
👩🏻‍💻

0개의 댓글