Go Lang으로 간단하게 CRUD REST API 만들기 2편
1. 개요
이번 포스트로 Go로 Post, Patch, Delete 메서드에 핸들링할 수 있습니다.
1편에서 이어집니다, 1편을 보지 않으신 분들은 아래 링크로 가서 진행해주세요
https://seung.tistory.com/entry/Go%EB%A1%9C-CRUD-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-1
2. 코드
POST (Create)
우선 Request 요청을 받을 구조체를 선업 합니다.
// http 요청에 쓰일 구조체, 속성명을 대문자로 시작해야 외부에서 포인터를 통해 값 할당이 가능
type requestBody struct {
Name string
}
이제 기본 데이터는 필요 없으니 지우고 router에 Post 핸들러를 추가합니다.
func main() {
// 라우터 생성
router := mux.NewRouter()
router.Use(jsonContentTypeMiddleware)
router.HandleFunc("/", documentation).Methods("GET")
// GET 함수 연결
router.HandleFunc("/champions", getChampions).Methods("GET")
// POST 함수 연결
router.HandleFunc("/champions", postChampions).Methods("POST")
fmt.Printf("Listening on http://localhost%s\n", port)
// 서버 실행
log.Fatal(http.ListenAndServe(port, router))
}
그리고 이전에 만들어둔 documentation 함수의 data 값에 Payload를 추가합시다.
// 앞으로 만들 API
data := []urlDescription{
{
URL: "/champions",
Method: "GET",
Description: "Read champions",
},
{
URL: "/champions",
Method: "POST",
Description: "Create champions",
Payload: "Name:string",
},
{
URL: "/champions/{id}",
Method: "PATCH",
Description: "Update champions",
Payload: "Name:string",
},
{
URL: "/champions/{id}",
Method: "DELETE",
Description: "Delete champions",
},
}
POST에 연결할 postChampions 함수와 새로운 아이디 값을 발급해 주는 newID 함수를 추가합니다.
func postChampions(rw http.ResponseWriter, r *http.Request) {
// request 값을 받을 구조체 변수 선언
var requestBody requestBody
json.NewDecoder(r.Body).Decode(&requestBody)
// request 로 받은 Name 값을 사용하여 챔피언 추가
newChampion := &champion{
newID(),
requestBody.Name,
}
champions = append(champions, newChampion)
// 생성 완료 후 Http code 201 created 로 response 해더 설정
rw.WriteHeader(http.StatusCreated)
return
}
// newID : 새롭게 추가할 값의 아이디 가져오기
func newID() int {
if len(champions) > 0 {
return champions[len(champions)-1].ID + 1
} else {
return 1
}
}
아래와 같이 잘 실행됩니다.
제 경우는 POST 요청을 GoLang의 기본 Http Reqeust 기능을 사용하였는데
VS Code나 타 IDE 쓰시는 분들은 해당 IDE 기능(플러그인)이나 Post Man을 사용하시면 됩니다.
PATCH (Update), DELETE (Delete)
업데이트와 삭제를 같이 추가합시다, POST 함수 연결 시킨 부분 아래에 추가합니다.
이때 HandleFunc에서 URL 패턴으로 변수를 선언할 수 있습니다, 아래는 id로 숫자만 받을 수 있게 패턴을 정의했습니다.
// PATCH 함수 연결
router.HandleFunc("/champions/{id:[0-9]+}", patchChampions).Methods("PATCH")
// DELETE 함수 설정
router.HandleFunc("/champions/{id:[0-9]+}", deleteChampions).Methods("DELETE")
이제 핸들러 함수들도 선업 합니다
gorilla/mux를 통해 라우터 변수를 가져올 수 있습니다.
func patchChampions(rw http.ResponseWriter, r *http.Request) {
// request 값을 받을 구조체 변수 선언 및 할당
var requestBody requestBody
json.NewDecoder(r.Body).Decode(&requestBody)
// Router 에서 id로 패턴을 정의 한 값은 mux 를 통해 받을 수 있음
vars := mux.Vars(r)
id, _ := strconv.Atoi(vars["id"])
// 이름 업데이트
for _, champion := range champions {
if champion.ID == id {
champion.Name = requestBody.Name
break
}
}
rw.WriteHeader(http.StatusOK)
return
}
func deleteChampions(rw http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, _ := strconv.Atoi(vars["id"])
// 데이터 삭제
for index, champion := range champions {
if champion.ID == id {
champions = append(champions[:index], champions[index+1:]...)
break
}
}
rw.WriteHeader(http.StatusOK)
return
}
이제 코드를 실행해 봅시다.
의문점 문의 및 오타 피드백은 언제나 환영입니다.
다음 포스트입니다.
'Go Lang > Study' 카테고리의 다른 글
[GoLang] 자료형을 초과한 큰 수를 계산해보자 (0) | 2023.09.01 |
---|---|
[GoLang] 정규식으로 URL 분석기 만들기 (0) | 2023.08.30 |
GoLang으로 느낌 있게 채팅 방 만들어보자 (0) | 2023.08.27 |
Go로 CRUD REST API 만들기 (3) - Bolt DB 연결 (0) | 2023.07.10 |
Go로 CRUD REST API 만들기 (1) (0) | 2023.07.05 |