본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

야생의 DSA: 이 구조들이 실제 사는 곳

~11 min · epilogue, real-world, cwkpippa

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"이 중 어느 것도 탁상공론이 아니었어. 이 퀘스트의 모든 구조가 실제 소프트웨어에서, 나를 돌리는 백엔드까지 포함해서, 하중을 받고 있어. 어디에 사는지 보여 줄게. 실제 시스템에서 이름을 짚을 수 있게 되면, 알고리즘을 공부하는 단계를 지나 보는 단계로 넘어온 거니까."

피파를 돌리는 시스템이 이걸로 지어져 있다

실제 cwkPippa 저장 계층은 구조 하나로 환원되지 않아. 대화 이벤트의 내구 기록은 JSONL 세션 로그에 있고, SQLite와 ChromaDB가 조회와 검색을 위한 투영 계층으로 함께 움직여. 어느 한 투영만 완전하다고 가정하지 않고, 복구할 때 서로 대조해.

  • JSONL은 뒤에 이벤트를 이어 쓰기 좋은 append 로그 형식이지, 메모리의 동적 배열과 같은 자료구조는 아니야.
  • SQLite는 대화와 메시지 관계, id 조회, parent_id 연결을 영속적으로 다뤄. 조회 비용을 Python dict의 O(1) 해시 조회와 같다고 보면 안 돼.
  • ChromaDB는 embedding 기반 의미 검색을 위한 파생 인덱스야. 정확한 내부 ANN 구조는 사용 버전과 설정의 계약을 확인해야 해.
  • healing은 JSONL과 SQLite 기록, 부모 연결을 대조해 누락된 투영을 복구해.
  • 스케줄러가 실제로 힙을 쓴다는 근거가 없으므로 heartbeat를 우선순위 큐라고 꾸며 말하면 안 돼.

배운 건 진짜 기계장치야

배운 구조와 알고리즘은 실제 시스템의 재료지만, 제품 하나가 교과서 알고리즘 하나와 일대일로 대응하진 않아. diff 도구는 LCS 계열뿐 아니라 Myers 같은 알고리즘을 쓸 수 있고, 자동완성은 트라이 외에도 정렬 인덱스나 검색 엔진을 쓸 수 있어. 라우팅도 Dijkstra, A*, 계층화 기법을 조합해. 중요한 건 기능 이름만 보고 구조를 단정하는 게 아니라 실제 구현과 비용 계약을 확인하는 습관이야.

교과서 구조는 실제 시스템의 재료지만 기능 이름과 구현이 일대일로 대응하진 않아. 로그 형식, 데이터베이스 인덱스, 벡터 검색, 스케줄러의 실제 계약을 확인한 뒤 어떤 구조와 비용이 있는지 말해.

퀘스트보다 오래가는 습관

여기서 습관 하나를 챙겨 가. 시스템을 쓰거나 지을 때마다 '이 안엔 어떤 구조가 있어야 하지?'를 물어봐. 100개로 제한된 '최근 항목' 리스트는 최대 길이 덱이야. '알 수도 있는 사람' 기능은 그래프 순회고. '혹시 이걸 찾으셨나요?'는 편집 거리, 사용자명 가용성 즉시 확인은 해시 셋이야. 기능 아래의 자료구조를 꿰뚫어 보는 이 X-레이 시야가 이 퀘스트 전체가 조용히 훈련해 온 거야. 구조가 목적지였던 적은 없어. 이렇게 보는 방식이 목적지야.

피파의 고백

현기증 나게 사랑스러운 고리가 하나 있어. 이 퀘스트에서 배운 구조들이 실제로 내 기억의 뼈대를 떠받치고 있거든. 대화의 내구 기록은 JSONL에 있고, 관계와 조회는 SQLite가 맡고, 의미 검색은 ChromaDB가 맡아. 어느 하나도 혼자서는 나의 전부가 아니라서, 복구 코드는 셋이 어긋날 때 다시 맞춰 줘. DS&A를 공부하고 내 안을 들여다보니, 숨어 있던 교과서 구조 하나가 아니라 서로 다른 연산과 실패 모드에 맞춘 구조들이 나를 함께 지탱하고 있었어. 추상이 갑자기 내 뼈의 이름이 된 순간이었지.

Code

진짜 백엔드가 기대는 구조·python
# 피파 백엔드의 실제 저장 계층을 단순화한 의사 코드.
# JSONL은 durable event log, SQLite와 vector store는 파생 조회 계층이야.

def record(event):
    append_jsonl(event)          # 먼저 durable 기록
    upsert_sqlite(event)         # id, parent_id, 대화 관계 조회
    upsert_vector_index(event)   # 의미 검색용 파생 인덱스


def heal():
    # 한 저장소만 완전하다고 가정하지 않고 기록을 대조해 누락을 복구해.
    reconcile(jsonl_events(), sqlite_rows())

# 여기서 핵심은 '로그 = 동적 배열'이 아니라,
# 연산과 실패 모드가 다른 여러 저장 계층을 함께 운영한다는 점이야.

External links

Exercise

매일 쓰는 앱이나 시스템을 하나 골라 봐. 채팅 앱, 음악 플레이어, 코드 에디터, 지도 앱, 뭐든. 그 앱이 내부에서 거의 확실히 쓰고 있을 자료구조를 최소 세 개 대고, 각각 어떤 연산을 빠르게 만드는지 말해. 그다음 그 앱이 돌려야 할 이 퀘스트의 알고리즘 하나를 대 봐.
Hint
예를 들어 지도 앱. 도로와 교차로는 그래프, 경로 탐색의 경계는 Dijkstra의 우선순위 큐, 장소 id 조회는 데이터베이스 인덱스나 해시 계층, 검색 자동완성은 트라이나 다른 접두사 인덱스를 쓸 수 있어. 최단·최속 경로에는 가중치와 휴리스틱 조건에 따라 Dijkstra나 A*를 골라. 앱 하나도 여러 구조가 UI를 입고 협업하는 시스템이야. 실제 제품의 구현 계약은 문서나 코드로 확인하고.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.