LJS0817
CLIENT DEVELOPER

디테일을 생각하는
클라이언트 개발자 이준상입니다

유연하고 안정적인 구조를 설계하고, 항상 프로젝트에 어울리는 UI/UX를 고민하고 미세한 디테일을 놓치지 않으면서 성능까지 고려하여 하나의 작품을 만들기 위해 노력합니다.

GitHub ↗ iam0817jun@gmail.com
HOW I WORK

이렇게 개발합니다

01

포기하지 않고 방법을 찾습니다

개발 중 가상 머신 시스템이 손상되어 스냅샷으로도 복구를 하지 못하였을 때, 포기하지 않고 가상 디스크(.vmdk) 파일을 에디터로 열어 필요한 데이터를 복구했던 경헙이 있습니다.

02

새로운 도구는 빠르게 손에 익힙니다

낯선 API나 라이브러리를 만나도 핵심 사용법부터 빠르게 파악해서, 바로 프로젝트에 적용할 수 있는 수준까지 끌어올립니다.

03

재사용할 수 있는 구조를 설계합니다

지금 당장 필요한 기능만 보고 코드를 짜지 않습니다. 기능 단위를 나누고 최대한 의존성을 낮춰서, 다른 스크립트에서도 만들어둔 기능을 재활용할 수 있게 만듭니다.

04

디테일에서 타협하지 않습니다

총으로 오브젝트를 쐈을 때 재질별로 다른 사운드·파티클이 나타나도록 만들었고 어떤 오브젝트는 물리적으로 분리되게 구현했던 경험이 있습니다.

ALL WORK

프로젝트

GAME
CatcherVR
UNITY VR · 2026
CatcherVR
구질 물리 · 낙구 예측 · 수비 AI
SniperVR
UNITY VR · 2025
SniperVR
Arduino 시리얼 통신 · 볼트액션
Taskkill
UNITY · 2019
Taskkill
CCTV 감시 로직 · Dissolve 셰이더
Mine
UNITY · 2019
Mine
Texture2D Fog of War · 2D Lighting
Stack Code
UNITY · 2020 · 5인 · 수상
Stack Code
블록 코딩 인터프리터 · 낮·밤 2D 조명
Cloud Clash
WEB · 2025
Cloud Clash
Docker 11 컨테이너 · Redis 세션
장기 아케이드
UNITY · 2026 · 출시 준비
장기 아케이드
덱 빌딩 장기 디펜스 · UI Toolkit · 애드몹
APP
Card Usage Tracker
FLUTTER · 2024
Card Usage Tracker
sqflite 4테이블 관계형 DB
Desk Clock & NowPlaying
FLUTTER · 2024
Desk Clock & NowPlaying
MethodChannel 네이티브 브릿지
Public Data Weather App
FLUTTER · 2023
Public Data Weather App
기상청 API · XML→JSON 파싱
Soap & Cosmetic Calculator
FLUTTER · 2023 · 출시
Soap & Cosmetic Calculator
Play Store 출시 · 배합 산출 알고리즘
OTHER
Gaze Heatmap AI
WEB / AI · 2025 · 5인
Gaze Heatmap AI
Canvas 히트맵 오버레이 렌더링
3D Modeling
BLENDER · 상시
3D Modeling
Shape Keys 표정 모핑 시스템
CatcherVR

CatcherVR

Meta Quest 2 환경에서 플레이어가 직접 포수가 되어, 실시간으로 계산되는 타구 궤적과 스스로 수비 위치를 조율하는 AI 야수들을 상대로 정밀한 승부를 겨루는 VR 야구 시뮬레이션 게임입니다.

GitHub Repo ↗
기간
2026.08.04 — 2026.09.05 (약 1개월)
역할
VR 프로그래밍 · 물리 연산 · AI 로직 · 3D 모델링 전담
인원
1인 개발
Unity C# OpenXR Meta Quest 2 XR Interaction Toolkit Blender DOTween
AI 활용 범위: 수비수·타자 AI 스크립트 고도화 및 코드 최적화, 스트라이크/볼 판정과 UI 표시 스크립트

핵심 구현

실시간 타구 궤적 예측

배트 접촉 순간의 속도·방향으로 포물선 궤적과 최종 낙구 지점을 연산. 투구/타구/포구 이벤트 주도권을 상태 플래그로 분리하고 공기 저항 감쇄 공식을 보정했습니다.

역할 배정 수비 AI

가장 인접한 수비수에게 포구 타겟을 할당하고, 나머지는 백업 커버 및 베이스 수비로 전환하는 지능형 수비 구조를 구현했습니다.

시스템 구조

투구 입력
구질(포심·투심·슬라이더·커브·체인지업) 선택 → 초기 속도·회전축·궤적 변화량 파라미터화
물리 궤적 연산
Rigidbody 속도·질량 기반 포물선 궤적을 매 프레임 재계산, LineRenderer로 예측 궤적 시각화
BallProjectileCalculator
타격 / 충돌 판정
배트 접촉 순간 상태 플래그로 투구·타구 이벤트 주도권을 분리하고 공기 저항 감쇄 보정
수비 AI (FSM)
타구 방향·낙구 지점 분석 → 최근접 수비수에게 포구 타겟 할당, 나머지는 베이스 커버·백업 전환
BaseballPlayer
카운트 판정
파울라인·스트라이크 존·플라이 아웃 판정, 볼카운트 갱신
CountsProvider

