소개
캐싱은 성능을 향상시키고 서버 부하를 줄이는 데 도움이 되는 중요한 개념입니다. RESTful API에서도 캐싱을 사용하여 응답 시간을 단축시키고 불필요한 데이터베이스 또는 외부 서비스 호출을 줄일 수 있습니다.
이 기술 블로그에서는 Go 언어를 사용하여 RESTful API의 캐싱 메커니즘을 구현하는 방법에 대해 알아보겠습니다.
캐시 라이브러리 선택
Go 언어에서는 다양한 캐시 라이브러리를 사용할 수 있습니다. 대표적으로 Groupcache
, BigCache
, GoCache
등이 있습니다. 이 중에서 GoCache
를 사용하여 예시를 작성해보도록 하겠습니다.
GoCache 설치
GoCache를 설치하기 위해 다음 명령을 실행합니다:
go get github.com/patrickmn/go-cache
예시 코드
다음은 간단한 예시 코드입니다. 이 코드는 GET /user/{id}
엔드포인트를 캐싱하여 같은 요청이 들어올 경우 데이터베이스 호출을 하지 않고 캐시에서 응답을 제공합니다.
package main
import (
"fmt"
"log"
"net/http"
"strconv"
"github.com/patrickmn/go-cache"
)
var c *cache.Cache
func main() {
c = cache.New(cache.NoExpiration, cache.NoExpiration)
http.HandleFunc("/user/", getUser)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func getUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(r.URL.Path[len("/user/"):])
if err != nil {
http.Error(w, "Invalid user ID", http.StatusBadRequest)
return
}
// 캐시에서 데이터 조회
data, found := c.Get(fmt.Sprintf("user-%d", id))
if found {
fmt.Fprintln(w, "From cache:", data)
return
}
// 데이터베이스에서 데이터 조회 및 캐시에 저장
data = fetchDataFromDatabase(id)
c.Set(fmt.Sprintf("user-%d", id), data, cache.DefaultExpiration)
fmt.Fprintln(w, "From database:", data)
}
func fetchDataFromDatabase(id int) string {
// 데이터베이스에서 데이터 조회하는 로직 작성
...
// 예시로 "User Name"을 리턴하도록 설정
return "User Name"
}
실행 및 테스트
위의 예시 코드를 main.go
파일로 저장한 후, 다음 명령을 실행하여 서버를 실행합니다:
go run main.go
서버가 실행되면 http://localhost:8080/user/1
에 접속하여 사용자 정보를 확인할 수 있습니다. 동일한 요청을 여러 번 보내면 처음 한 번은 데이터베이스에서 데이터를 가져오지만, 이후에는 캐시에서 데이터를 불러오는 것을 확인할 수 있습니다.
결론
Go 언어를 사용하여 RESTful API의 캐싱 메커니즘을 구현하는 방법에 대해 알아보았습니다. 캐싱을 통해 API의 응답 시간을 단축시키고 서버 부하를 줄일 수 있으므로, 실제 개발 프로젝트에서도 적용해볼만한 가치가 있습니다.