대표 프로젝트
전체 보기 →웹훅 시스템 설계·운영 기록
외부 커머스 플랫폼 웹훅 처리 시스템의 대표 사례와 날짜별 원본 기록
SCP 데이터 파이프라인: 분류에서 KPI 판정까지
진행 중인 이벤트·KPI 데이터 파이프라인의 설계와 현재 한계
gRPC v2: 타입 경계와 하위 호환성을 함께 개선하기
동적 payload, 조회 범위, 직렬화 비용을 점검하고 v1과 병행한 gRPC 개선 기록
최근 글
전체 보기 →15장 파일 시스템N
15-1 파일과 디렉터리 파일 파일(file): 하드 디스크나 SSD와 같은 보조기억장치에 저장된 관련 정보의 집합 이름 파일을 실행하기 위한 정보 파일 관련 부가 정보: 속성(attribute), 메타데이터(metadata) 파일 속성과 유형 유형: 운영체제가 인식하는 파일 종류 확장자(extension): 파일 종류를 표시하는 가장 흔한 방식 파일 연산을 위한 시스템 호출 파일을 다루는 모든 작업은 운영체제에 의해 이뤄짐 모든 응용 프로그램은 시스템콜을 통해 파일 연산 디렉터리 디렉터리(directory) 윈도우에선 폴더(folder) 1단계 디렉터리(single-level directory) 트리 구조 디렉터리(tree-structured directory) 루트 디렉터리(root directory): 최상위 디렉터리 경로(path): 디렉터리를 이용해 파일 위치, 파일 이름을 특정 짓는 정보 절대 경로와 상대 경로 절대 경로(absolute path): 루트 디렉터리에서 자기 자신까지 이르는 고유한 경로 상대 경로(relative path): 현재 디렉터리부터 자기 자신까지 이르는 경로 guest/data/image.png: 현재 디렉터리 내에 있는 guest 폴더 내의 data 폴더 내에 있음 ./guest/data/image.png: 동일함 디렉터리 연산을 위한 시스템 호출 파일 연산과 마찬가지로 디렉터리 연산도 시스템콜을 통해 운영체제가 처리 디렉터리 엔트리 디렉터리도 포함된 정보가 조금 다른 파일일 뿐임 디렉터리는 보조기억장치 내부에 해당 디렉터리에 담겨 있는 대상과 관련된 테이블 형태로 저장 파일 이름, 위치 유추 정보, 생성 시간, 크기 등 15-2 파일 시스템 파일 시스템: 파일과 디렉터리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램 ...
Ingridea - P0 보안 경계와 로컬 검증 환경 정비하기N
기능 개선보다 먼저 확인한 것 Ingridea의 서비스 흐름과 Flutter·iOS·Firebase 구조를 파악한 뒤에도 바로 기능을 추가하지는 않았다. 이 프로젝트에서 먼저 필요했던 것은 다음 세 가지였다. production을 건드리지 않고 누구나 로컬에서 실행하고 검증할 수 있을 것 클라이언트가 믿어도 되는 것과 서버만 결정해야 하는 것을 나눌 것 OCR·AI 호출이 늘어도 비용이 무한히 커지지 않게 상한을 둘 것 이 기준으로 첫 P0 작업을 진행했다. 이 글에서 설명하는 변경은 private 저장소에 반영한 상태이며 아직 production에는 배포하지 않았다. ...
Ingridea - 새 Flutter/iOS 프로젝트 알아보기
새 프로젝트 개발에 참여하게 됐다 Ingridea는 친구가 만든 iOS 앱인데, 내가 독서를 하며 마음에 드는 글귀를 저장할 때 사용해온 앱이다. 추가되었으면 하는 기능은 있었지만 바쁜 제작자에게 부담을 주고 싶지 않아 말하지 않았었다. 우연한 기회로 나도 개발자로 참여하게 되어서 이 과정을 블로그를 통해 연재하고자 한다. Flutter와 앱 환경을 새롭게 경험해 보면서 많은 것을 배우고자 한다. 프로젝트 파악하기 새로운 코드베이스에 들어가면 먼저 폴더부터 펼쳐 보게 된다. 하지만 파일이 많을수록 디렉터리만 읽어서는 실제 사용자가 거치는 흐름을 알기 어렵다. 사용 중인 코드와 과거에 작성했지만 지금은 연결되지 않은 코드도 섞여 있기 때문이다. ...
게임 만들기 - Godot 주식 매매·뉴스 이벤트·해상도 설정 구현하기
오늘 한 것 StockDef에 업종, CEO 이름, CEO 생년월일, 총 발행 주식 수 추가 업종을 enum으로 정의 주식 매수·매도와 지분율 계산 추가 회사 상세 정보 화면(CompanyDetail) 추가 장소 선택 화면에 보유 종목·평단가·평가손익 표 추가 주간 뉴스 이벤트 시스템 추가 (EventDef, 가중치 추첨, 업종별 주가 반영) 8개 업종을 모두 채우도록 종목 6개 추가 해상도 독립성 설정 적용 (스트레치 모드) 창 크기·전체화면 설정 화면과 영구 저장 추가 (DisplaySettings, ConfigFile) 1. 데이터 추가 회사와 주식 데이터를 확장하고, 이를 사용하는 상세 화면·보유 자산 표·뉴스 이벤트를 추가했다. ...
14장 가상 메모리
14-1 연속 메모리 할당 연속 메모리 할당: 프로세스들을 메모리에 배치할 때 연속적으로 이어서 배치하는 것 스와핑 스와핑(swapping): 메모리에 적재된 프로세스들 중 현재 실행되지 않는 프로세스들을 임시로 보조기억장치 스왑 영역으로 보내는 것 스왑 영역(swap space): 메모리에서 쫓겨나온 프로세스들이 보조기억장치에서 존재하는 곳 스왑 아웃(swap-out): 메모리 → 스왑 영역 스왑 인(swap-in): 스왑 영역 → 메모리 메모리 할당 메모리 내 빈 공간이 여러 개일 경우 프로세스를 배치하는 방식 최초 적합 최초 적합(first fit): 운영체제가 메모리 내 빈 공간을 검색하다가 발견하면 곧바로 저장 최소한의 검색으로 빠르게 할당 최적 적합 최적 적합(best fit): 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간 장점: 공간의 효율적 사용 단점: 남는 공간이 다른 프로세스가 사용하기 힘든 아주 작은 공간이라 외부 단편화가 발생하게 됨 최악 적합 최악 적합(worst fit): 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간 장점: 가장 큰 빈 공간을 골라 프로세스를 배치하기 때문에, 할당하고 남은 공간도 꽤 커서 다음에 들어올 다른 프로세스가 이 남은 공간을 다시 활용할 확률이 비교적 높음 외부 단편화 외부 단편화(external fragmentation): 메모리의 빈 공간에 프로세스가 할당되면서 생기는 메모리 사이 사이에 빈 공간 빈 공간의 총합은 크지만, 사이사이에 작게 쪼개져있어 더 이상 프로세스를 적재하기 어려워진 상황 압축(compaction) 흩어져있는 빈 공간들을 재배치를 통해 하나의 큰 공간으로 만드는 작업 재배치로 인해 작업의 중지, 무엇을 어디로 옮길지에 대한 판단으로 인한 어려움 14-2 페이징을 통한 가상 메모리 가상 메모리(virtual memory) ...
게임 만들기 - Godot 주가 이력·Scene 분리·선 그래프 구현하기
오늘 한 것 주별 주가 이력을 StockState.price_history에 저장 현재가, 주간 등락액, 주간 등락률을 가격 이력에서 계산 기존 Game 화면에 섞여 있던 도박장, 주식시장, 은행을 장소별 Scene으로 분리 장소 선택 화면에 현재 시간과 보유 현금을 표시 Godot의 Control과 Node2D가 각각 어떤 역할을 맡는지 학습 가격 이력을 화면 좌표로 변환하고 draw_polyline()으로 종목별 선 그래프를 그림 오늘은 앞서 배운 정의 데이터·가변 상태·파생 데이터 분류를 주가 이력에 적용한 뒤, Godot의 Scene 분리와 사용자 정의 UI 그리기라는 새로운 개념으로 확장했다. ...
게임 만들기 - Godot 시간·턴·주식 데이터 구현하기
오늘 한 것 지난 시간에 배운 정의 데이터 / 가변 상태 / 파생 데이터를 시간과 주식에 적용 게임 시작일을 2000년 1월 1일, 한 턴을 7일로 설정 다음 주 버튼으로 턴을 진행하고 날짜를 갱신 주식의 변하지 않는 정의와 플레이 중 변하는 현재 상태를 분리 삼성전자, SK하이닉스, 현대자동차 3종의 주식 정의 데이터 추가 한 턴이 지날 때마다 각 주가가 직전 가격 기준 ±10% 범위에서 변하도록 구현 새 게임에서는 시간과 주가를 초기화하고, 은행에 다녀오면 현재 상태를 유지 이번 내용은 새로운 데이터 구조를 배우는 시간이 아니라, 지난 시간에 배운 게임 데이터 3분류를 실제 게임 도메인에 적용하는 응용편이다. ...
게임 만들기 - Godot 데이터 설계 배우기
오늘 한 것 게임 데이터의 3분류 학습: 정의 데이터 / 가변 상태 / 파생 데이터 Resource 개념 학습 (직렬화 가능한 데이터 객체, .tres 파일) 데이터 주도 설계(data-driven design) 개념 학습 슬롯머신을 베팅 기계 3대로 확장: MachineDef 리소스 + .tres 3개 버튼을 씬에 그리지 않고 데이터 개수만큼 코드로 생성 → .tres 추가만으로 기계가 늘어남 1. 웹 백엔드와의 근본적 차이 웹 백엔드 게임 SSOT DB 메모리 프로세스 요청마다 생성·소멸 (stateless) 시작~종료까지 계속 살아있음 영속화 매 요청마다 자동 명시적으로 저장할 때만 스키마 마이그레이션으로 강제 없음. 내가 지키는 규약이 전부 조회 SELECT ... WHERE 배열/딕셔너리 직접 순회 관계 FK, JOIN 객체 참조 또는 id 문자열 모든 데이터가 메모리에 객체로 떠 있다. 그래서 DB도 커밋도 없이 Wallet.balance += 100 한 줄로 상태가 바뀐다. 세이브 파일은 그 메모리를 어느 시점에 찍어둔 스냅샷(snapshot) 일 뿐이다. 스키마를 강제해주는 장치가 없으므로, 데이터를 어떻게 분류할지 스스로 정해야 한다. 2. 게임 데이터의 3가지 종류 핵심 질문은 “테이블 몇 개?“가 아니라 “이 값은 어느 종류인가?” 다. ...
블로그 개선 소식 (v1.2.0)
안녕하세요, 배준수입니다. 이번엔 글과 글 사이의 연결을 손봤습니다. v1.2.0에서 바뀐 점입니다. 새로 생긴 것 시리즈 목차 박스: 시리즈에 속한 글 하단에 “📚 시리즈 (n/N편)” 박스가 생겼습니다. 펼치면 시리즈 전체 목록이 나오고, 지금 읽는 글이 표시됩니다. 주간회고처럼 글이 아주 많은 시리즈는 현재 글 주변만 보여주고 전체 목록 링크로 연결합니다. 시리즈 이전/다음 편: 글 하단의 이전/다음 버튼이 이제 같은 시리즈 안에서 움직입니다. 시리즈 글을 순서대로 읽기 편해졌어요. 관련 글 추천: 글 하단에 태그·카테고리가 비슷한 다른 글 4개를 추천합니다. 안 보이지만 개선한 것 커버 이미지가 없는 글을 공유할 때도 미리보기 이미지가 나오도록 기본 이미지를 지정했습니다. 검색엔진에 전달하는 구조화 데이터의 발행 주체를 개인 블로그에 맞게 정리했습니다. 읽어주셔서 감사합니다. 🙌
게임 만들기 - Godot 시그널 배우기
오늘 한 것 시그널 개념 학습 (발행/구독, 관찰자 패턴) 타이틀 씬 추가: 게임 시작 / 게임 종료 버튼, 시작 씬을 Title로 변경 기존 Main 씬 → Game 씬으로 이름 변경 GameState에 커스텀 시그널 2개 추가 (money_changed, went_bankrupt) 돈 변화 반응 구현: 라벨 색상 변화, 연승/연패 표시, 파산 게임오버 make editor / make run 명령어(Makefile) 추가 1. 시그널이란 “어떤 일이 일어났을 때, 구독하고 있는 쪽에 알려주는 방송” (관찰자 패턴). 백엔드 비유: Django의 post_save 시그널, SNS의 발행/구독 구조와 개념이 같음. 발행자는 구독자가 누군지/몇 명인지 모름. 구독자 0명이어도 발행은 성립. 목적: 결합도 낮추기. 버튼은 “나 눌렸어!“만 외치고, 누가 듣는지 모름 → 버튼이 재사용 가능한 독립 부품이 됨. 2. 동작은 동기적 직접 호출 게임 전체는 하나의 프로세스다. emit()은 connect된 함수 리스트를 그 자리에서 순서대로 즉시 실행하는 메서드 전부 끝나야 다음 줄로 넘어감. “던져놓고 각자 처리"가 아니라 “즉시 전화 돌리기”. 시그널: 호출할 함수들의 리스트 예) 화면에 “동전 줍기” 버튼(CoinButton)이 하나 있다고 하자. ...