[go] Go 언어를 사용한 RESTful API의 캐싱 메커니즘

소개

캐싱은 성능을 향상시키고 서버 부하를 줄이는 데 도움이 되는 중요한 개념입니다. 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의 응답 시간을 단축시키고 서버 부하를 줄일 수 있으므로, 실제 개발 프로젝트에서도 적용해볼만한 가치가 있습니다.

참고 자료