INSANE-P

Park
Chanbin

Frontend Developer - 박찬빈

About

안녕하세요, 프론트엔드 개발자 박찬빈입니다.

위치 기반 게임과 교내 서비스들을 팀으로 만들고 운영해왔습니다. 좋은 서비스는 팀에서 나온다는 생각으로, 더 나은 방법이 보이면 먼저 제안하며 개발하려 노력하고 있습니다.

“ 혼자 완결되는 기능은 거의 없다.”

“ 그래서 함께 만드는 과정이 곧 개발이다.”

함께 만드는 개발

경찰과 도둑은 개발자와 디자이너, 마케터가 함께하는 팀이라, 기능 하나나 문구의 말투까지 우리 서비스에 맞는지 매주 회의에서 함께 이야기하며 만들어 갑니다. 회의에서 정한 것과 작업 기록은 AI가 정리하는 팀 지식 저장소에 쌓아, 다음 작업 전에 이전 결정을 바로 찾아 맞춥니다.

먼저 제안하는 습관

경찰과 도둑에서는 서비스 이름이 검색에 밀리는 것을 보고 팀 블로그를 제안해 직접 만들었고, 일본 스토어에서 페이지를 여는 비율이 한국의 3분의 1이라는 것을 짚어 공지와 닉네임의 국제화를 제안했습니다.

현장까지 뛰는 개발

광진구 청춘대로 축제를 보고 구청에 먼저 연락해, 세종대와 건국대의 경찰과 도둑 대항전을 구청과 함께 기획하고 축제 공식 프로그램으로 운영했습니다. 두 학교 대항전인데 건국대 신청이 세종대보다 적어서, QR을 붙인 박스 옷을 만들어 입고 포스터를 들고 건국대 앞에서 직접 홍보했습니다. 같은 날 열린 서울대학생연합페스티벌에서는 부스와 미니운동회 경찰과 도둑 프로그램을 팀과 함께 기획했고, 미니운동회에는 50명이 참가했습니다. 두 행사를 치른 날 앱 가입자가 81명 늘었습니다.

세종대학교 컴퓨터공학과chanbin0626@gmail.comgithub.com/INSANE-P

Projects

01

경찰과 도둑

Cops and Robbers- 출시 · 운영 중

2025.10 ~

프론트엔드 (앱 · 웹)

위치 기반 실시간 멀티플레이어 모바일 게임

AWARD -2026 세종 창업 아이디어리그 대상 (SW중심대학사업단 주최)

오프라인 술래잡기 '경찰과 도둑'을 위치 공유와 실시간 동기화로 옮긴 모바일 게임입니다. 프론트엔드의 실시간 통신과 게임 내부 이벤트를 담당해, STOMP 기반 WebSocket으로 로비와 게임의 실시간 채팅과 게임 시스템을 연결했습니다. v3에서는 이 기반을 함께 뛸 사람을 모으는 커뮤니티로 넓혔습니다.

끊겼다 다시 연결된 뒤의 게임 상태

야외에서 뛰며 하는 게임이라, 화면을 끄거나 앱을 전환하면 iOS가 WebSocket 연결을 끊어 그사이 체포나 탈옥 이벤트를 놓치는 문제가 있었습니다. 연결이 끊기면 재연결 화면을 띄우고 자동 재연결 중에도 직접 다시 연결할 수 있게 했지만, 다시 연결된 뒤에도 끊긴 사이의 변화는 반영되지 않았습니다. 그래서 재연결 직후 서버에서 참가자 상태와 도둑의 마지막 위치를 다시 받아 화면을 맞추고, 그 사이에 들어온 실시간 이벤트는 덮어쓰지 않도록 했습니다. 자동 재연결이 모두 실패해 끊긴 채 남는 경우에는, 앱을 켜 둔 상태에서 푸시 알림이 도착하면 네트워크가 살아 있다고 보고 연결을 다시 시도하게 했습니다. 백그라운드에서 연결을 유지하는 작업은 팀원이, 끊긴 뒤의 복구는 제가 맡았습니다.

