먼저 Go 언어를 설치하고 환경을 설정해야 합니다. Go 공식 웹사이트에서 Go 언어를 다운로드하고 설치할 수 있습니다. 설치가 완료되면 명령줄에서 go version
을 입력하여 설치가 제대로 되었는지 확인할 수 있습니다.
저는 미리 설치한 상태여서
위와 같이 뜨게 됩니다!
이제 프로젝트 설정을 해보도록 하겠습니다. 새로운 디렉토리를 만들고 다음 명령을 실행합니다.
mkdir my-rest-api
cd my-rest-api
go mod init github.com/username/my-rest-api
mkdir my-rest-api
: 이 명령은 현재 디렉토리에서 "my-rest-api"라는 이름의 새 디렉토리를 생성합니다. 이 디렉토리는 새로운 REST API 프로젝트의 루트 디렉토리가 됩니다.
cd my-rest-api
: 이 명령은 방금 생성한 "my-rest-api" 디렉토리로 이동합니다. 이제 작업할 프로젝트 디렉토리 내부로 진입했습니다.
go mod init github.com/username/my-rest-api
: 이 명령은 Go 모듈을 초기화합니다. Go 모듈은 Go 프로젝트의 의존성을 관리하는 시스템입니다. 이 명령은 현재 디렉토리를 기준으로 새로운 Go 모듈을 초기화하며, 해당 모듈의 경로를 github.com/username/my-rest-api로 설정합니다. 여기서 username은 GitHub 계정 이름이며, my-rest-api는 프로젝트의 이름입니다. 이렇게 함으로써 이 프로젝트는 GitHub에 있는 github.com/username/my-rest-api 경로에서 가져올 수 있는 Go 모듈로 설정됩니다.
Go 언어에서 RESTful API를 작성할 때 유용한 패키지인 net/http
와 gorilla/mux
를 가져와야 합니다.
go get github.com/gorilla/mux
이제 Go 코드로 간단한 RESTful API를 작성할 차례입니다. 책 목록을 관리하는 API를 만들어 보겠습니다!
package main
import (
"encoding/json"
"log"
"net/http"
"github.com/gorilla/mux"
)
type Book struct {
ID string `json:"id,omitempty"`
Title string `json:"title,omitempty"`
Author string `json:"author,omitempty"`
Year string `json:"year,omitempty"`
}
var books []Book
func GetBooks(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(books)
}
func main() {
router := mux.NewRouter()
// 샘플 데이터
books = append(books, Book{ID: "1", Title: "1984", Author: "George Orwell", Year: "1949"})
books = append(books, Book{ID: "2", Title: "To Kill a Mockingbird", Author: "Harper Lee", Year: "1960"})
// 핸들러 등록
router.HandleFunc("/books", GetBooks).Methods("GET")
// 서버 시작
log.Fatal(http.ListenAndServe(":8000", router))
}
package main
: 이 코드는 현재 파일이 main 패키지에 속한다는 것을 선언합니다. Go 프로그램은 항상 main 패키지에서 시작합니다.
필요한 패키지 가져오기
encoding/json
: JSON 데이터를 인코딩 및 디코딩하기 위한 패키지.log
: 간단한 로깅 기능을 제공하는 패키지.net/http
: HTTP 클라이언트 및 서버를 생성하기 위한 패키지.github.com/gorilla/mux
: HTTP 라우터를 구현하기 위한 외부 패키지. gorilla/mux
는 강력한 라우팅 및 URL 매칭 기능을 제공합니다.Book 구조체 정의
Book
구조체는 책에 대한 정보를 나타내며, ID
, Title
, Author
, Year
필드를 가지고 있습니다. 구조체 필드의 태그들은 JSON 직렬화를 위한 옵션을 제공합니다.var books []Book
: 책 목록을 저장하기 위한 전역 변수를 선언합니다.
GetBooks
함수
GetBooks
함수는 HTTP 응답 작성을 통해 책 목록을 반환합니다. json.NewEncoder(w).Encode(books)
를 통해 책 목록을 JSON 형식으로 인코딩하고, w http.ResponseWriter
를 통해 응답을 작성합니다.main
함수
main
함수는 프로그램의 진입점입니다.mux.NewRouter()
를 사용하여 새로운 라우터를 생성합니다.books
슬라이스에 추가합니다.router.HandleFunc("/books", GetBooks).Methods("GET")
를 사용하여 "/books" 엔드포인트에 대한 GET 요청을 처리하는 핸들러를 등록합니다.http.ListenAndServe(":8000", router)
를 사용하여 서버를 시작하고, 8000 포트에서 HTTP 요청을 처리하며, 라우터를 통해 요청을 라우팅합니다.log.Fatal
을 사용하여 서버 시작에 실패하면 로그를 출력하고 프로그램을 종료합니다.이제 작성한 코드를 실행하여 API 서버를 실행할 차례입니다.
go run main.go
API 서버가 실행 중이므로 브라우저나 curl을 사용하여 API 엔드포인트에 GET 요청을 보내어 데이터를 확인할 수 있습니다!
curl http://localhost:8000/books
저는 postman을 이용해서 테스트를 해보겠습니다!
값이 잘 나오는 것을 확인했습니다.