무지개곰
article thumbnail
반응형

웹 개발은 웹 페이지로부터 데이터를 읽어오거나 클라이언트로부터 데이터를 받아오는 것이 필요합니다. Go 언어를 사용하여 웹 서버에서 Query와 Fragment를 다루는 방법, JSON 데이터를 읽고 쓰는 방법을 알아보겠습니다.

목차

Query String 데이터 처리

JSON 데이터 처리


Query String 데이터 처리

Query String은 URL에 포함된 데이터를 서버로 전달하는 데 사용됩니다. 일반적으로 '?' 문자 이후에 오며, 'key=value'로 이루어져 있습니다. 각 쌍은 '&'로 구분됩니다.

예시

http://example.com/search?querykey=queryvalue&stringkey=stringvalue

위의 예시에서 'querykey=queryvalue''stringkey=stringvalue' 두 가지가 Query String부분입니다.

Query String 읽기

Go 언어에서 Query String을 읽으려면 'net/url' 패키지를 사용할 수 있습니다. 웹 서버의 경우 요청에서 query를 읽어올 수 있습니다.

net/url 사용하여 Query 읽기

package main

import (
	"fmt"
	"net/url"
)

func main() {
	urlString := "http://example.com/search?querykey=queryvalue&stringkey=stringvalue"

	parsedURL, err := url.Parse(urlString)
	if err != nil{
		fmt.Println("error")
		return
	}
	queryParams := parsedURL.Query()
	queryvalue1 := queryParams.Get("querykey")
	queryvalue2 := queryParams.Get("stringkey")

	fmt.Println("querykey의 값 :",queryvalue1)
	fmt.Println("stringkey의 값 : ", queryvalue2)
}

출력

실행 결과

url을 string 값으로 입력받아 'net/url' 패키지를 사용하여 parse후 Query의 값을 얻어왔습니다.

웹 서버 요청에서 Query 읽기

웹 서버의 요청에 담긴 정보에서 QueryString을 확인하는 방법을 알아보겠습니다.

package main

import (
	"fmt"
	"net/http"
)

func main (){
	port := ":8080"
	http.HandleFunc("/", testHandler)
	http.ListenAndServe(port,nil)
}

func testHandler(w http.ResponseWriter, r *http.Request){
	queryParams := r.URL.Query()
	name := queryParams.Get("name")

	if name != ""{
		fmt.Fprintln(w,"Hello,", name)
	}else {
		fmt.Fprintln(w, "Welcome!")
	}
}

결과

위의 코드의 경우 서버를 실행하고 URL의 Query에 따라 출력이 다른 것을 확인할 수 있습니다.

net/url의 경우 string 타입을 url로 parse 하기 위하여 패키지를 사용한 것이고 그 이외에 query를 확인하는 과정은 동일한 것을 알 수 있었습니다.


JSON 데이터 처리

JSON(JavaScript Object Notation)은 데이터 교환을 위한 경량 데이터 형식으로 널리 사용됩니다. Go 언어에서 JSON 데이터를 읽고 쓰려면 'encoding/json' 패키지를 사용합니다.

JSON 읽기

웹 서버에서 JSON을 데이터를 사용하려면 요청의 Body에 담겨있는 JSON을 데이터를 읽고 구조체 필드에 값을 할당하여야 합니다.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)
type Person struct{
    Name string `json:"name"`
    Age int	`json:"age"`
}
func main(){
    port := 8080

    http.HandleFunc("/read",JsonReadHandler)

    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil))
}

func JsonReadHandler(w http.ResponseWriter, r *http.Request){
    var person Person
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&person)

    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    fmt.Printf("이름 : %s, 나이 : %d\n", person.Name, person.Age)

    w.Write([]byte("읽기 성공"))
}

'/read' 경로로 JSON 파일을 보내면 'JsonReadHandler'가 JSON을 Person 구조체로 UnMarshal 합니다.

postman
터미널 출력

JSON 쓰기

Go 언어에서 JSON 데이터를 쓰려면 'encoding/json' 패키지를 사용하여 Go 구조체를 JSON 형식의 데이터로 Marshal 합니다.

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
)
type Person struct{
    Name string `json:"name"`
    Age int	`json:"age"`
}
func main(){
    port := 8080

    http.HandleFunc("/read",JsonReadHandler)

    log.Println("Rainbowbear Server Starting on port :", port)
    log.Fatal(http.ListenAndServe(fmt.Sprint(":", port), nil))
}

func JsonWriteHandler(w http.ResponseWriter, r *http.Request){
    person := Person{
        Name : "RainbowBear",
        Age : 100,
    }

    responseJSON, err := json.Marshal(person)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    w.Write(responseJSON)
}

'JsonWriteHandler'는  'Person' 구조체를 JSON으로 Marshal 합니다.

마지막 3줄에 대한 설명은 아래와 같습니다.

1. 'w.Header().Set("Content-Type", "application/json")'은 HTTP 응답 헤더에 접근하여 응답의 'Content-Type'헤더를 응답이 JSON형식으로 설정합니다.

2. 'w.WriteHeader(http.StatusOK)'는 응답 상태코드를 'http.StatusOK'로 설정하여 요청이 성공적으로 처리되었음을 알립니다.

3. 'w.Write(responseJSON)''w.Write()'메서드를 통하여 응답할 데이터를 지정합니다.

postman

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!