개발 사항

  • 포심·투심·슬라이더·커브·체인지업 등 구질별 초기 속도·회전축·궤적 변화량을 파라미터화하고, 투구 시작 시점부터 구질별로 다른 실시간 가속도를 적용해 사실적인 투구 궤적을 구현
  • Ball의 상태 플래그(_aiThrows, _playerThrows, _isBattedBall)로 지금 공을 누가 제어 중인지 명확히 구분하고, 타구 시에만 공기 저항 감쇄 계수(0.35f)를 조건부로 적용해 투구 궤적과 다른 물리 거동을 구현
  • BallProjectileCalculator에서 Rigidbody의 선형 속도·질량을 기반으로 포물선 궤적을 매 프레임 재계산하고, LineRenderer로 예측 낙구 지점까지 궤적을 시각화
  • BaseballPlayer를 상속한 수비수가 타구 방향·낙구 지점을 분석해 가장 가까운 수비수에게 포구 타겟을 할당하고, 나머지는 FSM으로 베이스 커버·백업 상태로 전환
  • AssignSpecialRole로 상황에 따라 수비 위치를 동적으로 재배정하고, 투수의 베이스 커버와 외야 백업 동선까지 자동으로 전환되도록 구현
  • XR Interaction Toolkit을 커스텀해 글러브 트랜스폼과 물리 충돌체를 동기화하고, CountsProvider로 파울라인·스트라이크 존·플라이 아웃을 판정

스크린샷

CatcherVR 스크린샷 CatcherVR 스크린샷 CatcherVR 스크린샷 CatcherVR 스크린샷 CatcherVR 스크린샷
SniperVR

SniperVR

실제 조준경 형태의 아두이노 하드웨어와 Unity를 시리얼 통신으로 연결해, 거리와 풍속을 반영한 탄착 가이드를 구현하며 신호 전달을 검증한 하드웨어-소프트웨어 연동 테스트 프로젝트입니다.

GitHub Repo ↗
기간
2025.07 — 2025.08
역할
클라이언트 프로그래밍 · 하드웨어 회로 설계 및 통신 구축 전담
인원
1인 개발
Unity C# Arduino C++ XR Interaction Toolkit USB Serial
AI 활용 범위: 아두이노 하드웨어 컨트롤 보조, USB 시리얼 통신 코드 보조, 스코프 조작 기능 스크립트 보조

핵심 구현

저격총 3D 모델 파츠 분리

저격총 3D 모델을 실린더·슬라이드·볼트 등 개별 파츠로 분리 모델링해, 슬라이드 가변저항 값에 따라 실린더 Z축이 실시간으로 움직이고 장전 시 탄피 배출(Pop Out)·재장전(Push In)이 순차 트리거되는 물리 기반 볼트 액션 메커니즘을 구현했습니다.

거리 · 풍속 기반 탄착 가이드

레이캐스트로 목표물 거리를 측정하고 중력과 바람 편차를 계산해 실시간 탄착 마커를 표시합니다. 스코프 줌 배율과 거리에 따라 마커 스케일을 자동 보정했습니다.

시스템 구조

하드웨어 입력
로터리 엔코더 3개(A/B상)와 슬라이드 가변저항을 아두이노가 폴링·인터럽트로 감지
인터럽트 & 상태 필터링
PinChangeInterrupt ISR이 상태표로 이전·현재 상태를 비교해 바운싱으로 인한 비정상 회전(delta=0)을 무시
enc_table (ISR)
시리얼 전송
"E:10;W:-2;R:80" 형식 문자열로 Elevation·Windage·Rotary 값을 USB 시리얼 송신
Unity 파싱 & 이벤트 디스패치
변경이 감지될 때만 이벤트를 발송하는 비동기 파싱으로 프레임 드랍 방지
SensorDataUpdateEvent
게임 오브젝트 반영
Mathf.Lerp 보간으로 스코프 FOV·조준 트랜스폼 값을 부드럽게 동기화

개발 사항

  • 조준선 이동은 VR 컨트롤러 트래킹, 스코프 영점·줌은 로터리 엔코더 3개를 연결한 아두이노로 제어
  • 저격총 3D 모델을 실린더·슬라이드·볼트 등 개별 파츠로 분리 모델링하고, 슬라이드 가변저항 값에 따라 실린더 Z축이 실시간으로 움직이도록 구현
  • 슬라이드 가변저항 이동 값과 총기 부품 위치를 동기화하고 거리에 따른 탄피 배출 구현
  • 장전 동작 시 탄피 배출(Pop Out)과 새 탄환 장전(Push In)이 순차적으로 트리거되는 물리 기반 볼트 액션 메커니즘 구현
  • 이벤트 주도형 비동기 처리로 변경 감지 시에만 이벤트를 발송하는 시리얼 파싱 아키텍처

스크린샷

SniperVR 스크린샷 SniperVR 스크린샷 SniperVR 스크린샷 SniperVR 스크린샷 SniperVR 스크린샷 SniperVR 스크린샷
Taskkill

Taskkill

9방향으로 뻗는 CCTV의 감시망을 피해, 정찰 드론을 직접 해킹해 조종하고 총·나이프를 활용해 에너지가 닳기 전에 엘리베이터까지 도달해야 하는 3D 잠입 액션 슈팅 게임입니다.

GitHub Repo ↗
기간
2019.12 — 2020.02 (3개월)
역할
프로그래밍 및 그래픽 보조
인원
2인 팀 (프로그래밍 1, 그래픽 1)
Unity 2019.4 C# Shader Graph NavMesh Post-Processing

핵심 구현

CCTV 9방향 레이캐스트 감시

중앙 1, 상하좌우 4, 대각 4 등 9개 방향 벡터를 실시간 선형 결합해 3D 시야각을 수학적으로 형성했습니다. 레이어마스크로 유리 투과와 벽면 차폐를 분기 연산하고 인지 게이지를 누적해 발각 상태 머신을 제어했습니다.