앱 심사 없이 갱신되는 웹 정본 문서

이용약관 같은 법적 문서 4종이 앱과 웹에 한 벌씩 있어서, 고칠 때마다 사람이 양쪽을 맞춰야 했습니다. 한국어와 일본어, 영어까지 지원하면 관리할 문서는 12벌이 됩니다. 그래서 웹을 단일 정본으로 정하고 앱은 웹뷰로 열도록 바꿨습니다. 문서를 고쳐도 앱 심사를 다시 받지 않아도 되게 만들었습니다. 앱용 화면은 사이트 레이아웃을 타지 않는 Route Handler로 분리해 HTML을 111KB에서 27KB로 줄이고 JS를 0개로 만들었습니다. 웹 분석 스크립트도 빼서 앱 웹뷰 트래픽이 웹 통계에 섞이지 않도록 했습니다. 폰트는 문서에 쓰인 글자만 남겨 760KB를 52KB로 줄이고, 파일명에 내용 해시를 넣어 영구 캐싱했습니다. 팀원 크레딧 화면도 같은 패턴으로 옮겨, 인원이 바뀌어도 웹 배포만으로 앱에 반영되도록 구현했습니다.

설치 없이 체험하는 웹 데모

밖에서 뛰는 게임이라 스크린샷으로는 재미가 전달되지 않고, 직접 해보려면 설치부터 해야 했습니다. 그래서 설치 전에 브라우저에서 바로 체험할 수 있는 데모를 소개 웹사이트에 만들었습니다. 앱 화면을 실측값 그대로 재현한 폰 프레임 안에서, 방 참여부터 QR 체포까지 4개 코스를 끝까지 해볼 수 있습니다. 화면과 말풍선 안내, 진행 단계는 하나의 장면 데이터에서 나옵니다. 셋이 어긋나지 않고, 코스를 늘릴 때도 데이터만 추가하면 되도록 만들었습니다. 사이트의 테마 전환(라이트=경찰, 다크=도둑)은 데모의 진영 선택으로 이어집니다. iOS 사파리에는 요소 전체 화면 API가 없어서, 모바일 전체 화면은 CSS 오버레이로 구현했습니다.

카톡에서 열리지 않던 초대 링크

'카톡에서 초대 링크를 누르면 앱이 안 열린다'는 제보를 받고 직접 재현해 보니, 설치 직후 처음 앱을 열 때만 실패했습니다. 웹과 앱을 나눠 확인하며 두 곳을 고쳤습니다. 웹에서는 인앱 브라우저를 빠져나가 설치된 앱을 바로 열고, 앱이 없을 때만 스토어로 안내하게 했습니다. 앱은 첫 실행이 늦어지면 들어온 링크를 놓치고 있어서, 늦더라도 목적지를 기억해 두었다가 열리도록 바꿨습니다.

검색되지 않는 이름 - 노션으로 쓰고 동기화로 읽는 팀 블로그

'경찰과 도둑'은 누구나 아는 놀이 이름이라 검색 결과에서 서비스가 밀린다고 판단해, 검색 유입을 만들 팀 블로그를 제안하고 개발했습니다. 처음에는 마크다운으로 글을 쓰는 에디터를 직접 만들어 팀에 보여줬는데, 따로 만든 페이지의 처음 보는 화면에서 글을 쓰기 어렵다는 이야기가 나왔습니다. 글을 쓰는 사람이 개발자, 마케터, 디자이너로 다양했고 모두에게 익숙한 도구는 노션이었기에, 평소 쓰던 방식으로 써야 글이 꾸준히 쌓인다고 보고 노션을 CMS로 바꿨습니다. 노션으로 옮긴 직후에는 화면을 열 때마다 노션을 직접 읽었습니다. 노션 이미지 주소는 약 1시간 뒤 만료되어 요청마다 새 주소를 받아 원본을 내려받고 변환해야 했고, 캐시가 있으면 0.1초도 걸리지 않던 이미지가 캐시가 비어 있으면 2초 넘게 걸리기도 했습니다. 방문자가 적어 캐시는 자주 비었습니다. 그래서 발행할 때 한 번만 노션을 읽어 본문은 Supabase에, 이미지는 R2에 옮기고, 화면은 저희 저장소만 읽으면서 ISR로 캐시하도록 바꿨습니다. 이미 팀이 쓰던 사이트라 기존 화면을 유지한 채 동기화를 붙이고, 데이터가 쌓이는 것을 확인한 뒤 화면을 옮겼습니다. 발행은 개발 도구를 몰라도 누를 수 있게 어드민 버튼으로 만들고, 6시간마다 도는 자동 동기화로 보완했습니다.

