티스토리 뷰

이전 글에서 RFM Segment 라벨링을 빅쿼리에 적재하는 방법을 소개했었습니다. 

 

태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기

 

태블로 Rest API 로 view 데이터 csv 로 다운받고 빅쿼리에 저장하기

태블로에서 RFM 대시보드를 만들고 이를 활용해서 CRM 캠페인 액션들을 수행한뒤 유져벌 RFM 세그먼트 이동을 관찰해야 한다. 하지만 이를 정기적으로 다운로드 받아서 구글 시트에 저장해야하는

botongsaram.tistory.com

 

RFM 점수에 따라 세그멘트를 분류하면 아래와 같이 유저별로 이렇게 세그먼트 라벨이 생성됩니다. 

 

이 데이터를 브레이즈 커넥티드 콘텐츠로  활용할 수 있게 만들면 효율적이겠다는 판단이 들었습니다.

 

구글링을 해보니 비개발자도 손쉽게(?) 구현 가능하겠다는 판단이 들어서 API를 만드는 방법을 소개하려고 합니다.

user_id RFM_Segment_nm created_at(데이터 적재일)
a 이탈한 고객 2025-01-01
b 떠날 위험이 큰 고객 2025-01-01
c 충성 고객 2025-01-01
d 로열티 가망 고객 2025-01-01
e 신규 고객 2025-01-01
... ... 2025-01-01

 

 

브레이즈 커넥티드 컨텐츠란? 
외부 서버에 있는 정보를 API로 가져와서 메시지에 활용하는 기능입니다.
브레이즈에 데이터가 저장되지 않아 DP 소진이 안 되는 장점도 있다고 합니다. 

 

커넥티드 컨텐츠는  GET / POST 방식 둘 다 사용 가능하고 이번에 만들어 볼  API는 GET 요청의 형식입니다.

 

GET / POST 란?
GET / POST 는 HTTP 메서드로 클라이언트에서 서버로 뭔가 요청할 때 사용합니다. 

그럼 HTTP 메서드는 뭐냐? 
클라이언트가 서버에 요청의 목적 / 종류를 알리는 수단입니다. 
아 안에는 GET, POST, PUT, PATCH, DELETE, HEAD, OPTION, CONNECT로 8가지가 있지만
여기선 GET/POST 만 알면 될 것 같습니다.

 

 

  GET 방식 POST 방식
사용 목적 서버에 리소스 요청 서버에 리소스 생성 / 업데이트 할 때
DB로 표현하면  SELECT CREATE
Body 유무  없음 있음 

 

 

이제 본격적으로 구현해봅시다. 

 

Cloud Function 이 빅쿼리를 쿼리해서 데이터를 반환하는 API를 만드는 과정이라고 보시면 됩니다. 

 

일단 GCP 에 가서 서비스 계정 2개를 만들 겁니다 

 

하나는 API 게이트웨이 만들 때 사용하고 다른 하나는 Cloud Functions을 만들 때 쓸 겁니다.

 

API 게이트웨이란?
클라이언트가 서버와의 소통하는 다리 역할 (API가 지나다니는 통로!)

 

서비스 계정 2개 만들기

서비스 계정 2개 생성하기

 

그리고 각 계정 생성 시 권한을 아래와 같이 부여합니다

  권한
API Gateway 에 사용할 계정 Cloud Functions 호출자
Cloud Functions 에 사용할 계정 BigQuery 읽기 세션 사용자
BigQuery 작업 사용자

 

그리고 추가로 Cloud Functions에 사용할 계정에 BigQuery에서 조회할 특정 테이블만 권한을 부여해 줍니다. 

 

공유 → 새 주 구성원에 Cloud Functions에 사용할 계정(~~~@iam.gserviceaccount.com~~~)을 추가하고 아래와 같이 BigQuery 데이터 뷰어 권한으로 설정해 주세요.

Cloud Functions 만들기

Cloud Functions에서 함수 만들기를 누르고 아래와 같이 설정합니다.

환경은 1세대(2세대도 상관없으나.. ) 나머지는 이미지 내 설정대로 하고 아래 런타임 서비스 계정을 이전 단계에서 생성한 서비스 계정 중 Cloud Functions에 사용할 계정을 선택해줘야 합니다

그다음 이제 코드를 작성합니다. 

코드 동작은  HTTP 요청을 받아 BigQuery 쿼리를 실행하고, 결과를 JSON 형태로 반환하는 코드입니다. 

 

requirement.txt 에는 아래 3가지 라이브러리만 있으면 됩니다.

  • google-cloud-bigquery
  • google-cloud-storage
  • pandas

 

함수를 생성할 때 진입점을 꼭 기재해 주셔야 동작을 합니다

from google.cloud import bigquery
import json
from datetime import date, datetime

