현재 쉘스크립트로 작성된 회사 솔루션 제품을 Go로 변경시키는 작업을 하고 있다.
여기서 사용자의 정보가 일치하면 해당 제품을 설치할 수 있어야하기 때문에, 사용자의 입력값을 서버에 전달해야했다.
이때 사용자의 입력값을 json.Marshal()
을 통해 JSON으로 변환했다.
여기서 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
}