Ingridea - P0 보안 경계와 로컬 검증 환경 정비하기N

기능 개선보다 먼저 확인한 것 Ingridea의 서비스 흐름과 Flutter·iOS·Firebase 구조를 파악한 뒤에도 바로 기능을 추가하지는 않았다. 이 프로젝트에서 먼저 필요했던 것은 다음 세 가지였다. production을 건드리지 않고 누구나 로컬에서 실행하고 검증할 수 있을 것 클라이언트가 믿어도 되는 것과 서버만 결정해야 하는 것을 나눌 것 OCR·AI 호출이 늘어도 비용이 무한히 커지지 않게 상한을 둘 것 이 기준으로 첫 P0 작업을 진행했다. 이 글에서 설명하는 변경은 private 저장소에 반영한 상태이며 아직 production에는 배포하지 않았다. ...

2026년 8월 25일 · 5 분 · 배준수

Ingridea - 새 Flutter/iOS 프로젝트 알아보기

새 프로젝트 개발에 참여하게 됐다 Ingridea는 친구가 만든 iOS 앱인데, 내가 독서를 하며 마음에 드는 글귀를 저장할 때 사용해온 앱이다. 추가되었으면 하는 기능은 있었지만 바쁜 제작자에게 부담을 주고 싶지 않아 말하지 않았었다. 우연한 기회로 나도 개발자로 참여하게 되어서 이 과정을 블로그를 통해 연재하고자 한다. Flutter와 앱 환경을 새롭게 경험해 보면서 많은 것을 배우고자 한다. 프로젝트 파악하기 새로운 코드베이스에 들어가면 먼저 폴더부터 펼쳐 보게 된다. 하지만 파일이 많을수록 디렉터리만 읽어서는 실제 사용자가 거치는 흐름을 알기 어렵다. 사용 중인 코드와 과거에 작성했지만 지금은 연결되지 않은 코드도 섞여 있기 때문이다. ...

2026년 8월 24일 · 7 분 · 배준수

게임 만들기 - Godot 주식 매매·뉴스 이벤트·해상도 설정 구현하기

오늘 한 것 StockDef에 업종, CEO 이름, CEO 생년월일, 총 발행 주식 수 추가 업종을 enum으로 정의 주식 매수·매도와 지분율 계산 추가 회사 상세 정보 화면(CompanyDetail) 추가 장소 선택 화면에 보유 종목·평단가·평가손익 표 추가 주간 뉴스 이벤트 시스템 추가 (EventDef, 가중치 추첨, 업종별 주가 반영) 8개 업종을 모두 채우도록 종목 6개 추가 해상도 독립성 설정 적용 (스트레치 모드) 창 크기·전체화면 설정 화면과 영구 저장 추가 (DisplaySettings, ConfigFile) 1. 데이터 추가 회사와 주식 데이터를 확장하고, 이를 사용하는 상세 화면·보유 자산 표·뉴스 이벤트를 추가했다. ...

2026년 8월 8일 · 11 분 · 배준수

게임 만들기 - Godot 주가 이력·Scene 분리·선 그래프 구현하기

오늘 한 것 주별 주가 이력을 StockState.price_history에 저장 현재가, 주간 등락액, 주간 등락률을 가격 이력에서 계산 기존 Game 화면에 섞여 있던 도박장, 주식시장, 은행을 장소별 Scene으로 분리 장소 선택 화면에 현재 시간과 보유 현금을 표시 Godot의 Control과 Node2D가 각각 어떤 역할을 맡는지 학습 가격 이력을 화면 좌표로 변환하고 draw_polyline()으로 종목별 선 그래프를 그림 오늘은 앞서 배운 정의 데이터·가변 상태·파생 데이터 분류를 주가 이력에 적용한 뒤, Godot의 Scene 분리와 사용자 정의 UI 그리기라는 새로운 개념으로 확장했다. ...

2026년 8월 3일 · 10 분 · 배준수

게임 만들기 - Godot 시간·턴·주식 데이터 구현하기

오늘 한 것 지난 시간에 배운 정의 데이터 / 가변 상태 / 파생 데이터를 시간과 주식에 적용 게임 시작일을 2000년 1월 1일, 한 턴을 7일로 설정 다음 주 버튼으로 턴을 진행하고 날짜를 갱신 주식의 변하지 않는 정의와 플레이 중 변하는 현재 상태를 분리 삼성전자, SK하이닉스, 현대자동차 3종의 주식 정의 데이터 추가 한 턴이 지날 때마다 각 주가가 직전 가격 기준 ±10% 범위에서 변하도록 구현 새 게임에서는 시간과 주가를 초기화하고, 은행에 다녀오면 현재 상태를 유지 이번 내용은 새로운 데이터 구조를 배우는 시간이 아니라, 지난 시간에 배운 게임 데이터 3분류를 실제 게임 도메인에 적용하는 응용편이다. ...

2026년 8월 2일 · 6 분 · 배준수

게임 만들기 - 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가지 종류 핵심 질문은 “테이블 몇 개?“가 아니라 “이 값은 어느 종류인가?” 다. ...

2026년 7월 29일 · 10 분 · 배준수

게임 만들기 - 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)이 하나 있다고 하자. ...