정찰 드론 원격 조종 & 해킹

본체와 드론 간 1인칭 시점 전환, 이동 속도에 따른 바퀴 회전 물리와 도약 점프를 구현했습니다. 배터리 방전 시 화면 노이즈와 REC 타임코드 UI, 보안문 홀딩 해킹 연출을 적용했습니다.

시스템 구조

감시망 회피
CCTV 시야에 노출된 시간만큼 인지 게이지가 누적되어 발각 여부를 실시간 판정
발각 대응
게이지 임계치 도달 시 순찰 → 경계 → 추적 상태로 전환, NavMesh 기반 추격 시작
드론 정찰 & 해킹
드론으로 시야 밖 적 위치를 사전 정찰하고, 보안문을 홀딩 해킹해 우회 경로 확보
전투 / 제거
총기·나이프로 조용히 제거, 처치 시 Dissolve 셰이더로 5초간 사망 연출
목표 도달
에너지가 소진되기 전 엘리베이터에 도달하면 스테이지 클리어

개발 사항

  • Transform.forward/right/up 기반 9방향 레이캐스트와 레이어마스크를 활용한 3D 시야각(FOV) 감시망
  • 레인보우식스 시즈를 오마주한 정찰 드론 시스템 구현
  • ASCII 난수 조합 텍스트 생성 및 무선 해킹 파이프라인
  • Shader Graph Dissolve 셰이더 프로퍼티 런타임 제어
  • 충돌면 Normal 회전 행렬 연산으로 총알 흔적 부착, 재질별(Metal/Glass/Wood/Pillow) 효과 분기

스크린샷

Taskkill 스크린샷 Taskkill 스크린샷 Taskkill 스크린샷 Taskkill 스크린샷 Taskkill 스크린샷 Taskkill 스크린샷 Taskkill 스크린샷
Mine

Mine

스펠렁키를 모티브로, 안개 속에 가려진 동굴을 횃불로 밝혀가며 한정된 산소와 불빛을 관리해 함정과 몬스터를 피해 탈출하는 픽셀 아트 2D 동굴 탐험 액션 게임입니다.

GitHub Repo ↗
기간
2019.05 — 2019.07 (3개월)
역할
프로그래밍 전담
인원
3인 팀 (Art 1 · 맵 제작 1 · 프로그래밍 1)
Unity C# Texture2D 2D Lighting Particle System GoldWave

핵심 구현

Texture2D 기반 Fog of War

외부 플러그인 없이 SetPixel() / CopyTexture()로 구현. 플레이어 월드 좌표를 미니맵 텍스처 좌표로 실시간 변환하고 이동 경로 반경의 알파값을 0으로 뚫어 탐색한 지형을 밝힙니다.

2D Lighting × 횃불 연소

남은 연소 시간에 따라 Light.range와 파티클 크기를 실시간 Lerp 감쇠시켜 긴장감을 부여하고, 맵 내 횃불 접촉 시 즉시 재충전되도록 구현했습니다.

시스템 구조

동굴 탐험 & 시야 개척
타일맵 던전을 이동하며 Fog of War로 미개척 지형을 실시간으로 밝힘
생존 자원 관리
산소·허기·HP·횃불 연료가 실시간으로 감소, 에어포켓·음식·횃불로 회복
위협 대응
함정·몬스터를 피하거나 맞서고, 로프로 낙차 지형을 통과
시야 축소 & 압박
횃불 연료가 줄어들수록 2D Lighting 범위가 좁아지며 긴장감 상승
탈출
자원이 바닥나기 전 동굴 출구에 도달하면 클리어

개발 사항

  • Texture2D 픽셀 연산을 직접 활용한 실시간 Fog of War 미니맵 시야 개척 시스템 자체 구현
  • 광원 반경과 파티클이 점진 감쇠하는 2D Dynamic Lighting & 횃불 생존 시스템
  • HP·산소·횃불 연소·음식을 유기적으로 관리하는 서바이벌 게임 루프
  • 몬스터 AI(유령 배회, 박쥐 급강하), 함정 기믹 및 물리 충돌 판정
  • 사운드 소스를 GoldWave로 직접 편집·노이즈 보정하여 동굴 앰비언스 적용

스크린샷

Mine 스크린샷 Mine 스크린샷 Mine 스크린샷 Mine 스크린샷 Mine 스크린샷 Mine 스크린샷
Stack Code

Stack Code

방향·반복·조건 블록을 직접 조립해 탈 것을 목적지까지 운전시키는 안드로이드 교육용 블록 코딩 게임입니다. 순차·반복·조건이라는 프로그래밍의 기본 개념을 문법 없이 플레이로 익힐 수 있도록 설계했으며, 스마틴앱챌린지 출품작으로 입상했습니다.

GitHub Repo ↗
기간
2020
역할
팀장 · 프로그래밍 · 아트 · 사운드
인원
5인 팀 (팀장 1 · 팀원 4)
Unity C# Android ScriptableObject uGUI 2D Lighting Tilemap Animator JsonUtility

핵심 구현

블록 코딩 인터프리터

배치한 블록을 Elements enum 명령어로 바꾸어 Dictionary<int, Elements>로 직렬화하고, index를 명령 포인터처럼 옮기며 한 줄씩 해석합니다. 반복 블록은 시작·종료 인덱스와 남은 횟수를 별도 리스트로 관리해 루프 재진입 시 포인터를 되감고, 조건 블록은 드롭다운으로 고른 상황을 트리거 충돌과 매칭해 분기합니다.

밤 챕터 × 2D 조명

