본문 바로가기

전체 글

(23)
미션 시스템 구축기 : 정합성을 위한 설계 전환 (feat. Redis + Celery) 안녕하세요 🙂이번 글에서는 서비스 내 미션 기능을 구현하면서 겪었던 고민들과, 결국 Redis와 Celery를 이용해 비동기 처리를 도입하게 된 과정에 대해 이야기해보려 합니다.문제의 시작: 이벤트마다 수십 개의 쿼리?사용자가 글을 작성하거나, 좋아요를 누르거나, 특정 시간에 접속하는 등 어떤 행동을 했을 때, 그 행동이 미션 조건을 만족하는지 판단해주는 로직이 필요했습니다.그런데 문제는...미션 조건마다 DB 쿼리를 한 번씩 보내야 한다는 점이었죠.처음엔 “조건 몇 개만 확인하면 되겠지” 싶었지만, 실제로 구현에 들어가 보니 상황은 달랐습니다.미션 조건마다 별도의 DB 쿼리가 필요했고, 글 작성이나 좋아요 같은 이벤트 하나당 적게는 5~10개의 조건을 검사해야 했습니다.결국 단일 요청으로 10건에서 ..
Tortoise ORM의 테스트 initializer 함수, 왜 connection을 없애버릴까? 안녕하세요 🙂이번 글에서는 Tortoise ORM 기반 FastAPI 프로젝트에서 테스트 환경을 구성하던 중 겪었던 예상치 못한 오류와 이를 해결한 경험을 공유하려고 합니다.저는 이전 글에서 소개했듯, Tortoise ORM에서 UUID와 관련된 문제로 인해 QueryExecutor 유틸을 만들어 raw SQL로 일부 로직을 처리하고 있었습니다. 이 구조는 실제 서버에서는 잘 동작했지만, 테스트 환경에서는 완전히 다른 문제가 발생했어요.테스트에서만 터지는 이상한 오류기존 테스트 코드는 다음과 같은 형태로 작성되어 있었습니다: await QueryExecutor.execute_query( "SELECT * FROM user WHERE user_id = UNHEX(REPLACE(?, '-', ''))..
[ORM 선택기] FastAPI 프로젝트에서 Tortoise ORM vs SQLAlchemy vs EdgeDB(gel) 안녕하세요 🙂이번 글에서는 제가 FastAPI 기반 신규 기능 개발을 진행하면서 사용해본 ORM과 DB 관련 기술들에 대해 이야기해보려고 합니다.처음에는 Tortoise ORM을 주로 사용했고, 필요에 따라 SQLAlchemy도 써봤으며, 최근에는 EdgeDB도 함께 살펴보고 있는데요.각 기술의 특징과 제가 느낀 점을 솔직하게 공유합니다. 1. SQLAlchemySQLAlchemy는 Python에서 가장 전통적이고 인기 있는 ORM입니다.기본적으로 동기적 코드를 지원하지만, 내부적으로 greenlet 같은 도구를 이용하여 비동기 전환도 가능하며, 제가 직접 테스트해본 결과 성능 차이는 거의 없었습니다.풍부한 문서와 커뮤니티: 참고 자료가 많아 문제 해결에 용이합니다.강력한 기능과 유연성: 복잡한 쿼리 ..
레거시 바이너리 UUID vs. Tortoise ORM 문자열 UUID - 충돌의 비밀을 파헤치다 안녕하세요 🙂이번 글에서는 텔링미 서비스 개발 과정에서 겪었던 UUID 관련 문제와 이를 해결한 경험을 공유하려고 합니다.제가 합류했을 당시, 기존 백엔드 서버는 Java 기반이었고, Hibernate ORM을 사용해 데이터베이스와 연동하고 있었습니다.신규 기능은 Python 기반의 FastAPI + Tortoise ORM 구조로 마이그레이션을 진행하던 중이었고,저는 유저의 미션 시스템 개발을 맡게 되었어요.이때 가장 큰 골칫거리 중 하나가 바로 UUID 처리 방식의 차이였습니다.UUID, 왜 이렇게 골치 아플까?텔링미의 사용자 데이터는 아래와 같은 보안상의 이유로 모두 UUID 기반으로 관리되고 있었습니다.사용자 식별자는 랜덤 UUID 기반으로 생성→ 외부에서 ID를 추정하거나 예측하기 어렵게 설계데..
팀의 일원이 된다는 것 – 텔링미 프로젝트에서 배운 것들 TellingMe v2 백엔드 개발 회고안녕하세요 🙂저는 최근, 감정 기반 기록 서비스 TellingMe의 v2 프로젝트에서신규 미션 및 보상 시스템, 구매 기능 등 핵심 기능 개발을 맡아 백엔드 개발을 진행했습니다.잠깐 TellingMe에 대해서 소개하자면,TellingMe는 바쁜 현대인들이 매일 한 가지 질문을 받고 자신에 대해 돌아볼 수 있도록 돕는 서비스로매일 오후 6시에 질문을 전달하고, 사용자는 답변을 통해 감정을 기록하고 공유합니다.현대 사회에 스스로를 돌아보며 자신에 대해서 알아갈 수 있는 시간이 부족하다고 느끼는데,현대인들에게 꼭 필요한 서비스가 아닌가 싶습니다.왜 이 프로젝트에 참여했을까?제가 TellingUs 팀에 합류하게 된 이유는 크게 두 가지입니다. 첫째, 실제 사용자들이 있는..
DB - 04 MongoDB 앞으로 아래의 기준을 가지고 몇 가지 Nosql 모델을 살펴볼 생각이다.1. 모델의 특징2. 분산처리에 강점이 있는 이유3. Data Quality 중 중요하게 생각하는 특성4. 사용 예시일단 Document-Oriented DataBase인 MongoDB에 대해서 알아보자.MongoDB의 특징 및 구조MongoDB는 Nosql중 현재 가장 많이 쓰는 데이터베이스로 Bson이라는 문서형식의 데이터를 저장한다.Bson(Binary Json)의 약자로 JSON 문서를 기계어에 가깝게 만들어 컴퓨터가 이해하기 쉽게 만든 문서이다.때문에 데이터를 빠르게 분석하고 의미를 이해할 수 있다.MongoDB는 RDBMS에서 Table과 같은 역할을 하는 Collection이 있다.예를 들어 User Tabel == Us..
DB - 03 Nosql (Not only SQL) Nosql이란?Nosql이란 RDBMS와는 완전 반대의 성격을 지닌 DBMS이다.Nosql은 동적 스키마, 대량의 분산데이터를 다루는 시스템을 지원하여 대용량 및 빠른 속도의 데이터 처리가 가능하다.물론 RDBMS도 현재는 클라우드 서비스를 이용하며 수평적 확장이 가능해져 대용량 서비스를 처리할 수 있게 되었다.하지만 이미지,영상과 같은 반정형, 비정형 데이터를 다루는데 있어서는 고정적인 스키마를 이용하는 RDBMS는 어려움이 존재한다.RDBMS의 이런 특징과 반대로 Nosql은 아주 유연한 스키마 구조를 가지고 있어 다양한 형태의 데이터를 다루는데 강점을 가지고 있다.Nosql은 데이터를 여러 노드에 분산시켜 저장하여, 단일 노드의 부담을 줄이고 데이터를 병렬로 처리할 수 있어 빅데이터 처리에 능하다...
DB - 02 RDBMS(Realation DBMS) RDBS란?RDBMS는 관계형 데이터베이스 시스템으로 데이터를 표 형태로 구조화하여 관리한다. 표 형태의 데이터 구조를 RDBMS에서는 TABLE이라 한다. 테이블은 속성과 그에 대응하는 데이터 값으로 이루어져 있다. 속성은 테이블에 담긴 데이터의 특징을 나타내고, 이를 통해 다른 테이블과 관계를 맺을 수 있다. 각 테이블의 열(column)은 Attribute or Field라 칭하고, 행(Row)는 Record, Tuple이라 한다.Schema란?Schema는 데이터베이스의 구조를 정의하는 설계도를 의미한다. 구체적으로 말하자면 테이블, 행, 열, 인덱스, 관계 등의 데이터베이스 구조를 정하는 것이다. 여기서 인덱스(Index)는 데이터베이스에서 데이터 검색의 속도를 빠르게 하기 위해 사용하는 객체로..