서울게임타운 부스 - 세계관을 체험하는 오프라인 빌드

인디게임 전시회 서울게임타운에 부스 참가를 직접 신청해 성사시키고, 현장에서 유저들의 경험을 직접 들었습니다. 위치 기반 오프라인 게임이라는 특성에 맞춰 행사용 이벤트 게임 로직과 미니게임을 새로 만들고, 웹캠 촬영부터 Canvas 프레임 합성, Vercel Blob 업로드, QR 발급까지 전부 브라우저에서 처리되는 포토부스를 구현했습니다. Upstash Redis 정렬 집합 기반 리더보드로 닉네임별 최고 점수를 관리해, 방문자가 서비스 세계관을 간접 체험할 수 있게 부스를 구성했습니다. 하루 동안 300명이 다녀갔고, 가입자가 60명 늘었습니다.

일본으로 넓히며, 지표에서 막힌 곳 찾기

출시 이후에는 어드민 페이지를 만들고 GA4와 스토어 지표로 운영과 성장을 지켜봤습니다. 일본어 블로그는 한국어 글을 번역해 올리지 않고, 노션에 언어 속성을 두어 목록을 나눈 뒤 각 언어로 글을 따로 썼습니다. 일본어 스토어 페이지를 연 5월부터 3개월 동안 일본 App Store 노출은 2,520회로 한국(2,483회)과 비슷해졌지만, 노출된 사람 중 페이지를 연 비율은 일본 5.6%, 한국 15.6%로 3분의 1 수준이었습니다. 같은 시기 앱 안에서는 공지사항과 자동으로 만들어지는 닉네임이 일본 사용자에게도 한국어로 나오고 있었습니다. 이 지표와 조사를 팀 발표로 정리해 두 곳의 국제화부터 제안했고, 공지 다국어는 설계와 백엔드 구현에 직접 참여했습니다.

서비스마다 흩어져 있던 운영 지표

행사를 열거나 앱을 업데이트한 뒤 사용자가 실제로 늘었는지 보려면 인스타그램, GA4, App Store Connect, Google Play, 게임 서버를 하나씩 열어 봐야 했고, 서비스마다 필요한 권한도 달랐습니다. 9월 말 사업계획서에 넣을 지표를 서비스마다 내려받아 손으로 맞춰 보고 나서야, 서울게임타운에서 가입한 사람들이 이후 4주 동안 연 게임이 4판뿐이었다는 것을 알았습니다. 이런 확인을 행사 때마다 손으로 반복할 수는 없다고 판단해, 매일 아침 지표를 한 번 모아 저희 데이터베이스에 쌓고 어드민 지표 화면은 그 기록을 읽는 구조로 만들었습니다. 화면을 열 때마다 각 서비스에서 바로 가져오지 않은 것은 App Store와 인스타그램은 일정 기간이 지나면 지난 데이터를 다시 받을 수 없고, 서비스마다 며칠에 걸쳐 값이 확정되며, Google Play는 설치 통계를 API로 제공하지 않았기 때문입니다. 가입이 하루 몇 명인 규모에서는 행사 효과를 나중에 통계로 추정하기 어려워서, QR과 링크에 붙인 꼬리표(UTM)가 스토어까지 이어지게 해 어느 경로로 들어왔는지 처음부터 나눠 볼 수 있게 했습니다. 기간 비교도 처음에는 바로 앞의 같은 길이 기간과만 했는데, 예를 들어 행사가 있던 5일을 그 앞 5일과 비교하면 두 기간에 낀 주말 수가 달라질 수 있어 주말에 몰리는 지표를 공정하게 비교하기 어려웠습니다. 그래서 이전 기간, 요일을 맞춘 기간, 직접 고른 기간 중에서 비교 대상을 고를 수 있게 하고, 지금 어떤 날짜끼리 비교하는지 화면에 항상 표시했습니다. 매주 월요일 아침에는 주요 지표가 팀 디스코드로 전달됩니다.

