1. 쿼리스트링(Query String)을 사용한 이유
메모장 앱의 API 서버 개발 중,
유저가 작성한 메모 리스트를 보여주는 GET 메소드 API 를 만들려 한다.
사용할 쿼리문은 아래와 같다.
query = '''select id, title, datetime, content, createdAt, updatedAt
from memo
where userId = %s
order by datetime desc;'''
하지만 위의 쿼리문으로 API서버를 만들게 되면, 몇 개가 있을지 모르는 메모 리스트를 한번에 모두 불러오게 된다.
한번에 그렇게 많은 정보를 처리하면 서버에 과부하가 걸리게 된다.
따라서 우리가 일반적으로 사용하는 앱들은 일정량의 리스트를 불러오고,
유저가 스크롤을 끝까지 내리면 추가로 다시 불러오는 방식으로 개발되어 있다.(페이징 처리)
나 또한 그런 방식으로 만들고 싶다.
그러면 쿼리문을 아래와 같이 수정해줘야 한다.
query = '''select id, title, datetime, content, createdAt, updatedAt
from memo
where userId = %s
order by datetime desc
limit 0, 4;'''
여기서 다시 문제가 발생한다.
0과 4는 내가 임의로 정한 숫자이고, 시작점과 끝점은 유동적으로 변하기 때문에 변수로 받아야 한다.
하지만 GET과 DELETE 메소드는 Body 부분에 데이터를 넣을 수 없고, 저 자리는 %s placeholder도 사용할 수 없다.
해결방법은 바로 쿼리스트링을 사용하는 것이다!
2. 쿼리스트링(Query String) 이란?
- 쿼리스트링은 사용자가 입력 데이터를 전달하는 방법 중의 하나로,
- URL 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것을 말한다.
- URL에서 ? 뒤에 나오는 부분이 쿼리스트링이다.
- /path?key1=value1&key2=value2&key3=value3 과 같이, key=value 형식으로 데이터를 전달하고 &로 구분한다.
3. 쿼리스트링을 사용한 API 코드
from flask import request
from flask_restful import Resource
from mysql_connection import get_connection
from flask_jwt_extended import jwt_required, get_jwt_identity
from mysql.connector import Error
class MemoListResource(Resource):
@jwt_required()
def get(self):
user_id = get_jwt_identity()
# 클라이언트에서 쿼리스트링으로 보내는 데이터는
# request.args에 들어있다.
offset = request.args.get('offset')
limit = request.args.get('limit')
# request.args는 딕셔너리 형태다.
# .get()으로 가져오는 이유!
# request.args['key값']으로 접근하면 key가 없는경우 에러발생
# request.args.get('key값')으로 접근하면 key가 없어도 에러발생 X
try:
connection = get_connection()
query = '''select id, title, datetime, content, createdAt, updatedAt
from memo
where userId = %s
order by datetime desc
limit ''' + offset + ''', ''' + limit + ''';'''
record = (user_id, )
cursor = connection.cursor(dictionary=True)
cursor.execute(query, record)
result_list = cursor.fetchall()
# timestamp타입으로 된 컬럼 값을 json으로 전달할 수 있게 변환
i = 0
for row in result_list:
result_list[i]['createdAt'] = row['createdAt'].isoformat()
result_list[i]['updatedAt'] = row['updatedAt'].isoformat()
result_list[i]['datetime'] = row['datetime'].isoformat()
i += 1
cursor.close()
connection.close()
except Error as e:
print(e)
cursor.close()
connection.close()
return {'error' : str(e)}, 500
return {'result' : 'success',
'items' : result_list,
'count' : len(result_list)}, 200
4. 포스트맨으로 테스트
Params 탭에 KEY와 VALUE를 입력하면 자동으로 쿼리스트링이 추가된 URL을 완성시켜준다.
Send를 눌러 테스트 해본다.
정상적으로 4개의 행만 가져온 것을 확인할 수 있다.
'REST API' 카테고리의 다른 글
API서버 - AWS Rekognition을 사용한 Object Detection API (0) | 2023.01.13 |
---|---|
API서버 - @jwt_required(optional=True)를 이용한 분기 처리 (0) | 2023.01.10 |
Flask - PROPAGATE_EXCEPTIONS에 대한 이해 (0) | 2023.01.06 |
Flask에서 JWT 사용하기 (flask-jwt-extended) (0) | 2023.01.05 |
API서버 - Flask JWT를 사용한 로그아웃 API 만들기 (0) | 2023.01.05 |