728x90

2026/03 10

프리렌은 여비가 부족하다.

프리렌은 항상 돈이 없다.천년을 살았고, 마왕을 잡은 용사 파티의 일원이었으며, 대륙에서 손꼽히는 마법사인데도 여비가 늘 모자란다. 경유하는 모든 마을의 마법 상점에서 마법 도구나 마도서를 사 모으기 때문이다.옷을 깨끗하게 해주는 마법, 꽃밭을 만드는 마법, 동상을 녹이는 마법. 누가 봐도 쓸모없는 것들이다. 마왕을 잡으려면 화력이 필요하지, 꽃밭이 무슨 소용이겠나.그런데도 프리렌은 마법 상점 앞을 그냥 지나치는 법이 없다. 여비가 모자라질 걸 알면서도.2000년, 밀레니엄이라는 단어가 희망처럼 느껴지던 해였다.97년에 첫 입사를 하고 3년쯤 지났을 때다. 월급이 너무 적었다. 그러다 누군가의 도움으로 돈을 좀 벌게 되었는데, 그 돈으로 내가 산 건 모토로라 스타텍이 아니었다. 69만원짜리 Compaq ..

EP.06 — Write 버퍼 병합: send()를 덜 부를수록 빠른 이유

이 글은 『서버 개발 수기』 시리즈의 여섯 번째 글이다.지난 회에서는 7종 참조 카운팅을 다뤘다.오늘은 데이터를 보내는 이야기다.※ 이 시리즈에서 다루는 서버 코드는 Project-AO(Ancient Origin)라는 가명으로 부른다.택배 이야기MMORPG에서 유저가 필드에 서 있다. 서버가 이 유저한테 보내야 할 정보가 한꺼번에 쏟아져 나온다.1. 옆에 있는 유저가 움직였다 (12바이트)2. 몬스터가 스킬 썼다 (20바이트)3. 파티원 HP가 변했다 (8바이트)4. 채팅 메시지 왔다 (50바이트)5. 버프 시간이 줄었다 (6바이트) 이걸 어떻게 보낼까?내가 생각한 방법은 간단했다. 생길 때마다 바로 보내면 되지 않나? send() 5번.Claude한테 물어봤더니 "그게 왜 느린지 아세요?" 하고 되물어..

[Python] 로또 분석 서비스를 만들어봤다 #5 — 로또 공은 과거를 기억하지 않는다

⚠️ 이 글은 통계 분석 교육 목적이며, 로또 당첨을 보장하지 않습니다. 모든 조합의 당첨 확률은 동일하게 1/8,145,060입니다. 시리즈 링크#1 로또 번호를 만들어 볼까?#2 로또 번호를 맞춰 볼까?#3 1,213회 데이터 기본 통계#4 "나올 때 됐다" — 도박사의 오류 증명#5 로또 공은 과거를 기억하지 않는다 ← 지금 읽고 있는 글"적게 나온 번호가 따라잡아야 하지 않나?"#4에서 "나올 때 됐다"가 도박사의 오류라는 걸 증명했다.그러면 이런 질문이 나온다."아니, 큰 수의 법칙에 의하면 횟수가 많아지면 각 번호의 출현 비율이 같아져야 하잖아. 그러면 적게 나온 번호가 결국 따라잡아야 하는 거 아냐?" 이 질문은 진짜 좋은 질문이다. 그리고 대부분의 사람이 큰 수의 법칙을 잘못 이해하고 있다..

프로그래밍/AI 2026.03.22

EP.05 — 다목적 참조 카운팅: shared_ptr 하나면 되는 걸 왜 7개로 나누는가

이 글은 『서버 개발 수기』 시리즈의 다섯 번째 글이다.지난 회에서는 16슬롯 버퍼 풀을 다뤘다.오늘은 버퍼를 빌린 다음 이야기다. 돌려주는 것.※ 이 시리즈에서 다루는 서버 코드는 Project-AO(Ancient Origin)라는 가명으로 부른다. 책을 돌려주지 않는 사람지난 회에서 버퍼 풀을 도서관에 비유했다. 빌리고 반납하는 시스템.근데 빌렸으면 돌려줘야 한다. 안 돌려주면? 반환되지 않은 메모리가 쌓인다. 도서관에 책이 점점 줄어들고, 결국 빌려줄 책이 없어진다. 이걸 메모리 누수(Memory Leak)라고 한다.게임서버는 24시간 돌아간다. 메모리 누수가 생기면 며칠에 걸쳐 천천히 죽는다. 메모리를 조금씩 먹다가 결국 터진다. 그런데 문제가 하나 더 있다. 버퍼만이 아니라 유저 객체도 관리해야..

[Python] 로또 분석 서비스를 만들어봤다 #4 — "나올 때 됐다"를 1,213회 데이터로 검증해봤다

⚠️ 이 글은 통계 분석 교육 목적이며, 로또 당첨을 보장하지 않습니다. 모든 조합의 당첨 확률은 동일하게 1/8,145,060입니다.시리즈 링크#1 로또 번호를 만들어 볼까?#2 로또 번호를 맞춰 볼까?#3 로또 분석 서비스를 만들어봤다#4 "나올 때 됐다"를 검증해봤다 ← 지금 읽고 있는 글이 전략 카드 기억하시죠?🔄 연속 미출현 (Consecutive Absence) "오래 안 나온 번호를 우선합니다" 신뢰도: 70% 서비스를 만들 때 이 전략에 "신뢰도 70%"라고 써놨다. 오늘은 이게 진짜인지 까본다."나올 때 됐다"의 논리로또를 사본 사람이라면 한 번쯤 이렇게 생각해봤을 거다."7번이 10회 연속 안 나왔으니까, 이번엔 나올 때 됐다." 직관적으로 그럴듯하다. 45개 중 하나가 10번이나 빠..