이름과 다른 것을 세고 있던 지표들

지표를 한곳에 모으고 보니, 이름만 보고는 무엇을 세는지 알 수 없는 지표가 많았습니다. 스토어에서 앱을 본 사람 수만 해도 App Store의 '노출'은 이미 앱을 설치한 사람까지 세고, Google Play의 '방문자'는 앱이 없는 사람만 셉니다. 둘을 더하면 어느 쪽 의미도 아닌 값이 되어 두 스토어는 나란히 보여 주고, 방문에서 설치까지의 단계별 비율도 단계마다 세는 대상이 달라 계산하지 않았습니다. 사이트의 '다운로드 버튼 클릭'도 99번 중 79번은 버튼을 누른 것이 아니라, 행사 QR이나 링크트리 링크로 들어와 자동으로 스토어로 넘어간 방문이었습니다. 이 방문을 빼고 계산하자 사이트 방문 중 스토어로 넘어간 비율인 사이트 전환율은 19.6%가 아니라 3.8%로, 실제보다 다섯 배 넘게 높게 보고 있었습니다. 지표 이름도 실제로 일어난 일에 맞춰 '스토어로 이동'으로 바꿨습니다. 앱의 게임 시작 기록도 4주에 311번이었지만 같은 기간 방 생성은 79번이어서, 앱 코드를 따라가 보니 한 판에 참가자 수만큼 기록이 남고 있었습니다. 그래서 판 수는 이 기록이 아니라 백엔드의 게임 기록에서 따로 세도록 바꿨습니다.

인스타그램과 GA4, 두 스토어, AdMob의 지표를 매일 아침 모아 한 저장소에 쌓고 지표 화면과 월요일 리포트로 보내며, 게임 기록은 화면을 열 때 직접 읽는 구조도
지표 수집 구조

Flutter / Dart / STOMP over WebSocket / Riverpod / Next.js / Notion API / Supabase / Cloudflare R2 / Vercel Blob / Upstash Redis / GitHub Actions / GA4

경찰과 도둑 키비주얼
경찰과 도둑 앱 홈 - 게임 생성·참여와 커뮤니티, 캠퍼스 대항전 배너
경찰과 도둑 웹 데모 - 설치 없이 브라우저에서 앱 화면 그대로 체험

02

올클

ALLCLL- 운영 중

2025.12 ~

프론트엔드

세종대학교 수강신청 도우미

최근 3개월 동안 1만 6천 명이 넘게 이용한 서비스입니다. 2023년부터 운영되어 온 코드베이스에 중간 합류해, FSD(Feature-Sliced Design) 구조와 팀 컨벤션을 파악한 뒤 기존 스타일에 맞춰 일관되게 기여하는 데 집중했습니다.

졸업 요건 검사 기능 이전 · 주도 개발

'Please Graduate'가 운영을 종료하면서, 원 개발자의 요청으로 그 기능을 올클로 이전하는 작업을 맡았고 이후 졸업 요건 기능 전반을 주도해 개발했습니다. 원 서비스가 지원하지 않던 22학번 이후 규정도 새로 구현했습니다. 학번마다 달라지는 균형교양 영역 정책, 전공 인증, 영어와 코딩 대체 과목, 복수전공과 전과 등 복잡한 기준을 대시보드와 검사 플로우, 이수/미이수 모달로 풀어냈습니다.

관리자 페이지로 옮긴 수강신청 기간 관리