밤 챕터는 타일맵 머티리얼을 조명에 반응하는 셰이더로 교체하고 베이스 틴트를 거의 검정으로 낮춰, 배치한 Point·Spot Light가 비추는 곳만 길로 드러나도록 했습니다. 가로등 아이템을 밟으면 맵 전체 조명이 순차 점등됩니다.

시스템 구조

탈 것 & 챕터 선택
자동차·배·비행기와 낮·밤 챕터를 골라 스테이지 진입
블록 조립
팔레트의 방향·반복·조건 블록을 작업대로 끌어다 놓으며 실행 순서를 구성
실행 전 검증
반복·여기까지 짝, 남은 기름, 빈 입력값을 검사해 오류를 먼저 안내
순차 실행 & 하이라이트
명령 포인터가 한 줄씩 내려가며 실행 중인 블록을 컬러로 강조, 기름 게이지 감소
결과 정산
도착 시 다음 스테이지 해금·JSON 저장, 실패 시 원인 문구와 함께 재시도

개발 사항

  • 블록을 명령어로 직렬화해 포인터로 해석하는 블록 코딩 인터프리터와 반복·조건 제어 흐름을 자체 구현
  • 외부 UI 플러그인 없이 프리팹 Instantiate와 RectTransform 영역 판정만으로 드래그&드롭 블록 편집기 제작 (길게 누르면 fillAmount 게이지가 차면서 삭제)
  • 스테이지별 블록 보유 수량을 ScriptableObject 11종으로 데이터화해, 기획 수치만 교체하면 난이도가 바뀌도록 로직과 분리
  • 밤 챕터에 조명 반응 머티리얼과 Point·Spot Light를 결합한 2D 조명 연출 구현, 가로등 아이템 획득 시 Animator로 일괄 점등
  • 탈 것 3종 × 낮·밤 × 11스테이지, 총 66개 씬을 탈 것별 아트·사운드·컬러 팔레트로 나누어 구성
  • 반복 짝 불일치·기름 부족·경로 이탈 3종 오류를 실행 전에 검증해, 어린 플레이어도 이해할 수 있는 힌트 문구로 안내
  • persistentDataPath JSON 세이브로 진행도·해금·튜토리얼 여부와 스테이지별 티켓 획득 이력을 분리 저장해 중복 획득 방지
  • 팀장으로 일정·산출물을 관리하며 프로그래밍과 함께 캐릭터·블록·UI 아트와 BGM·효과음 편집까지 직접 담당
  • 스마틴앱챌린지 출품작으로 입상

스크린샷

Stack Code 스크린샷 Stack Code 스크린샷 Stack Code 스크린샷 Stack Code 스크린샷 Stack Code 스크린샷 Stack Code 스크린샷 Stack Code 스크린샷
Cloud Clash

Cloud Clash

VMWare와 Docker로 11개의 독립 컨테이너를 구축하고, Redis 기반 분산 세션 인증과 Socket.IO 실시간 통신으로 여러 서버를 넘나드는 대전을 구현한 클라우드 네이티브 웹 게임입니다.

GitHub Repo ↗
기간
2025.11.15 — 2025.11.21
역할
대학교 기말대체 프로젝트
인원
1인 개발
Docker Docker Compose Node.js Socket.io Nginx Redis MySQL EJS
AI 활용 범위: Docker 설계 보조, Node.js 구축 보조, Socket.io 통신 프로그래밍 보조, 스크립트 오류 검출 및 수정

핵심 구현

11개 마이크로서비스 컨테이너화

격리된 브릿지 네트워크 환경에서 각 서비스의 의존성과 포트 포워딩을 관리하며 Docker Compose로 클라우드 네이티브 아키텍처를 구현했습니다.

11개 마이크로서비스 컨테이너화
Redis 분산 세션 & Socket.IO

세션 정합성을 위해 Redis 인메모리 세션 스토리지를 도입하고, HTTP 요청과 웹소켓 실시간 통신을 분리 라우팅해 트래픽 병목을 방지했습니다.

Redis 분산 세션 & Socket.IO

시스템 구조

클라이언트 요청 진입
test.com(HTTP)과 socket.test.com(WebSocket) 형태로 서브도메인 분리 진입
Nginx 리버스 프록시
HTTP 요청은 Node.js 웹 서버로, WebSocket은 Socket.io 컨테이너로 라우팅
세션 인증
Redis 세션 스토어를 실시간 조회해 분산 환경에서도 일관된 사용자 인증 처리
실시간 게임 처리
Socket.io 컨테이너가 일반 백엔드와 분리되어 게임 상태 계산·행동 검증을 처리
데이터 저장
처리 결과를 MySQL에 저장하고 Redis 세션 상태를 갱신
응답 & 브로드캐스트
EJS 템플릿으로 응답을 렌더링하고 Socket.io로 접속 중인 클라이언트에 실시간 갱신 전파

개발 사항

  • Nginx 역방향 프록시, EJS 템플릿, Node.js 백엔드, MySQL, Redis 등 11개 컨테이너 연결 및 배포
  • Redis 세션을 실시간 조회해 분산 환경 사용자 인증 파이프라인 구축
  • Socket.IO 통신과 Node.js 서버 코드를 분리해 트래픽 분산 및 서버 안정성 확보
  • Nginx Proxy Manager 환경에서 WebSocket 전용 location 설정이 지원되지 않는 제약을 test.com / socket.test.com와 같은 서브도메인 분리와 커스텀 CORS 정책으로 해결
  • 격리된 브릿지 네트워크에서 11개 컨테이너의 의존성 순서와 포트 포워딩을 Docker Compose로 관리해 재현 가능한 배포 파이프라인 구축
  • 대부분의 서버·클라이언트 스크립트를 재사용성 높게 모듈화