프로그래밍/AI 2026.03.13

EP.04 — 16슬롯 버퍼 풀: 도서관을 16개로 늘린 이유

이 글은 『서버 개발 수기』 시리즈의 네 번째 글이다. 지난 회에서는 3단계 스핀락을 다뤘다. 오늘은 그 스핀락이 지키는 버퍼 풀 이야기다. ※ 이 시리즈에서 다루는 서버 코드는 Project-AO(Ancient Origin)라는 가명으로 부른다. 도서관 이야기지난 회에서 화장실 비유를 했으니까, 오늘은 도서관으로 바꾸어본다.패킷이 들어올 때마다 데이터를 담을 버퍼가 필요하다. 그런데 패킷이 올 때마다 메모리를 새로 할당하면 느리다. 그래서 버퍼를 미리 수천 개 만들어놓고, 빌려주고 반납받는 시스템을 만든다. 이게 버퍼 풀이다.도서관이라고 생각하면 된다. 책이 필요할 때마다 인쇄하는 게 아니라, 도서관에 꽂아두고 빌려가고 반납하는 거다.간단해 보이는데, 문제가 하나 있다.도서관이 1개면스레드 ..

[Python] 로또 분석 서비스를 만들어봤다 — 10가지 전략의 알고리즘을 공개합니다 #3

⚠️ 이 글은 통계 분석 교육 목적이며, 로또 당첨을 보장하지 않습니다. 모든 조합의 당첨 확률은 동일하게 1/8,145,060입니다.시리즈 링크#1 로또 번호를 만들어 볼까?#2 로또 번호를 맞춰 볼까?#3 로또 분석 서비스를 만들어봤다 ← 지금 읽고 있는 글서비스를 만들었다작년에 #1, #2를 쓰고 나서... 멈출 수가 없었다."조합을 줄이는 필터를 더 만들면 되지 않을까?" "머신러닝 돌리면 뭔가 나오지 않을까?" "이걸 서비스로 만들면 사람들이 쓰지 않을까?"그래서 진짜로 만들었다. LottoLabs — 로또 번호 분석 서비스. Python + FastAPI 백엔드, scikit-learn 기반 추천 엔진, 10가지 분석 전략. 머신러닝도 넣고, Claude API 연동 AI 분석도 넣고, 꽤 ..

프로그래밍/AI 2026.03.07

EP.03 — 3단계 적응형 스핀락: 왜 spin하다 yield하다 sleep하는가

이 글은 『서버 개발 수기』 시리즈의 세 번째 글이다.지난 회에서는 서버의 3계층 구조를 살펴봤다.오늘부터 Layer 2 안으로 들어간다. 첫 번째는 락.※ 이 시리즈에서 다루는 서버 코드는 Project-AO(Ancient Origin)라는 가명으로 부른다. 화장실 이야기부터 하자스레드 8개가 돌고 있다. 패킷이 들어올 때마다 버퍼를 하나 빌려야 한다. 버퍼는 공용이다.화장실이라고 생각하면 된다. 스레드 1이 들어가서 문 잠근다. 스레드 2가 와서 문을 당겨본다. 잠겼다. 기다려야 한다.문제는 이 "기다림"을 어떻게 하느냐는 거다.내가 SI에서 쓰던 건 델파이 같은 4GL 도구였다. DB에 직접 붙여서 화면 만들면 끝. 소켓이니 스레드니 하는 세계가 아니었다. 그 후에는 웹을 했는데, 동접 1~2만도 ..

파인튜닝 인생과 참을 수 있을지 없을지 모르는 존재의 가벼움

우리는 태어날 때 하나의 모델로 배포된다. AI를 조금이라도 아는 사람이라면 프리트레인드 모델(pretrained model)이라는 말을 들어봤을 것이다. 방대한 데이터로 기본적인 언어 능력을 학습한 상태, 아직 특정한 용도로 특화되지 않은 상태의 모델. 인간도 마찬가지다. 유전자가 뇌의 기본 아키텍처를 설계하고, 초기 가중치를 설정한다. 어떤 모델은 불안에 민감한 구조로 태어나고, 어떤 모델은 좀 더 둔감한 구조로 태어난다. 하지만 아직은 아무것도 정해지지 않은 상태다. 그리고 인생이 시작된다. 파인튜닝이 시작된다.파인튜닝(fine-tuning)이란 이미 학습된 모델에 새로운 데이터를 넣어 특정 목적에 맞게 조정하는 과정이다. 우리의 삶이 정확히 그렇다. 부모의 말투, 친구의 배신, 첫사랑의 온기, 직..

프로그래밍/AI 2026.03.02

EP.02 — 전체 아키텍처: 3계층 구조와 설계 철학

이 글은 『서버 개발 수기』 시리즈의 두 번째 글이다.지난 회에서는 20년 만에 코드를 다시 열어본 이야기를 했다.오늘은 본격적으로 코드를 들여다보기 전에, 이 서버의 전체 구조부터 살펴본다.※ 이 시리즈에서 다루는 서버 코드는 Project-AO(Ancient Origin)라는 가명으로 부른다.SI 서버와 게임서버는 다르다사실 이것부터 Claude한테 물어봤다. "내가 SI에서 하던 서버랑 게임서버는 뭐가 다른 거야?" SI에서 내가 알던 서버는 단순했다. 사실 단순한지도 몰랐다. 프레임워크가 다 해주니까 스레드가 어떻게 돌아가는지 신경 쓸 일이 없었다. 요청 들어오면 처리하고 응답하면 끝. 그 안에서 스레드가 어떻게 생기고 어떻게 관리되는지는 내 영역이 아니었다.동시 접속 200명? 스레드 200개...

반응형