본문 바로가기

공부11

FCM 디바이스 토큰의 최대 길이 0. 들어가며Firebase Cloud Messaging(FCM)을 사용하여 푸시 알림 기능을 구현하다 보면 한 번쯤 마주하는 질문이 있다.FCM에서 발급하는 디바이스 토큰을 저장할 DB 컬럼의 길이는 얼마로 설정해야 하지?" 당연해 보이는 질문이지만 놀랍게도 Firebase 공식 문서 어디에서도 명확한 답을 찾을 수는 없다.FCM 토큰의 길이 정보와 현실적인 해결책에 대해 조사한 결과를 정리해 보았다.1. 공식 스펙이 없는 이유FCM 공식 문서에서 토큰의 길이 스펙이 없는 것은 미래에 있을 변경에 대해 유연성을 확보하기 위한 의도적인 정책이다.공식 문서에는 어떠한 패턴도 명시되어 있지 않으므로, 유효한 모든 문자열이 허용됩니다. 형식은 미래에 변경될 수 있으니, 특정 패턴으로 유효성을 검사하지 마십시오.. 2025. 9. 14.
Push 알림이 도착하는 과정 1. Push 알림이란?일반적으로 클라이언트와 서버는 요청과 응답 관계로 통신한다.클라이언트(앱)가 서버에 "새로운 상품 정보 보여줘"라고 요청하면, 서버는 그에 맞는 데이터를 응답해 주는 형식이다.이 관계에서 중요한 점은 항상 클라이언트가 대화를 시작한다는 것이다.서버는 클라이언트의 요청 없이는 먼저 말을 걸 수 없다. 하지만 앱이 꺼져 있거나 백그라운드 상태일 때, 서버에서 긴급한 할인 정보나 중요한 배송 상태 변경이 발생한다면 어떻게 사용자에게 알릴 수 있을까?기존의 요청-응답 구조로는 불가능할 것이다.여기서 Push라는 개념이 등장한다.Push는 서버가 먼저 클라이언트에게 보내는 메시지이다.클라이언트의 요청이 없는 상황에서도 서버가 필요에 따라 먼저 정보를 밀어주어(Push) 사용자의 기기에 메.. 2025. 9. 4.
SQLAlchemy와 Session 1. SQLAlchemySQLAlchemy는 파이썬 생태계에서 관계형 데이터베이스를 연결해 주는 라이브러리이다.개발자들이 데이터베이스를 다룰 때 생기는 복잡성을 줄여주는 ORM(Object Relational Mapper) 중 하나이다.2. ORMORM은 코드로 데이터베이스를 관리하며 생기는 불편함에서 등장하게 되었다.관계형 데이터베이스는 테이블과 관계를 기반으로 데이터를 관리하지만, 코드에서는 객체를 사용해 데이터를 다룬다.두 방식의 컨셉 차이 때문에 개발자는 데이터베이스와 코드를 연결할 때 여러 번거로움과 비효율을 겪는다. ORM은 객체와 데이터베이스의 데이터를 자동으로 연결(mapping)하여 코드로 데이터베이스를 자연스럽게 다룰 수 있도록 돕는다. ORM을 사용해 users 테이블을 조작하는 예시.. 2025. 5. 5.
FastAPI에서 다형성 요청 처리하기 0. 개요FastAPI로 서버를 개발하다 보면 다양한 형태의 요청 데이터를 받게 된다.특히 하나의 엔드포인트에서 여러 타입의 요청을 처리하는 상황에서는 어떻게 구조를 잡을지 고민이 많아진다. 이번 포스팅에서는 Pydantic을 활용하여 하나의 엔드포인트에서 다형성 요청을 처리하는 방법을 설명한다.1. 시나리오서비스에 사용자가 결제 수단을 등록할 수 있는 API가 있다고 가정해 보자.사용자는 원하는 결제 수단을 선택하여 등록하게 된다.결제 수단은 신용카드, 계좌이체, 간편 결제 총 3가지이고, 각 결제 수단이 필요로 하는 정보는 모두 다르다. 결제 수단 별 요청 형태는 다음처럼 작성할 수 있다.이처럼 하나의 API에서 다형적인 요청을 처리하려면 FastAPI에서는 어떻게 구현해야 할까?2. Pydantic.. 2025. 4. 19.
DELETE Method와 멱등성 0. 204 No Content vs. 404 Not Found최근 존재하지 않는 리소스를 삭제하라는 요청이 들어왔을 때 204(No Content)와 404(Not Found) 중 어떤 상태 코드를 반환할지 고민한 적이 있다.처음에는 DELETE 메서드는 멱등성을 가져야 하기 때문에 항상 같은 상태 코드를 반환할 수 있는 204가 적합하다고 생각했다. 그러나 리서치를 진행하면서 내가 멱등성에 대해 오해를 하고 있었다는 사실을 알게 되었다.Dave Callan의 포스팅을 기반으로 적절한 상태 코드 선택 방법과 멱등성에 대한 오해를 풀어보겠다. In a REST API should we return 204 (No Content) or 404 (Not Found) for a HTTP DELETE reques.. 2025. 4. 16.
FastAPI에서 StreamingResponse 활용 시 DB 세션 관리 이번 글에서는 FastAPI, Starlette, Uvicorn을 사용할 때의 ASGI 프로토콜 동작 방식을 살펴보고, 미들웨어를 통한 DB 세션 관리 시 주의할 점과 트랜잭션 처리 방식을 설명한다.1. FastAPI의 ASGI 통신 이해하기FastAPI 애플리케이션을 Uvicorn으로 실행할 때 내부적으로 어떤 일이 일어나는지 이해하는 건 중요하다. FastAPI와 Starlette는 ASGI(Asynchronous Server Gateway Interface)를 기반으로 동작하고 비동기 처리를 지원한다. Django나 Flask 같은 동기 프레임워크가 사용하는 WSGI(Web Server Gateway Interface)와는 다르다.정확한 요청 흐름은 다음과 같다: Uvicorn이 HTTP 요청을 A.. 2025. 3. 30.
Triton Inference Server와 비동기 gRPC로 통신하기 1. Triton Inference Server NVIDIA Triton Inference Server — NVIDIA Triton Inference Serverdocs.nvidia.comTriton Inference Server is an open source inference serving software that streamlines AI inferencing.Triton Inference Server는 NVIDIA에서 제공하는 오픈소스 AI 모델 추론 서버이다. 학습된 모델을 서빙하기 위해서는 웹 개발 지식이 필요하다.Triton은 모델 연구자에게 웹 개발에 대한 부담을 덜어주기 위한 서비스라고 생각하면 된다. 학습된 모델 파일을 model repository에 저장하면 별도의 코드를 작성할 필요.. 2025. 2. 11.
FastAPI의 페이지네이션 성능 개선기 1. FastAPI에서 페이지네이션 처리 방법FastAPI에서는 기본적으로 페이지네이션 기능을 제공하지 않는다.페이지네이션 기능을 구현하기 위해 fastapi-pagination이라는 별도의 라이브러리를 사용한다.2. 요구사항데이터베이스의 Item 테이블에는 id, name, price 필드가 존재한다.Item의 전체 목록을 반환하는 페이지네이션 API를 구현해야 한다.id, name, price 필드와 함께 price의 90% 가격인 할인 후 가격(discounted_price)을 계산해서 반환해야 한다.이 요구사항을 어떻게 구현할 수 있을까?3. 기본 페이지네이션 함수로 구현코드는 다음과 같이 동작한다:get_data_from_db() 함수에서 데이터베이스의 정보를 sqlalchemy model 객체.. 2025. 1. 30.
DB 암호화 방식 1. DB에서 암호화가 필요한 경우개인정보를 데이터베이스에 보관하는 경우 민감정보와 고유식별정보는 암호화하여 보관해야 한다. (개인정보보호법)https://blog.naver.com/n_privacy/80142669914 [개인정보보호법 이해하기] 민감정보 vs 고유식별정보지난 9월 30일 개인정보보호법이 본격 시행됨에 따라 개인정보의 정의나 범위에 대한 문의를 종종 받곤 합...blog.naver.com2. 개인정보 암호화 예시학생 테이블(Students)과 반 정보 테이블(Classes)이 있다고 가정하자.이때 "학생의 반 정보는 민감정보이다."라는 요구사항이 생겼을 때, 어떤 컬럼을 암호화해야 할까?2-1. id 암호화우선 아래와 같이 학생 테이블의 class_id를 암호화할 수 있을 것이다.id .. 2025. 1. 18.
브라우저의 요청이 서버까지 가는 과정 (DNS 요청 과정) 0. 들어가며https://blog.wonyangs.com/29 AWS Route53으로 티스토리 도메인 바꾸기0. 들어가며기존 내 블로그 주소는 https://gemstoneyang.tistory.com/이었다.주소가 너무 길어 미관상 마음에 들지 않았기 때문에 새로운 주소로 바꾸게 되었다. 프로젝트를 하며 임시 도메인이 필요해blog.wonyangs.com지난 글에서 티스토리 도메인을 바꾸는 과정을 다루었다.이번 글에서는 도메인을 바꾸기 전 상황에서 티스토리 서버로 요청이 어떻게 가는지 DNS 요청을 중심으로 살펴본다.1. 전체 DNS 요청 과정gemstoneyang.tistory.com으로 요청을 하는 상황에서 티스토리 서버의 IP를 받아오기까지의 과정이다.각 과정을 하나씩 살펴보자.(1) 로컬 D.. 2024. 12. 13.