스크린샷

Cloud Clash 스크린샷 Cloud Clash 스크린샷 Cloud Clash 스크린샷 Cloud Clash 스크린샷
장기 아케이드

장기 아케이드

장기의 표준 행마법과 공격 규칙을 그대로 유지하면서, 매 턴 4장의 손패에서 코스트를 소모해 기물을 소환하고 적 AI의 왕을 외통수로 제압하는 턴제 덱 빌딩 장기 디펜스 게임입니다.

GitHub Repo ↗
기간
2026.09.04 — 진행 중 (플레이스토어 출시 준비)
역할
기획 · 프로그래밍 전담 (게임 로직 · AI · UI Toolkit · 애드몹 연동)
인원
1인 개발
Unity C# UI Toolkit AdMob (Google Mobile Ads) Minimax · Alpha-Beta MCTS Unity Localization
AI 활용 범위: 장기 행마 규칙 검증 로직 보조, 난이도별 AI 탐색 알고리즘(Minimax/MCTS) 설계 보조, UI Toolkit 커스텀 렌더링 코드 최적화, 애드몹 연동 및 빌드 파이프라인 스크립트 보조

핵심 구현

Minimax + MCTS 4단계 AI 난이도

난이도마다 수를 정하는 방식이 다릅니다. 하 난이도는 무작위로 소환·공격하고, 중/상 난이도는 3~4수 앞까지 내다보는 Minimax 탐색으로 유불리를 점수화하되 잡을 수 있는 수부터 먼저 검토해(Alpha-Beta 가지치기) 계산을 더 깊이까지 확보합니다. 극악 난이도는 즉시 외통수가 나는 수를 우선 찾고, 없으면 후보 수마다 30번씩 무작위 진행을 시뮬레이션해(몬테카를로 롤아웃) 가장 유리한 수를 고릅니다.

UI Toolkit 기반 전체 화면 구축

메인 메뉴, 난이도 선택 카드, 장기판·손패·코스트를 보여주는 플레이 화면, 장군/외통수 알림 배너, 결과 통계를 보여주는 게임오버 모달까지 UI Canvas 없이 UI Toolkit(VisualElement·USS)만으로 코드 기반 구축했습니다. 기물 자체도 Painter2D로 직접 드로잉한 정8각형 커스텀 엘리먼트입니다.

시스템 구조

턴 시작 · 자원 충전
코스트 +2 회복(최대 10), 기물 처치 시 +1 추가 획득
PlayerState
손패 관리
상시 4장의 손패 유지, 소환·버리기로 카드 소모 시 가중치 추첨으로 즉시 새 카드 보충
PlayerState
기물 소환
빈 소환 구역 검증 후 배치, 소환 즉시 이동·공격이 가능한 '소환 스나이핑' 허용
SpawnRuleValidator
행마 판정
기물별 IMoveRule 전략 패턴(King·Advisor·Elephant·Horse·Chariot·Cannon·Pawn)으로 합법수 계산
MoveRuleFactory
AI 의사결정
난이도별 Minimax(Alpha-Beta)·MCTS 탐색으로 소환·이동을 결정, 공개된 플레이어 손패 분석
JanggiAIController
승패 판정 · 보상 광고
외통수·무승부(교착) 판정, 패배 시 애드몹 보상형 광고 시청으로 재도전 기회 제공
GameRuleValidator · AdMobManager

개발 사항

  • 기물 종류별 IMoveRule 전략 패턴(King/Advisor/Elephant/Horse/Chariot/Cannon/Pawn)으로 장기 표준 행마법을 분리 구현하고, MoveRuleFactory로 조회
  • 난이도별(하/중/상/극악) AI: 중~상은 Alpha-Beta 가지치기가 적용된 Minimax(깊이 3~4, 공격수 우선 정렬로 가지치기 효율 최적화), 극악은 즉시 외통수 우선 탐색 후 MCTS 30회 롤아웃 시뮬레이션
  • 소환 즉시 이동·공격하는 '소환 스나이핑'과 상대 소환 구역을 미리 점거하는 '스폰 블로킹' 등 실제 장기 디펜스 전술을 AI 판단 로직에 반영
  • UI Toolkit VisualElement(HexagonElement)를 커스텀해 Canvas/Image 없이 Painter2D로 정8각형 기물과 이중 림 라인을 직접 렌더링, USS 커스텀 프로퍼티로 색상·두께 제어
  • Google Mobile Ads SDK로 보상형 전면 광고(RewardedInterstitialAd)를 연동, .gitignore 처리된 로컬 시크릿 파일로 상용 키를 분리하고 에디터에서는 자체 제작한 광고 시뮬레이터 UI로 안전하게 테스트
  • Unity Localization 패키지로 한국어/영어 문자열 테이블을 분리 관리(LocalizationManager)

스크린샷

장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷 장기 아케이드 스크린샷
Card Usage Tracker

Card Usage Tracker

카드 사용 내역을 관계형 로컬 DB로 설계·기록·추적하고, Provider 상태 관리와 부드러운 화면 전환 애니메이션으로 사용 경험을 다듬은 가계부 앱입니다.

GitHub Repo ↗
기간
약 1개월 (2024.09 ~ 2025.05 중 실 개발 기간 기준)
역할
앱 프로그래밍 전담
인원
1인 개발
Flutter Dart Provider sqflite flutter_animate

핵심 구현

관계형 로컬 DB 모델링

card / usage / custom / config 4개 테이블로 구성된 관계형 스키마를 설계했습니다. cardID 기반으로 지출 내역을 연계하고 Batch 쿼리로 잔여 한도 갱신과 데이터 무결성을 안정적으로 유지합니다.

