본문 바로가기
코딩 아카이브/Golang

맨땅에 헤딩하는 Go 백엔드 1

by SteadyForDeep 2022. 3. 1.
반응형
 

Golang REST API 만들기

오늘은 Golang으로 간단한 REST API를 만드는 방법을 쓸까 한다. 바로 시작하자 우선은 Directory를 하나 만들고 시작 mkdir rest go module 등록 go mod init noah.io/ark/rest main.go 생성 touch main.go Direc..

woony-sik.tistory.com

우선 위 블로그를 참고하여 작성하였음을 밝힌다.

 

http://golang.site/go/basics

 

예제로 배우는 Go 프로그래밍 - Go 프로그래밍 언어 소개

1. Go 개발자들 GO 프로그래밍 언어는 2007년 구글에서 개발을 시작하여 2012년 GO 버젼 1.0을 완성하였다. GO는 이후 계속 향상된 버젼을 내 놓았으며 2015년 말에는 1.5.2 버젼에 이르렀다. 흔히 golang 이

golang.site

위의 포스팅 또한 굉장히 도움이 되었다.

감사의 말씀을 올린다.

 

지금 Go를 처음 깔아서 진짜 아무것도 모르는 상태로 API 서버를 만들어보려고 한다.

기본적인 지식으로는 파이썬을 이용해서 간단한 API 서버를 빌드해 본 적이 있고

역시 파이썬과 마크다운을 이용한 데이터 시각화 프론트 엔드 조금

그리고 C/C++ 프로젝트를 진행해 본적이 있다.

필요한 정보만 기록하고 나머지 정보는 생략하도록 하겠다.

 

// Go로 API 서버 만들기

 

Go에서는 package라는 단위로 모든 코드들이 묶여 있는데

다른 package를 불러와서 작성되어 있는 함수들을 사용할 수 있다.

조사결과 net/http 라는 package가 기본으로 제공되고 있다.

아래의 링크 참조

https://pkg.go.dev/net/http#pkg-examples

 

http package - net/http - pkg.go.dev

HTTP Trailers are a set of key/value pairs like headers that come after the HTTP response, instead of before. package main import ( "io" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/sendstrailers", func(w http.ResponseWriter, req *

pkg.go.dev

 

이 net/http를 호출하고 사용하여 http를 이용한 RESTful API 서버를 만들 수 있다.

 

// GET

 

가장 간단한 서버를 만들어 본다.

이렇게 실행하면

핀과제이크보고싶다

 

성공했다. 이걸로 원하는 응답을 작성할 수 있다.

 

// POST

 

POST API를 사용해서 원하는 형태의 json을 받아보고 분석해보자.

 

그러기 위해서는 우선 json을 인코딩/디코딩 할 수 있는 패키지가 필요하다.

내장되어 있는 encoding/json 패키지를 불러오면 된다.

 

주고받는 값을 확인할 수 있게 터미널에 출력하는 부분도 필요하다.

fmt 패키지를 이용하겠다.

 

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type ReqInfo struct {
	Request_name  string
	Request_email string
}

func main() {

	// localhost:port/
	http.HandleFunc("/", func(wr http.ResponseWriter, r *http.Request) {
		wr.Write([]byte("This is main page."))
	})

	// localhost:port/json
	http.HandleFunc("/json", func(wr http.ResponseWriter, r *http.Request) {
		if r.Method == http.MethodPost {
			var user_info ReqInfo

			json.NewDecoder(r.Body).Decode(&user_info)
			fmt.Println(user_info)

			json.NewEncoder(wr).Encode(user_info)

		}
	})

	http.ListenAndServe(":8880", nil)

}

 

POST 요청을 보내는 작업은 postman 이라는 어플을 사용했다.

굉장히 편하다.

 

 

받은 요청의 메소드가 POST 인 경우에만 실행하도록 하였다.

받은 요청을 encoding/json 로 파싱하기 위해

디코더를 생성하고 파싱했고 user_info 에 내용을 담았다.

담은 내용은 그대로 터미널에 출력하고 다시 응답에 담아서 보냈다.

응답과 터미널의 내용을 확인할 수 있다.

 

user_info는 ReqInfo 라는 구조체로 정의되는데

이때 특이한 점은 이 ReqInfo라는 구조체를 선언할 때

무조건 구조체 내부의 변수 이름이 대문자로 시작해야 동작한다. 이 부분은 좀 더 조사해 볼 것.

아무튼 json 에 들어있는 키 값과 구조체의 변수 이름이 일치하면 파싱해서 구조체의 변수에 넣어준다.

아직 완벽하게 이해하지는 못했다.

 

순서만 지키면 되므로 예컨데 이런 방법도 된다.

구조체를 이렇게 바꾸고

요청을 이렇게 보내면

잘 동작한다.

요청을 보낼 때 숫자를 따옴표로 감싸면 타입이 맞지 않으므로 int의 default값인 0이 출력된다.

반응형

댓글