def bigquery_to_api(request):
    try:
        print("Request received.")  # 요청 수신 로그

        # BigQuery 클라이언트 생성
        client = bigquery.Client()
        print("BigQuery client created.")  # 클라이언트 생성 로그

        # 쿼리 작성
        query = """
            SELECT cust_id, rfm_seg_nm 
            FROM `{테이블명}`
            WHERE created_at = (
                SELECT MAX(created_at)
                FROM `{테이블명}`
            )
        """
        print(f"Query to be executed: {query}")  # 쿼리 출력

        # 쿼리 실행
        query_job = client.query(query)
        print("Query executed. Waiting for results...")  # 쿼리 실행 로그

        # 쿼리 결과 가져오기
        results = query_job.result()
        print("Query results fetched.")  # 결과 가져오기 로그

        # JSON 직렬화 가능한 형식으로 변환
        def serialize_row(row):
            return {
                key: (value.isoformat() if isinstance(value, (date, datetime)) else value)
                for key, value in dict(row).items()
            }

        rows = [serialize_row(row) for row in results]

        # 가져온 결과 중 일부만 출력
        sample_rows = rows[:10]  # 최대 10개만 샘플로 출력
        print(f"Number of rows fetched: {len(rows)}")  # 전체 결과 개수
        print(f"Sample rows: {json.dumps(sample_rows, indent=2)}")  # 샘플 결과 출력

        return json.dumps(rows), 200, {'Content-Type': 'application/json'}
    except Exception as e:
        # 예외 처리 및 에러 로그 출력
        print(f"Error occurred: {str(e)}")
        return json.dumps({'error': str(e)}), 500, {'Content-Type': 'application/json'}

 

API Config 파일 만들기

이제 API을 실행을 위한 yaml 파일을 만들어 줘야 합니다. 

 

이 파일의 역할은 Google Cloud API Gateway에서 API를 정의하고 설정하기 위해 사용됩니다.

 

API 요청을 클라이언트로부터 수신해서 Cloud Functions로 전달하는 게이트웨이를 구성한다고 생각하시면 됩니다.

 

또한 이 파일에서 API의 요청 방식(GET / POST)을 정의해 줍니다. 


sublime text 하나 여시고 로컬에 저장(아래 코드)하고 API Gateway에 업로드해줍니다.

 

여기서 address는 앞에서 만든 Cloud Function의 트리거 URL을 복사에서 붙여 줍니다.

아래 파일제목의 확장자는. yaml로 저장해 줍니다.

swagger: "2.0"
info:
  title: "test_rfm_api"
  description: "API 설명"
  version: "1.0.0"
paths:
  /rfm_api: -- 위에서 만들었던 클라우드 함수 이름
    get:
      summary: "Get RFM data from BigQuery"
      description: "Returns Recent BigQuery data."
      operationId: "getRFMData"
      parameters:
        - name: "x-api-key"
          in: "header"
          required: true
          type: "string"
      responses:
        "200":
          description: "Successful response"
          schema:
            type: "array"
            items:
              type: "object"
              properties:
                field_name:
                  type: "string"
      x-google-backend:
        address: "https://asia-northeast3-{프로젝트ID}.cloudfunctions.net/rfm_api"
        protocol: "http/1.1"
      security:
        - api_key: []
securityDefinitions:
  api_key:
    type: "apiKey"
    name: "x-api-key"
    in: "header"

 

 

이제 GCP 콘솔에서 API Gateway를 검색해서 게이트웨이를 만듭니다. 

 

아래 API 사양 업로드에 바로 직전에 생성한 yaml 파일을 업로드하고 아래 서비스 계정 선택에서 처음에 생성한 계정 중 API Gateway에 사용할 계정을 선택해 줍니다. 

이제 마지막 단계 

API 키 만들기

 

콘솔에서 API 및 서비스를 검색합니다.

 

API 키를 만들어 줍니다.

 

 

생성 후에 API 키를 복사합니다.

 

아래 설정 중에 'API 제한 설정'이 있는데 API Gateway 설정해 줍니다. 

드디어 API 호출!

터미널에서 아래와 같이 입력하면 이렇게 데이터가 출력됩니다!

curl -X GET \
-H "x-api-key: {api_key}" \
"https://{위에서 만든 게이트 웨이 URL}/rfm_api"

 

{위에서 만든 게이트웨이 URL}/{.yaml파일내 path값}

api 호출 결과

 

 

 

 

 

 

 

 

참고글

https://cloud.google.com/api-gateway/docs/creating-api-config?hl=ko

 

API 구성 만들기  |  API Gateway Documentation  |  Google Cloud

의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 구성 만들기 기본 요건 API 구성을 만들려면 먼저 다음을 확인합니다. API 구성 ID 요구사항 아

cloud.google.com

 

https://zoe1.medium.com/how-to-set-up-an-api-with-a-cloud-function-backend-that-queries-bigquery-on-gcp-5e3f88b508f6

 

How to set up an API with a Cloud Function backend that queries BigQuery on GCP

This article will show you how to create an API with API Gateway with a Cloud Functions backend that takes in a date in the API query and…

zoe1.medium.com

 

최근에 올라온 글