송재욱 (Web Developer)
문제의 '왜'를 추적, 본질을 명확히 규명하는 개발자입니다.
복잡한 요구사항 속에서 진짜 문제를 재정의하고, 가장 단순하고 비용 효율적인 솔루션을 도출합니다.
책임감을 바탕으로 오너십을 실천하고, 독단보다는 소통을 통해 팀이 같은 방향을 바라보게 합니다.
목적을 위해 개인적인 리소스를 아낌없이 투자하며 팀과 사용자 모두에게 유의미한 결과를 만듭니다.
contact
- s24064@gsm.hs.kr
- 010-7745-5407
career
스타트업팀
Frontend Developer
교육청과 광주고등학생의회가 주도하는 오디션 프로그램 '광탈페'의 공식 플랫폼. 예매 기능에 그치지 않고 프로그램 소개, 슬로건 공모, 참여 신청, 실시간 투표까지 제공하는 플랫폼으로 확장 개발. 1,000만+원의 외주 입찰 비용을 절감. 행사 당일 DAU 3,000+명, Vercel 기준 누적 트래픽 7.3만+, GA 기준 이벤트 5만+건
- 자체 Auth 로직 구현
-
실시간 좌석 예매 기능(SSE) 구현, 계정별 예매 여부에 따라 동적 라우팅 적용
- useMemo 의존성에 불변 객체 queryClient를 넣어 UI가 갱신되지 않던 문제를, useQueries로 전환해 SSE 수신 즉시 좌석 점유율 실시간 반영
- next.js Metadata API로 OG/keywords 설정, next-sitemap prebuild 자동화 → 주요 검색엔진 최상단 노출
- SSG + 섹션별 Lazy Loading, 히어로 섹션 priority preload → Lighthouse FCP·LCP·SI 각 약 60% 개선
광주광역시 광산구 수주 프로젝트. 지역 내 가상 화폐 '광산'을 활용한 서비스·물품 거래 플랫폼. iOS 파트 개발자가 갑작스럽게 이탈하는 상황에서 React Native로 공백을 메우고 App Store 릴리즈까지 진행.
- 웹(어드민): 가입 승인, 신고 처리, '광산' 지급·회수 운영 기능 개발 및 운영
-
모바일앱: 거래 게시글 및 채팅으로 물건/서비스를 교환할 수 있는 MVP 플로우 구현
- Zustand Persistent Queue 도입 + 낙관적 업데이트 → WebSocket 메시지 유실률 1% 이내로 감소
- 슬라이더 드래그 중 바텀시트 깜빡임 해결: 드래그 중 로컬 상태만 사용, 완료 버튼 시 부모 상태 업데이트 blog
-
Jest + MSW 기반 단위 테스트 및 에러 시나리오 독립 검증, Detox iOS/Android E2E 자동화 구축
- Unit은 PR마다 Jest 커버리지 리포트 자동 코멘트, E2E는 babel-plugin-istanbul로 시뮬레이터 실행 결과에서 커버리지 추출 → 두 레이어 모두 CI에서 커버리지 자동 보고
- CocoaPods·Detox·Xcode 중간 산출물 캐싱으로 CI 시간 단축, Discord 웹훅으로 결과 즉시 공유
- 개발 기간 데일리 스크럼 주최, 팀 전원 목표 공유 및 이슈 파악 체계화
광주광역시교육청 수주 프로젝트. 사전 신청·QR 현장 인증·만족도 조사·Excel 자동 정리를 통합 제공. 기존 외주 입찰 비용 2,000만+원 절감, 3만+명 운영.
-
동적 폼 스키마/타입 고도화 및 API payload/데이터 변환 로직 구현
- 렌더링 시점마다 반복 실행되던 JSON.parse()를 Zod Schema 기반 Wrapper Layer로 이동 → JSON.parse() 1회로 감소, White Screen of Death 위험 차단
- 질문 제목 기반 slugify ID → UUID 기반으로 교체하여 데이터 무결성 확보
- 요청 데이터 기반 QR 정보 주입, 토큰 유무 등 현장 예외 케이스 대응
GOGO팀
Frontend Developer
전국 중·고등학교 대상 스포츠 행사 플랫폼. 수기 신청서와 디스코드 의존도를 없애고, 팀 신청·동적 대진표·일정 관리를 통합. 승부 예측 기능을 제공하여 사용자 98%가 “기존 체육대회보다 더 즐거웠다” 라고 응답. survey 본교 체육대회 DAU 300+명, GA 기준 누적 이벤트 17만+건.
- 대회 운영 MVP 플로우(스테이지/대진표/팀/매치) 설계·구현
-
DnD 기반 동적 대진표(Bracket) 기능 구현 및 팀 수/턴 등 edge case 대응
- onDragEnd가 stale state를 zustand에 저장하던 문제를, CustomEvent API 이벤트 버스 + gameId별 독립 관리로 해결 → 드래그 즉시 상태 반영
- overflow:hidden 컨테이너가 드래그 요소를 클리핑하는 문제를, React createPortal로 document.body에 렌더링하여 해결
- 커뮤니티 이미지 첨부/조회수 표시 구현, 댓글 입력/정렬/반응형 등 UX 개선
experience
cross-framework 경량 스크롤 라이브러리 Scrolloop 개발 및 운영 GitHub npm
- windowing 기법으로 렌더링하는 VirtualList와 이를 이용한 무한 스크롤을 지원하는 InfiniteList 제공
- turbopack 기반 모노레포 구조로 React, React Native, Vue, Svelte를 동시에 지원
- 약 35kb, 디펜던시 0개로 구현, 누적 다운로드 2,000+건
교내 디스코드 편의성 봇 JEE6 개발 및 운영 GitHub
- 급식 조회, 자습 신청 리마인드, 미니게임 등. Python + MariaDB, Docker + CloudType 릴리즈
-
캐싱 이원화로 응답 속도 최적화. 40+개 디스코드 서버 도입, DAU 100+명
- 모든 외부 API·DB 접근 서비스: In-memory 캐싱 적용
- 급식 조회 시 주간 배치 조회 후 DB 캐싱 → 외부 API 중복 호출 제거
- 봇 시작 시 asyncio.gather()로 오늘/내일 급식 비동기 병렬 preload → 캐시 히트 보장
오픈소스 기여
- typescript-eslint: no-floating-promises의 allowForKnownSafeCalls 옵션이 함수 이름을 올바르게 인식하지 못하는 버그 수정 #11430 blog
- TanStack/query: eslint-plugin-query를 TS 없는 환경에서도 사용하도록 TypeScript를 optional peer dependency로 선언 #10007
- fast_float: double/float 파싱 edge case 검증 unit 테스트 추가 #366
- NestJS: SSE, 캐시, swagger 관련 unit 및 e2e 테스트 추가 #16410 #16409 #16406
activities
제7·8대 전교학생부회장
- 2년 연속 부회장으로 선출, 학생회와 학교 전체 리드
- 교사-학생 간 이해관계 조율을 통해 학교 정책 수립, 매주 교장·교감 선생님과의 정기 회의를 통해 학교 주요 현안 논의
- Dev Fest를 비롯한 다양한 행사를 직접 기획·운영 article
웹 개발 전공 동아리 INCUBE 창단
- 교내 웹 개발 전공 동아리 INCUBE를 직접 창단, 교내 최대 규모로 성장
- 후배 양성을 핵심 가치로 운영 중
skills
- JavaScript, TypeScript, Python
- Next.js, React, Expo, React Native, Nuxt, Vue, Svelte, Astro
- Django, Flask, FastAPI, Nest.js
- Git, Vercel, Docker, GitHub Actions
background
학력
- 광주소프트웨어마이스터고등학교2024. 03. ~ 2027. 01.
자격·성적
- TOPCIT 512점 2025. 05.
- 정보처리산업기사 2025. 12.
- TOEIC 785점 2026. 01.
수상
- 제2회 GSM Dev Fest 2위, 3위 입상 (2025)
- 제10회 HIGHTON 장려상 (2025)
- GSM 역량인증대회 3위 (2025)
- 2024 SW 동행 해커톤 장려상
- 2024 SW 동행 데모데이 장려상
- 제10회 빛가람 에너지밸리 SW 작품 경진대회 장려상 (2024)
- GSM 아이디어 페스티벌 3위 (2024)
- GSM 역량인증대회 3위 (2024)
산업기능요원으로 복무 가능하며, 9월 이후부터 출근이 가능합니다.
학교와 산학협약 체결 시 7점, 선도기업 선정 5점, 총 12점의 산학협약 가산점 획득이 가능합니다.
더 다양한 경험을 자세히 담았습니다.
포트폴리오 보러가기