23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
SK하이닉스에서는 Google Sheets, Airtable과 비슷한 웹기반 스프레드 시트 Goodocs를 운영하고 있습니다.
Goodocs 서비스는 업무 자동화를 위해 API를 제공하고 있는데요.
키값 하나로 데이터를 전부 받으려면 코드를 여러 줄 작성해야 하는 불편함이 있습니다.
기존 API가 불편하게 구성되어 있어, 매번 불편하게 이용하는건 별로겠죠?
이럴 때 Gateway 서버를 만들어서 기존 API를 Wrapping하면 좋습니다!
Gateway를 구성하면 다른 서비스에서도 이용할 수 있고, 좀 더 본인의 필요에 맞게 API를 구성할 수 있기 때문이죠.
Gateway를 만들어서 편하게 데이터를 불러오는 것이 목표입니다.
기존 API는 아래와 같이 데이터를 불러올 수 있습니다.
rows, cols 따로 불러와야 합니다.
저희가 원하는 테이블 형태의 데이터를 받으려면 rows, cols를 조합해야 돼요.
import json
import requests
ROOT = '.../openAPI/v1'
HEADERS = {'Content-type': 'application/json'}
def get_cols(doc_id, params):
url = f'{ROOT}/column'
params['DOC_ID'] = str(doc_id)
response = requests.post(url, headers=HEADERS, data=json.dumps(params))
cols_str = response.json()['COLS']
cols_raw = json.loads(cols_str)
return cols
def get_rows(doc_id, params):
url = f'{ROOT}/row'
params['DOC_ID'] = str(doc_id)
response = requests.post(url, headers=HEADERS, data=json.dumps(params))
rows_str = response.json()['ROWS']
rows_raw = json.loads(rows_str)
return rows_raw
params = {'USER_ID': '...', ...}
doc_id = '...'
rows = get_rows(doc_id, params)
cols = get_cols(doc_id, params)rows에서 원하는 데이터를 받았지만, 열 이름은 키값으로만 받았습니다.
cols는 데이터는 있지만, 저희가 원하는 {키값: 열 이름} 형태로 받진 못했습니다.
저희가 원하는건 API 호출 한번으로 DataFrame을 만드는 것입니다.
import requests
import pandas as pd
BASE_URL = '.../api/v1/gooddocs'
params = {'USER_ID': '...', ...}
doc_id = '...'
url = f'{BASE_URL}/{doc_id}/'
response = requests.get(url, params=params)
rows = response.json()
data = pd.DataFrame(rows)이제 원하는 서비스를 만들면 됩니다.
rows, cols를 기존 API에서 받아와서 가공을 해주고, API로 만들어줍니다.
# util.py
import json
import requests
ROOT = '.../openAPI/v1'
HEADERS = {'Content-type': 'application/json'}
def get_cols(doc_id, params):
url = f'{ROOT}/column'
params['DOC_ID'] = str(doc_id)
response = requests.post(url, headers=HEADERS, data=json.dumps(params))
cols_str = response.json()['COLS']
cols_raw = json.loads(cols_str)
cols = {}
for col in cols_raw:
if 'userSetting' not in col:
continue
field = col['field']
name = col['headerName']
cols[field] = name
return cols
def get_rows(doc_id, params):
url = f'{ROOT}/row'
params['DOC_ID'] = str(doc_id)
response = requests.post(url, headers=HEADERS, data=json.dumps(params))
rows_str = response.json()['ROWS']
rows_raw = json.loads(rows_str)
cols = get_cols(doc_id, params)
rows = []
for row in rows_raw:
new_row = {}
for col, name in cols.items():
new_row[name] = row[col]
rows.append(new_row)
return rows# main.py
from fastapi import FastAPI
from .util import get_rows
app = FastAPI()
@app.get('/api/v1/gooddocs/{doc_id}')
async def read(doc_id: str, USER_ID: str, ...):
params = {'USER_ID': USER_ID, ...}
rows = get_rows(doc_id, params)
return rows이제 만들어둔 Gateway에 docs_id만 넣어서 호출해주기만 하면 됩니다.
저희가 딱 필요한 데이터만, 원하는 형태로 받을 수 있죠!
사내에서 만든 API이기 때문에, 만든 부서에서 쓰기 쉽게 수정하면 되는거 아닌가 생각할 수 있습니다.
일단 API를 배포하면, 사내라고 해도 쉽게 변경하기 어렵습니다. 해당 API에 의존하고 있는 다른 서비스도 맞춰서 변경해야 하죠.
또한 각 부서에서 필요한 데이터가 다르고, 원하는 형태가 다를 수 있습니다.
그렇기 때문에 Micro Service Architecture에서는 각 부서가 Gateway (Simple Wrapper)를 만들어서 쓰는 구조가 좋습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.