Django Serializer에서 is_valid를 쓰는 이유

Today I Learned 날짜 2025년 1월 10일 금요일 내용 is_valid() 페이스북 로그인을 구현하고 있다. 열심히 API를 만들었더니 처음 보는 오류가 뜬다. “message”: “You must call .is_valid() before accessing .validated_data.” 알아보니.. 시리얼라이저에서 발생하는 오류였다. 1 2 3 4 5 6 7 8 9 10 11 12 def get(self, request, shop_id): try: data = ShopFacebookProfile__Manager.get_by_shop_id(shop_id=shop_id) ... def patch(self, request: Request, shop_id: int): try: serializer = ShopFacebookProfile__Serializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) ... 두 요청의 차이는 입력 데이터를 직렬화 과정에서 데이터를 검증하는지가 있다. 첫번째 get요청은 데이터를 받아서 별다른 직렬화를 진행하지 않는다. 따라서 데이터가 예상하는 것과 전혀 다른 것이 들어와도 요청 수준에서는 어떤 검증도 하지 않는다. 물론 내부 로직이 진행되는 과정에서 데이터 형식이 달라 함수들이 오류를 뱉는 것은 별개의 문제지만… ...

2025년 1월 10일 · 1 분 · 배준수

Sentry에서 Stack Trace를 추가하는법

Today I Learned 날짜 2024년 1월 9일 목요일 내용 Sentry에서 Stack Trace를 추가하는법 에러가 난 구체적인 코드를 아는 건 서비스의 에러를 해결하는데 정말 큰 도움이 된다. (구) 글로벌팀의 서비스들은 Sentry를 사용하고 있는데 구체적인 에러의 위치가 나타나지 않는다. 이전부터 지속적으로 웹훅에 오류가 발생하고 있는 상황이라 이 기능이 꼭 필요하다. 이걸 Stack Trace라고 한다. 사실 이전에 시도를 했었다. Github Integration을 하면 된다고 했는데, 그 이후에도 보이지 않는다.. 이렇게 추가해줬다. 하지만 에러 메시지가 출력이 안되는데… capture_exception() 을 사용하면 된다는 글을 이제야 봤다. 빠르게 적용해봤다. ...

2025년 1월 9일 · 1 분 · 배준수

데이터베이스 CPU 사용률이 높은 문제

Today I Learned 날짜 2024년 1월 8일 수요일 내용 데이터베이스가 이상하다. 여전히 쇼피파이 웹훅이 주기적으로 크게 실패하는 모양새를 보인다. 저렇게 주기적으로 크게 몰아서 실패하는 모양새다. 오류의 원인은 다양하지만 대개 400: error in update_shopify_product_by_webhook(psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint “shopify_product_pkey” 이렇다. 쇼피파이에서 상품에 붙는 고유 ID를 우리 데이터베이스에서도 unique로 해놨다. 말그대로 고유한 값이므로 전혀 문제될 게 없다. 1 2 3 4 5 6 7 8 9 10 11 12 db_shopify_product = get_shopify_product_by_origin_id_and_service_id( shopify_store=shopify_store, origin_id=data["origin_id"], db=db, ) if not db_shopify_product: res = create_shopify_product( shopify_store=shopify_store, data=data, db=db, ) 코드는 이렇게 되어있다. origin_id 가 쇼피파이에서 붙이는 고유한 값이다. 그 값으로 찾아서 없으면 생성해준다. 애초에 이 웹훅이 “상품 업데이트” 웹훅이기 때문에 없는 상품에 관한 정보가 들어올리가 없다. 들어왔다면 우리 쪽에 문제가 있어 데이터가 유실된 것이니 만들어주도록 작성해놨다. ...

2025년 1월 8일 · 2 분 · 배준수

Mixin in CSS

Today I Learned 날짜 2024년 1월 7일 화요일 내용 믹스인 CSS에서도 공통된 스타일을 적용할 수 있고, 함수처럼 변수를 넣어 특정 스타일을 가변으로 둘 수도 있다고 한다. 믹스인이라는 건데… 1 2 3 4 5 6 7 // 정의 .flex-row (@justify: center, @gap: 0) { display: flex; align-items: center; justify-content: @justify; gap: @gap; } 이런식으로 정의하고 ...

2025년 1월 7일 · 1 분 · 배준수

페이스북 로그인 구현하기

Today I Learned 날짜 2024년 1월 6일 월요일 내용 페이스북 로그인을 구현하자 결국 태그된 게시물을 가져오기 위해, 페이스북 로그인을 추가해주기로 했다. 이전에 해봤던 작업이기 때문에 전체적인 틀이나 방식에 대해선 잘 알고 있다. 페이지와 인스타그램 비즈니스 계정은 1대1 관계라., 계정정보를 저장하는 테이블에 페이스북 페이지 정보와 토큰을 저장하는 필드를 추가했다. 구현하다가 알게된건 이전에 내가 이용했던 것과는 다른듯 하다.. 예전에는 페이스북 API에 접근하기 위한 페이스북 로그인을 구현했었다. 이번에는 인스타그램 API를 접근하기 위한 페이스북 로그인을 구현하기 때문에 조금 달랐다. 실제로 전자는 페이지 정보를 모두 가져와서 유저가 인스타그램 비즈니스 계정이 연결된 페이지를 선택하는 기능을 우리가 직접 만들어야 했는데 후자는 페이스북 쪽에서 제공하는 화면에서 다 처리되서 편하다. 지금에서야 이해가 되었으니 편하지 만들때는 헷갈려 죽을 뻔했지만… ...

2025년 1월 6일 · 2 분 · 배준수

51% 풀스택 개발자 되기

Today I Learned 날짜 2024년 1월 3일 금요일 내용 51% 스택 개발자 되기 반쪽자리 풀스택 개발자에서 조금은 진화하는 중이다. 백오피스에 모든 스크립트를 정보를 불러오고, 현재 설치된 스크립트를 불러와 비교한 후 설치된것과 안된것을 구별하는 코드를 작성했다. 1 2 3 4 5 6 7 8 9 10 11 combineScriptLists() { ... 기존 코드 if (appType !== undefined) { ... 진행 로직 ... } else { console.warn(`Invalid appTypeKey: ${appTypeKey}`); } }); } } 이렇게 짰는데.. 존경하는 프론트엔드 동료분께 리뷰를 받았다. ...

