Today I Learned
날짜
2024년 10월 17일 목요일
내용
path parameter VS query parameter
네이버 커머스 API를 보면서 열심히 개발중이다. 상품 상세페에지에 이미지를 추가해야 하는데 PUT이라 덮어 씌워지는 형태다. 따라서 우선 데이터를 조회하고, 거기서 상세정보 페이지 데이터만 변경한 후 다시 보내줘야 한다.
분명 “https://naver-api/commerce/v1/origin-product/{ProductOriginNo}” 로 보내면 된다고 하는데, 자꾸 없는 리소스라고 한다. 네이버 문서에 의하면, 없는 주소로 요청을 보냈다는 의미다. 분명 맞는데… 그러다 발견했다. 저 상품 넘버를 “path parameter”로 보내라고 쓰여있었다. 실제로 위에 써져 있는 형태는 path parameter다.
근데 나는 query parameter로 생각했다. 그래서
“~~~/origin-product?ProductOriginNo=123123” 형식으로 보내고 있었는데.. 둘은 완전히 다른 거였다. 바보인가.
S3의 pre-signed url
생성한 이미지는 S3에 업로드된다. 유저는 해당 이미지를 다운받을 수 있는데, 버킷 내 이미지 객체의 URL에 GET 요청을 보내도록 만들면 된다. 하지만 이 URL에는 우리 S3에 대한 정보들이 다소 담겨있다. 이름이라던가, 디렉토리 구조라던가.. 유저가 접근하지 못하도록 하기 위해 다른 방법을 알아보다가 pre-signed url을 발견했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def get_presigned_url(self):
"""
기존에 저장되어있는 S3 데이터를 가져오는 함수
"""
try:
self.s3_client = boto3.client("s3")
prefix = f"public/{id}.png"
response = self.s3_client.generate_presigned_url(
"get_object",
Params={"Bucket": "bucket_name", "Key": prefix},
ExpiresIn=60,
)
return response
except Exception as e:
logger.exception("S3에서 다운로드 중 에러 발생 %s", e)
boto3의 s3 클라이언트에서 제공하는 기능이다. 저 reponse에는 내가 지정한 객체에 접근할 수 있는 URL이 담긴다. 제한시간은 ExpiresIn
으로 설정할 수 있는데 ,나는 60초로 해놨다. 저 시간이 지나면 해당 URL은 무효화된다.