올클의 실시간 여석 화면은 수강신청 시간에는 과목별 여석을 실시간으로 보여 주고, 신청이 닫힌 동안에는 직전 신청이 끝났을 때의 여석을 보여 줍니다. 이 전환이 정해진 기간에 맞춰 일어나야 하는데, 기간이 코드에 날짜로 적혀 있어서 학기마다 개발자가 코드를 고쳐 다시 배포해야 했습니다. 그래서 운영자가 관리자 페이지에서 기간을 입력하면, 그 기간에 맞춰 화면이 자동으로 바뀌도록 했습니다. 처음에는 설정 하나로 서비스 전체의 여석을 한꺼번에 켜고 끄는 방식을 생각했지만, 관심과목 화면은 기간과 상관없이 여석을 보여 주지 않아야 했습니다. 그래서 관심과목 화면은 여석을 항상 숨기고, 실시간 여석 화면만 입력된 기간을 따르도록 화면별로 기준을 나눴습니다.

비밀번호가 맞는데도 로그인하지 못하던 사람들

올클 로그인은 실패 원인과 상관없이 "학번 또는 비밀번호가 올바르지 않습니다" 한 문구만 보여 줬습니다. 백엔드 담당이 분석한 전학년 수강신청일 로그를 보니 로그인에 실패한 51명이 1인당 평균 5.6번 다시 시도했고, 그중 28명은 비밀번호가 아니라 개인정보 동의를 마치지 않아 막힌 경우였습니다. 비밀번호가 맞는데도 같은 문구를 보며 계속 다시 입력하고 있었던 것입니다. 백엔드가 원인별 오류 코드를 내려 주도록 바뀐 뒤, 프론트에서 비밀번호 오류, 개인정보 동의 미완료, 계정 상태를 나눠 각자 다음에 할 일을 안내하도록 바꿨습니다.

React / TypeScript / Zustand / TanStack Query / MSW / Storybook

올클 홈 - 수강신청 연습, 실시간 여석, 졸업요건 검사
졸업 요건 분석 대시보드

03

gitmoru

gitmoru- npm 배포 · 운영 중

2026.08 ~

기획 · 개발 (개인)

저장소가 침해됐을 때 무엇이 바뀌었는지 확인하는 도구

계정 하나가 탈취되어 조직 전체 브랜치가 덮어씌워지는 일을 겪고 만든 도구입니다. 저장소를 내려받지 않고 GitHub API만으로 어느 브랜치의 무슨 파일이 언제 바뀌었는지 확인하고, 공격 직전 커밋이 남아 있는지 확인해 되돌릴 수 있게 돕습니다. 데스크톱 앱으로 만들면서 Electron을 처음 다뤘습니다.

판정하지 않는 도구로 설계한 이유

직접 겪을 때 파일 이름으로 악성 코드를 찾다가, 다른 이름에 붙은 같은 페이로드를 놓치고 화면의 '0건'을 보며 안심했던 적이 있습니다. 탐지 규칙은 이미 겪어본 공격에서 나오기 때문에, 규칙이 판정을 내리면 규칙이 못 잡은 공격이 '이상 없음'으로 표시됩니다. 그래서 이 도구는 감염 여부를 단정하지 않고 '이 시간대에 이 파일들이 이렇게 바뀌었다'만 보여주고, 신호가 0건일 때도 바뀐 파일을 직접 확인하도록 안내합니다.

악성 코드를 다루는 도구의 안전 규칙

폴더를 편집기로 여는 순간 실행되는 페이로드가 있어서 git clone을 막았고, 대상 코드는 린트와 빌드, 설치까지 전부 실행하지 않도록 했습니다. 화면에 CSP를 걸어 페이로드에 적힌 주소로 요청을 보내는 것 자체를 불가능하게 만들었고, 토큰은 GitHub CLI에서 빌려 쓰되 렌더러로는 내려보내지 않게 했습니다. 이런 제약들을 SAFETY.md에 근거와 함께 정리해, 편해 보이는 구현이 왜 막혀 있는지 나중에도 알 수 있게 남겼습니다.