관계형 로컬 DB 모델링
Provider 전역 상태 관리

화면을 그리는 위젯과 데이터를 다루는 로직을 CreateUsageProvider, InfoMng, CustomMng 등 역할별 ChangeNotifier로 나눠 분리했습니다. 지출 입력 폼에서 값이 바뀌면 해당 Provider만 notifyListeners()를 호출하고, 그 값을 구독하는 미리보기 카드 위젯만 다시 그려집니다. 지출 내역을 추가·삭제할 때도 화면 전체를 다시 빌드하는 대신 구독 범위를 좁혀 관련된 위젯만 갱신되도록 최적화했습니다.

시스템 구조

앱 초기화
DB Helper를 Singleton으로 구성해 await init() 완료 후에만 Provider를 주입하고 위젯 트리를 렌더링
지출 기록 입력
프리셋 아이콘·금액으로 원터치 기록하거나 직접 입력
관계형 DB 반영
cardID 기준으로 card/usage/custom/config 테이블에 연계 저장, Batch 쿼리로 잔여 한도 갱신
상태 갱신
Provider가 변경된 지출만 감지해 필요한 위젯만 선택적으로 갱신
화면 반영
flutter_animate로 부드러운 전환 애니메이션과 함께 최신 상태를 화면에 표시

개발 사항

  • shared_preferences의 구조적 한계를 넘어 sqflite를 도입해 데이터 관리와 쿼리 성능 최적화
  • 앱 초기화 시 여러 위젯이 동시에 DB에 접근해 발생하던 Race Condition을 DB Helper Singleton화 및 await init() 순서 보장으로 해결
  • flutter_animate 패키지를 활용한 직관적이고 부드러운 전환 애니메이션
  • 반복 소비 항목을 아이콘·금액 프리셋으로 등록해 원터치 기록하는 편의 기능

스크린샷

Card Usage Tracker 스크린샷 Card Usage Tracker 스크린샷 Card Usage Tracker 스크린샷 Card Usage Tracker 스크린샷 Card Usage Tracker 스크린샷 Card Usage Tracker 스크린샷
Desk Clock & NowPlaying

Desk Clock & NowPlaying

탁상시계 화면 위에서 알림 서비스를 통해 유튜브 뮤직의 재생 정보를 실시간으로 읽어와 곡 전환까지 제어할 수 있게 만든 유틸리티 어플리케이션입니다.

GitHub Repo ↗
기간
2024.12.15 — 2024.12.20
역할
앱 기획 및 프로그래밍 전담
인원
1인 개발
Flutter Android Native MethodChannel Java Provider

핵심 구현

NotificationListenerService 브릿지

네이티브 영역에서 NotificationListenerService를 구현해 곡명·아티스트·앨범 아트워크 바이트를 추출하고, EventChannel 스트림으로 Flutter UI에 동기화했습니다.

NotificationListenerService 브릿지
MultiProvider 상태 분리

미디어 정보·1초 주기 시계·5가지 무드 컬러 테마를 독립 Provider로 분리해 전체 화면 리빌드를 방지했습니다.

시스템 구조

알림 감지 (Native)
NotificationListenerService가 시스템 알림을 상시 감지하고 YouTube Music 미디어 세션 알림만 식별
메타데이터 추출
Notification Bundle에서 곡명·아티스트·앨범 아트워크를 파싱
EventChannel 스트리밍
추출한 데이터를 일회성 요청이 아닌 실시간 스트림으로 Flutter 측에 전달
Flutter UI 갱신
스트림 수신 시 앨범 커버·곡 정보를 실시간으로 화면에 반영
미디어 컨트롤
이전곡·재생/일시정지·다음곡 버튼 입력 시 MethodChannel로 Java에 전달해 재생 제어
시계 & 테마 관리
Provider가 1초 주기 시계와 무드 컬러 테마 상태를 독립적으로 관리

개발 사항

  • 기존 패키지에 의존하지 않고 MethodChannel·EventChannel을 직접 구축해 네이티브(Java)와 Flutter 간 통신 구현
  • 안드로이드 알림을 감지해 YouTube Music의 앨범 커버와 곡 정보를 실시간 추출
  • 이전곡·재생/일시정지·다음곡 등 미디어 컨트롤을 탁상시계 UI와 통합
  • 화면을 터치할 때마다 5가지 무드 컬러 테마가 순환 전환되는 인터랙션 구현

스크린샷

Desk Clock & NowPlaying 스크린샷 Desk Clock & NowPlaying 스크린샷 Desk Clock & NowPlaying 스크린샷 Desk Clock & NowPlaying 스크린샷 Desk Clock & NowPlaying 스크린샷
Public Data Weather App

Public Data Weather App

공공데이터포털 API의 XML 데이터를 파싱해 실시간 날씨 정보를 제공하고, 구름이 랜덤하게 흘러 다니는 애니메이션으로 직관적인 UI를 구현한 날씨 앱입니다.

GitHub Repo ↗
기간
2023.10.30 — 2023.11.02 (4일)
역할
앱 기획 및 프로그래밍 전담
인원
1인 개발
Flutter Open API xml2json wakelock_plus flutter_animate

핵심 구현

발표 시각 연산 & XML 파싱

초단기예보 발표 주기(매시 30분)에 맞춰 현재 45분 미만이면 이전 시간대 API를 호출하는 동적 시각 계산 로직을 구현하고, 중첩 XML 응답을 xml2json으로 변환해 6개 핵심 지표를 안전하게 매핑했습니다.

발표 시각 연산 & XML 파싱
하늘 상태 연동 구름 생성

