코드 관리만 맡으러 갔다가, 그 회사의 CTO가 됐다3년 외주로 멈춰 있던 에듀테크를 다시 세운 기록처음 받은 일은 개발이 아니었다. "우리 코드가 정상인지 봐달라." 받은 코드를 읽고, 수정할 부분을 짚어 요청하고, 버그를 트래킹하는 것. 말하자면 코드 관리였다. 개발 자체는 애초에 내게 맡긴 일이 아니었다.BNZ는 선생님과 학생을 실시간으로 잇는 에듀테크 Hiqsum을 운영하고 있었다. 그 시스템은 3년간 외주로 개발돼 온 상태였다. 나는 그 코드를 관리하는 역할로 합류했다.그런데 들여다보니, 문제는 버그 몇 개가 아니었다.버그가 아니라 구조의 문제였다비기술 대표가 체감하던 증상부터 적는다.동시 접속 50명 수준에서 서비스가 버벅였다. 학원 몇 곳만 동시에 써도 느려졌다. 서버 비용은 규모에 비해 과..
전체 글
Full Stack Developer개요IoT 자산을 모니터링할 때 가장 흔한 방식은 "이 값이 임계값을 넘었나?" 다. 그런데 이 방식엔 두 가지 고질적인 문제가 있다. 첫째, 기기마다 임계값을 일일이 설정하고 유지해야 한다. 둘째, 날씨나 부하처럼 모든 기기에 동시에 영향을 주는 공통 변동이 생기면 — 흐린 날 태양광 발전량이 일제히 떨어지는 것처럼 — 멀쩡한 기기까지 전부 "이상" 으로 오탐한다.BIoTan은 질문을 바꾼다. "이 값이 임계값을 넘었나?" 가 아니라, "이 기기가 지금 또래(peer)와 다르게 행동하나?" 다.GitHub Repository 공개어디서 출발했나 — Biota, 그리고 미생물 군체이름 BIoTan은 biota에서 따왔다. biota는 특정 환경에 사는 생물 군집 전체를 뜻하는 말이다. 처음 이 아이디어를..
개요Flutter 사용을 위해 만들어진 Dart 언어 문법은 JavaScript 문법과 비슷한 듯, 다른 부분이 있다.Dart 과정을 일일이 정리하지는 않겠다. JavaScript 혹은 TypeScript 문법과의 차이를 위주로 정리해보겠다.선언 (Declaration)변수 및 상수JavaScript (TypeScript)let (변수)const (상수)Dartvar — JS의 let에 해당final — 실질적으로 JavaScript const에 해당const — compile time literal 필요const 예시런타임 값은 const에 할당할 수 없다.const now = DateTime.now(); // 에러: 런타임 값const user = await fetchUser(); ..
전화 한 통으로 시작됐다어느 오후 전화를 받았다. 지인 소개로 받은 상담 요청이었다. B사 대표였고, 목소리가 급했다. 회사 서비스가 밤새 다 날아갔다고 했다. 랜섬웨어였다.B사는 헬스장 회원 관리와 커뮤니티를 제공하는 서비스를 운영하고 있었다. 헬스장이 회원 출석을 체크하고, 회원들이 앱 안에서 운동 기록을 공유하고 컨테스트에 참여하는 구조였다. 네이티브 앱 안에서 웹뷰로 띄우는 하이브리드 아키텍처였고, 서버는 PHP 라라벨로 돌아가고 있었다.공유 웹호스팅 서비스를 쓰고 있었는데, 그 호스팅의 취약점을 타고 들어온 랜섬웨어가 이 회사 디렉토리를 통째로 암호화했다. 소스코드, 업로드 파일, 설정. 전부 접근 불가능 상태였다.서비스는 실제 사용 중이었다. 헬스장들이 이 앱으로 회원 관리를 하고 있었고, 회..
W와의 1년 리모트 계약 — 송금 수수료 정산해보니지난 1년간 미국 테크 회사 W와 리모트 계약으로 일했다. 급여는 USD로 받고, 최종적으로 한국 원화가 필요했다. 간단한 구조다. 그런데 1년이 지나 실제로 손에 들어온 돈을 정산해보니, 환율은 올라갔는데도 실 지급액은 예상보다 적은 금액이었다. 원인을 따라가보니 송금 경로마다 알게 모르게 수수료가 빠져나가고 있었다.이 글은 그 1년 동안 송금 경로를 바꾸면서 배운 기록이다. Chase 직송금에서 Wise로 전환한 과정, 실제 비용 차이, 그리고 계약서에 숨어있던 권리 하나를 공유한다. 한국에서 해외 USD 수입이 있는 프리랜서·계약자라면 참고가 될 거다.돈이 새는 지점은 한 곳이 아니다해외에서 USD를 받아 한국 원화로 바꾸는 과정은 단순해 보이지만,..
시킨 일을 벗어나는 세 가지 방식 — 주니어와 함께 일하며 배운 것주니어의 진짜 성장점은 능력이 아니다여러 주니어와 일해봤다. 내가 CTO로 있던 스타트업에서 신입을 뽑기도 했고, Front-Line을 운영하면서 인턴이나 대학 후배를 쓴 적도 있다. 그 과정에서 반복해서 보인 패턴이 하나 있다.주니어가 성장하지 못하는 이유는 능력 부족이 아니었다. 내 기준에서는 오히려 경계 감각의 문제였다. 자기가 해야 할 일의 범위, 자기가 져야 할 책임의 범위, 자기가 가진 권한의 범위. 이 세 경계를 정확히 다루는 감각.주니어는 이 경계를 세 가지 방식으로 잘못 다룬다. 하나씩 본 사례를 풀어본다. 마지막엔 나도 주니어 시절에 어떻게 경계를 잘못 다뤘는지 공유한다.사례 1 — 경계를 바깥으로 확장하려는 주니어한번은..
크레스티드 게코 사진 한 장으로 적정가를 뽑는다 — geckoly-ai 가격 모델 학습기2026-04-221. geckoly는 뭐고, 왜 필요한가geckoly는 크레스티드 게코(Crested Gecko) 사진 한 장과 최소한의 메타데이터만 있으면 모프를 자동으로 분류하고 적정 판매가를 제시하는 VLM(Vision-Language Model) 기반 시스템이다. 크게 세 개의 파이프라인으로 구성된다.모프 분류기 — 사진에서 멀티라벨 모프 태깅가격 예측기 — 사진 + 모프/성별/체중 → 로그 스케일 가격(KRW)베스트샷 추출기 — 여러 장 중 대표 컷 선별이 글의 주인공은 가격 예측기다.morph가 뭐길래크레스티드 게코는 단순히 "도마뱀 한 종"이 아니라 색상·패턴·구조 변이(morph) 의 조합으로 시장 가..
Why Toss Payments?추후 해외 결제를 추가할 예정인데, Stripe 서비스 경우에는 국내 사업자는 지원 하지 않는다. 또한 추가적으로 결제 시스템을 추가하는 과정도 길어질 것 같기 때문에, 애초에 해외 결제도 지원하는 토스 페이먼츠를 선택했다. 카카오페이와 네이버페이, 페이코, 토스페이, 삼성페이 등 여러 결제 수단을 지원한다.연 회비 11만원, 가입비 22만원으로 총 33만원이 필요하며, 진행 과정 중 보증보험에 가입해야하기 때문에, 보증 보험 액수의 특정 부분 만큼 지불해야한다.도입 전 점검 사항Toss Payments 진행 전 알아야할 사항은 1. 이미 결제 시스템을 만들어 놓아야 한다는 점과 2. 단순히 코드 수준 뿐이 아니라 서비스 자체가 운영 준비가 됐는지, 어떤 상품을 파는지를 ..