왜 데스크톱 앱이고, 왜 npm인가

사고가 난 순간에 켜는 도구라, 터미널을 열고 명령을 치고 포트를 확인하는 절차가 있으면 결국 쓰이지 않는다고 봤습니다. 그래서 아이콘을 누르면 바로 창이 뜨는 Electron 앱으로 만들었습니다. 격리 측면에서도 유리했습니다. 브라우저 탭은 확장 프로그램과 세션을 다른 탭과 공유하고 포트가 열려 있지만, Electron 창은 열린 포트가 없고 화면은 샌드박스에서 돌아 Node에 접근하지 못합니다. GitHub 호출은 IPC로 메인 프로세스에 넘겨 토큰이 화면까지 내려오지 않게 했습니다. 반면 AI를 붙이는 MCP 서버는 npm에 올렸습니다. 처음에는 클론한 경로를 사람이 직접 채워야 해서 대부분 그 단계에서 멈췄고, MCP 디렉터리에도 설치할 수 없는 서버로 표시됐기 때문입니다. 다만 이는 서명 없는 실행 파일을 배포하지 않는다는 원칙과 부딪히는 선택이라, 소스가 공개되고 알려진 레지스트리를 거친다는 점이 다르다고 판단해 감수했습니다. 100MB가 넘는 Electron 앱 자체는 npm에 올리지 않았고, 되돌리기도 명령으로 열지 않았습니다. force push는 되돌릴 수 없어 사람이 화면을 보고 실행해야 한다고 봤습니다.

판단은 AI에게 넘기되, 쓰기 권한은 주지 않기

바뀐 파일이 무슨 코드인지 읽는 일은 MCP 서버로 AI에게 넘겼습니다. 다만 에이전트가 읽는 것은 공격자가 쓴 텍스트라 지시문이 섞여 있을 수 있어서, MCP 도구는 읽기 전용으로만 열었습니다. 사람이 봐야 할 것과 AI에게 맡길 것, 그리고 어느 쪽에도 주면 안 되는 권한을 나누는 것이 설계의 핵심이었습니다.

Electron / React / TypeScript / Vite / Vitest / MCP SDK

gitmoru - 저장소와 기간을 정해 바뀐 파일을 훑는 화면
바뀐 파일의 변경 내용을 나란히 비교하는 화면

04

Footure

Transfer Performance Prediction

2026.03 ~

프론트엔드 · AI 추론 서버

축구 선수 이적 퍼포먼스·시장가치 예측 서비스

AWARD -2026 세종대학교 전공심화학습공동체 장려상 (교수학습개발센터 주최)

축구 선수의 이적 후 퍼포먼스와 시장 가치를 예측하고, 스타일이 유사한 선수를 찾아주는 서비스입니다. 선수 검색과 상세 페이지, 시즌 히스토리 그래프, 어드민 페이지를 구현하며 복잡한 지표를 한글 라벨과 설명 툴팁으로 한눈에 이해할 수 있게 만들었습니다.

팀에 경험자가 없던 FastAPI 추론 서버를 맡아 완성

무작정 코드를 짜기보다 제품 요구사항과 API 규격, 예측 데이터 흐름, 배포 방식을 먼저 문서화하고 작업 범위와 검증 기준을 정리했습니다. 예측 모델을 쉽게 교체할 수 있도록 구조를 추상화하고, 실행 환경에 따라 동작 모드를 분리했으며(로컬은 가짜 데이터, 운영은 실제 DB 조회), 한 선수의 예측이 실패해도 전체 요청이 멈추지 않도록 부분 실패를 처리했습니다.

AI 도구를 검증하며 이끄는 개발

구현 과정에서 Claude 기반 에이전트를 보조적으로 활용하되, 생성된 결과를 그대로 쓰지 않고 직접 정의한 구조와 검증 기준에 맞는지 확인하며 진행했습니다. Docker 컨테이너화와 GitHub Actions 기반 EC2 자동 배포까지 갖춰, 문제를 문서로 정의하고 결과를 검증하며 이끌어가는 방식을 체득했습니다.