2025년 1월 3일 · 2 분 · 배준수

범인은 메타였다.

Today I Learned 날짜 2025년 1월 2일 목요일 내용 범인은 메타일지 모른다. 태그된 게시물이 불러와지지 않는다는 이슈가 또 접수되어… 희망 없이 인터넷을 맴돈지도 일주일이 넘은듯 하다. 이세상에 나와 같은 이슈를 겪는 자는 정말 없을까… 현재 서비스 이용자 전체를 조회해보니 700개가 넘은 인스타그램 계정 중에 239개만 태그된 게시물을 불러올 수 있고, 539개 계정에선 불러와지지 않는다. 대체 이게 무슨일이람… 도저히 진척되지 않는 상황에 지쳐서 GG를 쳤고 다른 서비스에서는 잘 되는지 확인해보았다. 정말 내 문제인지, 메타의 문제인지… 그런데 거기서도 우리랑 똑같은 오류가 뜬다. 진짜 메타에서 제대로 안주는 게 원인일 지도 모른다는 의미다! ...

2025년 1월 2일 · 1 분 · 배준수

print와 logging의 차이 : stdout buffer

Today I Learned 날짜 2024년 1월 31일 수요일 내용 logging과 print 문의 차이 : stdout buffer logging과 print의 차이에 대해 많이 찾아봤는데 디버깅을 위해선 logging문을 쓰는 것이 좋다는 의견이 대다수다. 사실 그냥 다 logging을 쓰라고 한다. 단순 출력이 아닌, 오류 메시지나 변수 내용, 위치 등을 다양하게 출력할 수 있으니 print가 쓰기는 편해도 전체 디버깅 작업의 속도를 높이는데는 logging이 훨씬 효과적이다. backgrountasks에서 print가 작동이 안되는 이유에 대해선 정확한 내용을 찾기 힘들었는데, stdout buffer가 원인이라는 얘기가 있다.stdout은 표준 출력 데이터를 의미한다. 반대로 stdin은 표준 입력(ex. 키보드) 데이터를 의미한다. 백준에서 알고리즘을 풀다보면 키보드 입력을 input() 이나 sys.stdin.readline() 으로 받곤 하는데 여기서 stdin이 나오는 걸 알 수있다. print 함수는 stdout을 사용하여 출력한다. print문이 콘솔창에 찍히는 것도 표준 출력으로서 나타나는 것. ...

2024년 1월 31일 · 3 분 · 배준수

QA, 구글 API 비용 예측

Today I Learned 날짜 2024년 1월 30일 화요일 내용 계속 QA를 진행하고 있다. 키워드 추출 실패 갑자기 특정 경우에 키워드를 추출해내는데 실패하고 있다. 키워드는 nltk 관련 문제라 AI가 고장난 건 아니였다. 안되는 상품의 URL을 들어가보니 리뷰들이 모두 한글로 작성되어있었다. 그동안 리뷰가 당연히 영어로 가져와질 것이라고 생각했는데, 원어(작성 언어)와 접속시 설정한 언어 중 하나로 선택할 수 있었다. 문장을 단어 단위로 쪼개는 tokenize는 punkt 데이터를 사용하는데 어제 말했듯 정말 다양한 언어 데이터가 존재하지만, 긍정 부정을 판별하는 opinion_lexicon은 영어밖에 없었다. 리뷰를 항상 영어 번역하여 가져오도록 했더니 해결되었다. ...

2024년 1월 30일 · 4 분 · 배준수

NLTK 데이터 파일 저장하기

Today I Learned 날짜 2024년 1월 29일 월요일 내용 기능 개발이 끝나고 QA를 시작했다. nltk 지난주에 nltk 패키지에서 필요한 데이터들을 templates 폴더에 추가하여 추가적인 다운로드 없이 사용하도록 코드를 작성했었다. 테스트 서버에서 오류가 발생했는데, 범인은 금요일이 연차여서 존경하는 선배님께서 원상복구 해주셨다. 문제 해결을 위해, 고민의 원점에 서서 차근차근 생각하며 다양한 방법을 생각했다. 현재 해결하고자 하는 것은 무엇인가? nltk 패키지에서 사용할 데이터 다운로드 횟수를 최소한으로 만들자. 그 목적은 무엇인가? 불필요하게 반복되는 데이터 다운로드는 리소스 낭비기 때문이다. 해결하기 위한 방법들은 무엇들이 있는가? templates 디렉토리 내에 데이터를 저장한다(현재). S3, Git Large File Storage 등의 스토리지 서비스를 이용한다. dockerFile에 이미지 빌드 시 필요한 데이터를 다운로드 하도록 한다. 방법 (a)의 동작을 정상화 시킨다고 하더라도, 간과한 문제가 있었다. nltk에서 다운로드 하는 데이터는 3가지다. ...

2024년 1월 29일 · 3 분 · 배준수