>백엔드 개발 >Golang >Go로 RESTful API 구축

Go로 RESTful API 구축

DDD
DDD원래의
2024-10-11 10:24:29432검색

Building RESTful APIs with Go

풀 스택 개발자를 위한 백엔드 엔지니어링 시리즈 2부에 오신 것을 환영합니다! ? 오늘은 가장 기본적인 주제 중 하나인 RESTful API 구축을 Go로 살펴보겠습니다. 내부 도구를 구축하든 공개 API를 구축하든 RESTful 엔드포인트를 구성하고 구현하는 방법을 이해하는 것이 중요합니다.

이 게시물에서 다룰 내용은 다음과 같습니다.

  • API를 RESTful하게 만드는 요소(및 이것이 중요한 이유).
  • 엔드포인트를 설계하고 HTTP 메서드를 처리하는 방법
  • Go의 net/http 패키지와 Gorilla Mux를 사용하여 간단한 CRUD API 구축.
  • JSON 요청 및 응답 처리.

마지막에는 Go에서 확장 가능한 RESTful API를 설계하고 구현하는 방법을 확실히 이해하게 될 것입니다. 시작해 봅시다! ?


API를 RESTful하게 만드는 것은 무엇입니까? ?

코드를 살펴보기 전에 API를 RESTful하게 만드는 요소를 빠르게 살펴보겠습니다. REST(Representational State Transfer)는 다음 원칙을 따르는 API를 구축하기 위한 아키텍처 스타일입니다.

  1. 상태 비저장: 클라이언트의 각 요청에는 이를 처리하는 데 필요한 모든 정보가 포함되어야 합니다. 서버는 세션 정보를 저장하지 않습니다.
  2. 리소스 지향: URL은 /users, /products 또는 /orders와 같은 리소스를 나타내며 HTTP 메소드는 작업을 정의합니다.
  3. HTTP 메서드: RESTful API는 HTTP 메서드를 사용하여 작업을 지정합니다.
    • GET: 데이터를 검색합니다.
    • POST: 새로운 리소스를 생성합니다.
    • PUT: 기존 리소스를 업데이트합니다.
    • 삭제: 리소스를 제거합니다.
  4. HTTP 상태 코드 사용: RESTful API는 HTTP 상태 코드(성공 시 200, 찾을 수 없는 경우 404 등)를 효과적으로 활용합니다.

Go 프로젝트 설정

Go와 Gorilla Mux 라우터를 사용하여 사용자 관리를 위한 기본 CRUD API를 구축해 보겠습니다. 우리 API에는 다음과 같은 엔드포인트가 있습니다.

HTTP Method Endpoint Action
GET /users Retrieve all users
GET /users/{id} Retrieve a specific user
POST /users Create a new user
PUT /users/{id} Update an existing user
DELETE /users/{id} Delete a user
HTTP 방식 엔드포인트 액션 받기 /사용자 모든 사용자 검색 받기 /사용자/{id} 특정 사용자 검색 포스트 /사용자 새 사용자 만들기 넣어 /사용자/{id} 기존 사용자 업데이트 삭제 /사용자/{id} 사용자 삭제

1단계: 종속성 설치

먼저 라우팅을 위해 Gorilla Mux 라우터를 설치합니다.

go get -u github.com/gorilla/mux

시작하려면 간단한 main.go 파일을 만드세요.

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    // Define routes here
    http.Handle("/", r)

    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

2단계: 핸들러 정의

이제 API 핸들러를 정의해 보겠습니다. 이는 CRUD 작업에 해당합니다. 이 예에서는 간단한 인메모리 맵을 사용하여 사용자 데이터를 저장하겠습니다.

인메모리 데이터 저장소