맑음/구름많음/흐림 값에 따라 구름 개수(1/5/10)와 생성 좌표를 동적 연산하고, flutter_animate의 무한 왕복 슬라이드를 적용했습니다.

시스템 구조

발표 시각 계산
초단기예보 발표 주기(매시 30분) 기준으로 호출할 시간대(현재/이전)를 동적으로 결정
공공데이터 API 호출
기상청 Open API에 실시간으로 요청
XML → JSON 변환
xml2json으로 중첩 XML 응답을 파싱해 6개 핵심 지표를 안전하게 매핑
화면 갱신
하늘 상태에 따라 구름 개수·좌표를 동적 생성하고, Wave·flutter_animate로 낮/밤 배경과 파도 효과 전환
자동 갱신 & 화면 유지
wakelock_plus로 화면 꺼짐을 방지하고 10분 주기로 자동 재호출, 실시간 시계로 탁상시계 모드 지원

개발 사항

  • 공공데이터포털 날씨 API를 연동해 실시간 기상 정보를 파싱 및 출력
  • Wave와 flutter_animate로 파도 효과 및 낮/밤 배경 전환 구현
  • wakelock_plus로 화면 꺼짐을 방지하고 10분 주기 자동 갱신 + 실시간 시계로 탁상시계 모드 지원
  • 단 4일 내에 API 신청·기획·개발을 진행하고 중간에 과감한 재디자인으로 완성도 향상

스크린샷

Public Data Weather App 스크린샷 Public Data Weather App 스크린샷
Soap & Cosmetic Calculator

Soap & Cosmetic Calculator

비누·화장품 제작에 필요한 재료 배합비를 알고리즘으로 자동 계산하고, 계산 결과를 기기에 영구 저장해 언제든 다시 불러볼 수 있게 만든 계산기 앱입니다.

GitHub Repo ↗
기간
2023.08.25 — 2023.10.05
역할
앱 기획 및 프로그래밍 전담
인원
1인 개발
Flutter Provider permission_handler File I/O

핵심 구현

재료 투입 산출 알고리즘

원료별 화학 반응 상수, 투입 용액 순도, 수분 희석 비율 등 다변수 배합 공식을 수학적으로 모델링해 목표 총중량에 맞는 최적 투입량을 정밀 산출합니다.

재료 투입 산출 알고리즘
디자인 시스템 & 컬러 팔레트

비누·화장품이라는 소재에 맞는 톤앤매너를 컬러 팔레트 선정부터 직접 설계하고, 카드형 레이아웃과 flutter_animate 트랜지션 같은 세부 인터랙션까지 다듬어 기획부터 구현까지 일관된 완성도를 추구했습니다.

시스템 구조

권한 확인
permission_handler로 기기 저장소 접근 권한을 확인·요청
재료 입력
오일·수산화나트륨(NaOH)·정제수 등 원료 수치를 UI에 입력
배합 계산
오일 대 잿물 비율, 검화값(Saponification), 적정 수분량을 UI와 분리된 비즈니스 로직에서 산출
로컬 저장
계산된 레시피를 File I/O로 서버 없이 오프라인 영구 저장
결과 표시
flutter_animate로 부드러운 전환과 함께 계산 결과를 확인

개발 사항

  • Google Play Store 공식 출시 및 실제 사용자 서비스 운영 경험 확보
  • MenuMng·PageMng·Mng·DataMng·OilMng·FileMng 등 6개 매니저 클래스를 ChangeNotifierProvider로 등록해 화면별 상태를 분리 관리
  • calculateLye()에서 오일별 중량 비율과 검화값(NaOH/KOH)을 누산한 뒤 순도·농도로 보정해 필요 잿물량을 산출
  • calculateWater()가 콜드(오일 중량 비율)·페이스트(잿물×3)·핫(잿물×1.5) 프로세스별로 서로 다른 공식을 적용해 수분량을 계산
  • calculateFat()으로 오일별 지방산 조성을 비율 가중 합산해 전체 배합의 지방산 프로필을 백분율로 정규화
  • UserData_Recipe/Beauty/Oil/Config 4개 카테고리 디렉토리로 나눠 .txt 파일로 로컬 저장, CSV 파일 가져오기도 지원

스크린샷

Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷 Soap & Cosmetic Calculator 스크린샷
Gaze Heatmap AI

Gaze Heatmap AI

업로드한 디자인 시안을 드래그 앤 드롭만으로 분석해, 사용자 시선이 몰리는 지점을 히트맵으로 시각화해주는 AI 기반 웹 서비스입니다.

GitHub Repo ↗
기간
2025.11.24 — 2025.12.15 (약 3주)
역할
프론트엔드 전담 및 백엔드 로직 일부 보조
인원
5인 팀 (대학교 P-학기 프로젝트)
Node.js EJS JavaScript HTML5 Canvas AI 연동
AI 활용 범위: 데이터베이스 구조 분석, Node.js 프로그래밍 보조, 프론트엔드 UI/UX 및 CSS 보조

핵심 구현

히트맵 오버레이 렌더링

AI가 분석한 시선 집중도 좌표를 HTML5 Canvas 위에 가우시안 블러·그라디언트 기반 히트맵으로 실시간 시각화하고, 이미지 해상도에 맞춘 반응형 캔버스 스케일링으로 정확도를 확보했습니다. 로컬 환경에는 DB 인프라가 갖춰져 있지 않아, 세션·DB 의존 로직을 걷어낸 별도 데모 서버를 구성해 업로드 → AI 분석 → 시각화로 이어지는 핵심 파이프라인만 독립적으로 검증했습니다.

CSS 변수 기반 테마 시스템