2026년 7월 23일 · 4 분 · 배준수

게임 만들기 - Godot 기초 배우기

오늘 한 것 Godot 4.7 설치 (Homebrew) 첫 프로젝트 세팅, 씬(.tscn)과 스크립트(.gd) 연결 확인 클릭하면 자산이 오르는 간단한 UI 예제 제작 자산이 랜덤(50/50)으로 오르내리는 슬롯머신으로 발전 씬 전환(은행 페이지) + 전역 상태(Autoload) 도입 상태 메시지(“돈을 벌었다!” / “돈을 잃었다!”) 표시 추가 tutorials/, docs/ 폴더로 프로젝트 구조 정리 1. 스크립트와 씬 씬(Scene): 화면에 나타나는 것. 버튼, 라벨 등을 배치해두는 선언적 파일(.tscn). 스크립트(Script): 동작, 변수, 로직 등 실제 코드(.gd). 2. 노드 vs 변수 변수: 값 하나를 담는 상자. 노드: 객체(라벨, 버튼, 관리자 등). 따라서 자신만의 속성과 함수를 가짐. 씬 정의 파일(.tscn) 내에 정의되어 있음. Autoload: 노드를 전역으로 등록. project.godot 파일에서 등록 가능. 3. Autoload (싱글톤) 씬이 바뀌어도 사라지지 않는 전역 저장소. 실제 정체는 전역 노드. 전역 변수는 전역 노드의 속성으로 관리되는 것. 4. 멀티 씬 씬이 여러 개면 씬끼리 변수를 공유해야 할 수 있음. 전역 노드를 하나 설정하고, 그 노드의 속성들을 전역 변수로 쓰는 방식을 이용 (= GameState.gd를 Autoload로 등록해서 GameState.money를 여러 씬이 공유). 5. 씬 전환 1 get_tree().change_scene_to_file("res://tutorials/scenes/Bank.tscn") get_tree(): 씬 관리자(SceneTree 객체) 반환. 씬 관련 함수는 씬 관리자만 호출할 수 있음 (change_scene_to_file()은 SceneTree의 메서드이므로 get_tree()로 그 객체를 먼저 가져와야 호출 가능). 6. $이름 get_node("이름")의 축약형으로, 이름이 ‘이름’인 노드를 찾아오라는 검색 명령임 (변수 선언이 아님). 나중에 노드 참조가 많아지면 아래처럼 해두면 자동완성/타입 체크가 편함: 1 @onready var status_label: Label = $StatusLabel 프로젝트 구조 1 2 3 4 5 6 7 8 tutorials/ ├── scenes/ │ ├── Main.tscn # 자산 표시, 돈넣기(슬롯머신), 은행가기 버튼 │ └── Bank.tscn # 자산 표시, 대출받기, 돌아가기 버튼 └── scripts/ ├── Main.gd ├── Bank.gd └── GameState.gd # Autoload로 등록된 전역 자산 상태 실습 Godot 에디터 사용법. 아래 파일 시스템에서 Scene을 추가 후 Command + b로 디버거 실행 ...

2026년 7월 16일 · 2 분 · 배준수

Teamsparta Devcamp를 마치며

Devcamp 팀스파르파 부트캠프(정글, 항해, 내일배움캠프) 출신들이 이커머스 쇼핑몰의 핵심 로직을 만들어보는 3주 과정이다. 난 조금 길어져서 10월 2일에 시작해서 10월 27일에 마무리됐다. 팀은 5~6명 정도로 구성되는데 10월의 경우에는 4명의 프론트엔드와 유일한 백엔드인 내가 한 팀이었다. 강의로 혼자 공부, 로그인 및 회원가입 구현, 장바구니 및 결제가 각각 1주일씩 진행된다. 만족할 만한 수준으로 학습이 되지 않거나, 완성도가 떨어지거나 여러 기준으로 충분하지 못하다고 판단되면 다음 단계로 넘어가지 못한다. 백엔드는 NestJS, TypeORM, PostgreSQL, AWS 를 사용한다. 프론트엔드는 Next.js랑 TailwindCSS, Vercel이다. 언어는 Typescript ...

2023년 10월 27일 · 3 분 · 배준수

JWT와 코드 분석

코드는 공개하지 않았습니다! JWT 정의 JSON Web Token의 약자로, 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의한 개방형 표준이다. 상대적으로 크기가 작은 덕분에 URL, POST, 혹은 HTTP 헤더로 빠르게 전송될 수 있다. JWT는 Authorization(권한 허가)에 주로 사용되어, 로그인한 사용자는 이후 Request의 header에 JWT를 포함시켜 보냄으로서 루트, 서비스, 리소스에 대한 접근이 허용된다. 물론 주로 쓰이는 방법일 뿐, JWT가 반드시 Single-Sign-On을 위해 만들어진 기술은 아니다. 등장 배경 기존 authorization은 XML을 기반으로한 SAML(Security Assertion Markup Language) 형식을 이용하였다. 하지만 너무 크고(verbose) 느리다는 단점이 있었다. 따라서 크기가 작아 가볍고 전송이 빠른 JWT를 사용하게 되었다. ...

2023년 10월 12일 · 4 분 · 배준수