React / TypeScript / FastAPI / Docker / GitHub Actions / AWS (EC2 · S3)

Footure 홈 - 이적 가능성 예측
선수 상세 - 시장가치 추이와 성장률

05

세종 줍줍

Zup-Zup

2025.07 ~ 2026.04

프론트엔드 · 배포

세종대학교 지도 기반 분실물 찾기 웹

캠퍼스에서 분실물을 찾고 등록하는 지도 기반 웹 서비스로, 첫 팀 프로젝트이자 첫 배포 경험이었습니다. 분실물 찾기, 로그인, 마이페이지 등 주요 페이지를 구현하고 배포를 담당했습니다.

협업 규칙을 팀과 함께 만들기

협업 규칙이 없던 첫 팀이라, 잘 알려진 오픈소스 프로젝트들의 방식을 찾아보며 브랜치 전략과 이슈, PR 컨벤션을 팀과 함께 정했습니다. MSW로 목 서버를 구축해 API가 준비되기 전에도 화면을 완성했습니다.

Context API의 한계를 겪고 상태 관리 마이그레이션

전역 상태를 Context API로 시작했지만 규모가 커지며 한계를 겪었습니다. 서버 데이터와 UI 상태가 한곳에 섞이고, 값 하나가 바뀌면 관련 없는 컴포넌트까지 리렌더링되고, 로딩과 에러 처리를 매번 직접 구현해야 했습니다. 서버 상태는 TanStack Query, 클라이언트 상태는 Zustand로 역할을 나눠 마이그레이션했습니다.

첫 프로덕션 배포 파이프라인 구축

AWS CloudFront로 프로덕션 배포 파이프라인을 직접 구축했습니다. 첫 배포라 CI 빌드 단계에서 여러 문제를 만났지만, 하나씩 해결하며 안정적인 배포 환경을 만들었습니다.

React / TypeScript / Vite / Zustand / TanStack Query / MSW / AWS CloudFront

세종 줍줍 - 캠퍼스 지도 기반 분실물 목록
분실물 등록 페이지

Skills

Frontend

React · TypeScript · Next.js · Flutter · Dart · HTML/CSS

React와 TypeScript 기반 웹, Flutter 기반 앱을 모두 만듭니다. Next.js로 SSR과 SEO가 필요한 서비스 웹사이트를 구현한 경험이 있습니다.

상태 관리 · 데이터

Zustand · TanStack Query · Riverpod · MSW

서버 상태와 클라이언트 상태를 구분해 설계합니다. Context API에서 Zustand와 TanStack Query로 마이그레이션을 주도했고, 상태관리 학습 미션을 직접 설계했습니다.

실시간 · 서버

STOMP over WebSocket · FCM · FastAPI

STOMP over WebSocket으로 실시간 게임 이벤트와 채팅을 구현했고, FastAPI 추론 서버를 설계부터 배포까지 완성했습니다.

테스트 · 인프라

Cypress · Storybook · Docker · GitHub Actions · AWS (EC2 · S3 · CloudFront)

Cypress E2E 테스트가 포함된 학습 미션을 설계했습니다. Docker와 GitHub Actions로 자동 배포 파이프라인을 구축한 경험이 있습니다.

Activity

그리디

Greedy - Sejong Univ. SW Club

2025.03 ~ 현재

2기 멘티 → 3기 스터디 리드 → 4기 메인테이너

56명 규모의 세종대학교 SW 학술 동아리로, 매주 미션을 구현하고 서로 코드 리뷰를 주고받습니다. 멘티로 시작해 스터디 리드를 거쳐, 지금은 미션 설계를 포함해 동아리 전반을 운영하는 메인테이너를 맡고 있습니다.

2기 - 멘티