type User struct {
    ID   string `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

var users = make(map[string]User)

3단계: CRUD 핸들러 구현

각 CRUD 작업을 구현합니다: 생성, 읽기, 업데이트, 삭제

GET /users – 모든 사용자 검색
func getUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var userList []User
    for _, user := range users {
        userList = append(userList, user)
    }
    json.NewEncoder(w).Encode(userList)
}
GET /users/{id} – 특정 사용자 검색
func getUser(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    user, found := users[params["id"]]
    if !found {
        http.Error(w, "User not found", http.StatusNotFound)
        return
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}
POST /users – 새 사용자 생성
func createUser(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    var user User
    _ = json.NewDecoder(r.Body).Decode(&user)
    users[user.ID] = user
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(user)
}
PUT /users/{id} – 기존 사용자 업데이트
func updateUser(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    user, found := users[params["id"]]
    if !found {
        http.Error(w, "User not found", http.StatusNotFound)
        return
    }
    _ = json.NewDecoder(r.Body).Decode(&user)
    user.ID = params["id"]  // Ensure the ID stays the same
    users[params["id"]] = user
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}
DELETE /users/{id} – 사용자 삭제
func deleteUser(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    _, found := users[params["id"]]
    if !found {
        http.Error(w, "User not found", http.StatusNotFound)
        return
    }
    delete(users, params["id"])
    w.WriteHeader(http.StatusNoContent)
}

4단계: 경로 등록

이제 핸들러를 정의했으므로 기본 함수에서 라우터에 경로를 추가해 보겠습니다.

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/users", getUsers).Methods("GET")
    r.HandleFunc("/users/{id}", getUser).Methods("GET")
    r.HandleFunc("/users", createUser).Methods("POST")
    r.HandleFunc("/users/{id}", updateUser).Methods("PUT")
    r.HandleFunc("/users/{id}", deleteUser).Methods("DELETE")

    http.Handle("/", r)

    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

5단계: API 테스트

Postman 또는 컬 명령을 사용하여 API를 테스트할 수 있습니다. 새 사용자를 생성하고 사용자를 검색하는 방법은 다음과 같습니다.

  1. 새 사용자 만들기:
   curl -X POST http://localhost:8080/users \
   -H "Content-Type: application/json" \
   -d '{"id":"1", "name":"John Doe", "age":30}'
  1. 모든 사용자 가져오기:
   curl -X GET http://localhost:8080/users
  1. 특정 사용자 확보:
   curl -X GET http://localhost:8080/users/1
  1. 사용자 업데이트:
   curl -X PUT http://localhost:8080/users/1 \
   -H "Content-Type: application/json" \
   -d '{"name":"John Smith", "age":31}'
  1. 사용자 삭제:
   curl -X DELETE http://localhost:8080/users/1

RESTful API 구축 모범 사례

  1. 적절한 HTTP 방법 사용: 읽기에는 GET, 생성에는 POST, 업데이트에는 PUT, 삭제에는 DELETE를 사용하여 RESTful 원칙을 따릅니다.
  2. 적절한 상태 코드 반환: 항상 올바른 HTTP 상태 코드를 사용하세요(예: 성공적인 리소스 생성의 경우 201 생성됨, 누락된 리소스의 경우 404 찾을 수 없음).
  3. 정상적으로 오류 처리: 내부 오류를 사용자에게 노출하지 마세요. "사용자를 찾을 수 없음" 또는 "잘못된 요청"과 같은 일반적인 메시지를 사용하세요.
  4. 대규모 데이터 세트에 페이지 매김 사용: 큰 목록(예: /users)을 반환할 때 페이지 매김을 구현하여 과도한 데이터 로드를 방지하세요.
  5. API 보안: JWT 또는 OAuth2와 같은 인증 방법을 사용하여 민감한 엔드포인트를 보호하세요.

다음은 무엇입니까?

이제 기본 RESTful API를 구축했으므로 데이터를 유지할 수 있도록 데이터베이스 지원을 통합할 차례입니다. 다음 게시물에서는 ORM을 사용하여 Go API를 데이터베이스에 연결하는 방법을 살펴보겠습니다. 3부도 기대해 주세요! ?

위 내용은 Go로 RESTful API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.