모든 컴포넌트가 --primary100, --background100 같은 시맨틱 CSS 변수만 참조하도록 스타일을 설계해, body에 클래스 하나만 바꿔도 색상 팔레트 5종과 라이트/다크 모드가 화면 전체에 동시에 반영되는 테마 시스템을 구축했습니다. 색상 선택 상태와 다크모드 여부, 시스템 다크모드 감지 결과를 하나의 값으로 합성해 hidden input에 동기화하고, 저장 시 서버로 전송해 다음 접속에도 유지되도록 만들었습니다.

시스템 구조

이미지 업로드
Multer로 파일을 수신해 /storage/uploads/{userId}/ 경로에 저장
DB 선기록
AI 분석을 실행하기 전에 파일 경로를 images 테이블에 먼저 기록
AI 프로세스 실행
child_process.spawn으로 ai_tracker.py를 실행, CUDA/NCCL GPU 환경 변수를 커스텀 설정
결과 파싱
Python 표준출력 JSON에서 히트맵·스캔패스 경로와 점수를 파싱
DB 갱신
analysis_results 테이블에 결과를 반영하고 상태를 "완료"로 변경
프론트 응답
원본·히트맵·스캔패스 경로와 점수를 JSON으로 반환해 Canvas에 시각화

개발 사항

  • Multer로 업로드된 이미지를 /storage/uploads/{userId}/ 경로에 저장하고, DB에 파일 경로를 먼저 기록한 뒤 AI 분석을 실행하는 /analyze 엔드포인트 구현
  • Node.js에서 child_process.spawn으로 Python 시선 예측 모델(ai_tracker.py)을 직접 실행하고, CUDA/NCCL GPU 환경 변수를 커스텀 설정해 연동
  • Python 프로세스의 표준출력 JSON(히트맵·스캔패스 경로, 점수)을 파싱해 images/analysis_results 테이블에 반영하고 상태를 "완료"로 갱신
  • 이미지를 드래그 앤 드롭으로 업로드하는 직관적인 EJS 기반 프론트엔드 구현
  • auth·dashboard·project·history·settings·admin 등 7개 라우터 모듈로 백엔드를 분리하고, 쿠키 파싱 → 세션 → i18n 순으로 미들웨어 체인 구성
  • 리소스가 부족했던 백엔드 팀장을 대신해 서버 라우팅 및 데이터 가공 로직을 자발적으로 지원

스크린샷

Gaze Heatmap AI 스크린샷 Gaze Heatmap AI 스크린샷 Gaze Heatmap AI 스크린샷 Gaze Heatmap AI 스크린샷 Gaze Heatmap AI 스크린샷 Gaze Heatmap AI 스크린샷
3D Modeling

3D Modeling

Blender의 Shape Keys로 눈·입·귀를 독립적으로 모핑시키고, 정교한 Weight Paint 작업으로 왜곡 없는 표정 연출까지 구현한 3D 캐릭터 모델 작업입니다. 캐릭터뿐 아니라 배트·공·포수 마스크 같은 소품과, 공을 잡을 때 포켓이 자연스럽게 오므라드는 포수 글러브 리깅까지 함께 제작했습니다.

GitHub Repo ↗
기간
캐릭터당 약 5일 소요
역할
3D 모델링(캐릭터·소품) · 리깅 및 텍스처링 전담
인원
1인 개발
Blender Photoshop CS6 Unity Skinned Mesh Renderer
AI 활용 범위: Varco / Gemini로 캐릭터 2D 이미지 생성, Blender 기능 사용법 안내, Shape Keys ↔ Unity 연동 스크립트 보조

핵심 구현

Shape Keys 표정 모핑

눈 깜빡임, 입 모양, 귀 움직임 등을 각각 독립적인 쉐이프 키로 분리 제작해, 각 표정 채널이 서로의 메쉬를 침범하지 않고 자연스럽게 블렌딩되는 모핑 시스템을 구축했습니다.

포수 글러브 리깅

손가락 구분 없이 뭉툭한 포수 글러브 메쉬에 포켓(웹)과 손목 경첩 부위만 별도 본으로 나누고 웨이트를 조절해, 공을 잡는 순간 포켓만 자연스럽게 오므라들고 손등 쪽 메쉬는 뒤틀리지 않도록 만들었습니다.

시스템 구조

레퍼런스 이미지 생성
생성형 AI로 캐릭터의 정면샷·측면샷 레퍼런스 이미지를 뽑아 모델링 기준으로 활용
모델링
레퍼런스 이미지를 기준으로 Blender에서 캐릭터 메쉬를 제작
리깅
뼈대(Armature)를 구성해 캐릭터 파츠별 움직임 제어를 준비
웨이트 조절
Weight Paint로 파츠별 가중치를 정밀 보정해 애니메이션 시 버텍스 왜곡을 방지
Shape Key 제작
눈·입·귀 등을 독립적인 쉐이프 키로 분리 제작해 자연스러운 표정 모핑을 구현
머테리얼 추가
텍스처·머테리얼을 적용해 캐릭터 모델을 최종 마무리

개발 사항

  • 생성형 AI로 모델링의 모티브가 되는 2D 원화 레퍼런스를 효율적으로 생성
  • 튜토리얼을 주도적으로 학습하며 응용 모델링 기법 터득 및 완성
  • Shape Keys와 부분 리깅으로 눈·입·귀 파츠를 독립적으로 세밀하게 제어
  • 다양하고 자연스러운 표정과 애니메이션 연출 구현

스크린샷

3D Modeling 스크린샷 3D Modeling 스크린샷 3D Modeling 스크린샷 3D Modeling 스크린샷 3D Modeling 스크린샷 3D Modeling 스크린샷 3D Modeling 스크린샷