순수 JavaScript로 숫자 야구 게임을 구현하며 MVC 패턴을 익히고, React 투두 리스트, SPA 라우팅 직접 구현, 상태관리 미션을 진행했습니다. 미션 하나에 수십 개의 리뷰 코멘트가 오가는 코드 리뷰 중심 문화 속에서, "왜 이렇게 구현했는지"를 설명하고 피드백으로 코드를 고쳐나가는 방식에 익숙해졌습니다.

3기 - 스터디 리드

매주 미션의 핵심 개념과 리뷰에서 나온 좋은 접근들을 다루는 세션을 진행했습니다. 외부 현업 리뷰어의 피드백을 반영해 Recoil, Redux 기반 상태관리 미션을 Zustand와 TanStack Query 기반으로 마이그레이션하며, 학습자가 "언제 어떤 상태관리 방식을 선택할 것인가"를 스스로 고민하도록 미션을 다시 설계했습니다.

4기 - 메인테이너

순수 JavaScript 게임 미션을 새로 설계하고 Cypress E2E 테스트를 붙였습니다. 처음에는 요구사항에 없는 동작까지 테스트가 검증하게 만들어 멤버들이 통과 기준을 두고 혼란을 겪었는데, 테스트를 요구사항 범위에 맞게 다시 정리하며 '테스트는 곧 명세'라는 기준을 얻었습니다. 설계한 미션들은 우아한테크코스 코치 기반 스터디 네트워크(초록스터디)의 첫 프론트엔드 학습 자료로 제공되는 절차가 진행되고 있습니다.

  • - 초록스터디와 연계해 현업 코치를 초청하는 세션(코수타)의 진행 흐름과 자료 기획

Awards

  • 세종 창업 아이디어리그 대상

    2026

    경찰과 도둑 · SW중심대학사업단 주최

  • 세종대학교 입주공모전 우수 창업 아이템상

    2026

    경찰과 도둑

  • 제14회 세종대학교 AI·SW 해커톤 우수상

    2026

    DevFlow - 코딩 팀프로젝트 협업·진행 시각화 · SW중심대학사업단 주최

  • 세종대학교 전공심화학습공동체 장려상

    2026

    Footure · 교수학습개발센터 주최

  • 제13회 세종대학교 SW·AI 해커톤 장려상

    2025

    깃력사무소 - GitHub 활동 데이터 기반 팀 결성 플랫폼 · SW중심대학사업단 주최

Events

  • 서울게임타운

    2026

    인디게임 전시회 - 참가 신청부터 부스 출품과 운영까지 직접 추진. 행사용 미니게임, 포토부스, 리더보드를 만들어 방문자가 서비스 세계관을 체험하게 구성

  • 세종대 축제 부스

    2026

    그리디 멤버들이 만든 게임으로 부스를 운영, 기획부터 현장 운영까지 총괄

  • 그리디콘

    2026

    SW중심대학사업단과 공동 주최한 현업 연사 초청 컨퍼런스 · 운영진으로 연사 섭외와 후원사·도서 후원 컨택 담당 · 강연 4명과 실습 세션, 후원사·동아리 부스로 구성해 100명 참가

  • 광진구 청춘대로

    2026

    구청에 먼저 제안해 축제 공식 프로그램으로 편성 · 광진구청과 협업해 기획안 작성부터 장소와 시간 조율까지 맡고 현장 프로그램을 주관 · 건국대 신청이 적어 QR 박스 옷을 만들어 입고 포스터를 들고 건국대 앞에서 직접 모집

  • 서울대학생연합페스티벌

    2026

    부스 선정 후 세계관 부스와 미니운동회 경찰과 도둑 프로그램을 팀과 함께 기획 · 관람객과 섞이는 공간에서 안전하게 뛸 수 있도록 구역과 규칙을 정함 · 미니운동회 참가 50명

서울게임타운 경찰과 도둑 부스
서울게임타운 - 경찰과 도둑 부스 운영
그리디 프론트엔드 스터디
그리디 프론트 스터디 - 매주 그 주 미션을 주제로 세션 진행
그리디 코수타 세션
코수타 - 현업 코치 초청 세션 기획과 진행