유연하고 안정적인 구조를 설계하고, 항상 프로젝트에 어울리는 UI/UX를 고민하고 미세한 디테일을 놓치지 않으면서 성능까지 고려하여 하나의 작품을 만들기 위해 노력합니다.
개발 중 가상 머신 시스템이 손상되어 스냅샷으로도 복구를 하지 못하였을 때, 포기하지 않고 가상 디스크(.vmdk) 파일을 에디터로 열어 필요한 데이터를 복구했던 경헙이 있습니다.
낯선 API나 라이브러리를 만나도 핵심 사용법부터 빠르게 파악해서, 바로 프로젝트에 적용할 수 있는 수준까지 끌어올립니다.
지금 당장 필요한 기능만 보고 코드를 짜지 않습니다. 기능 단위를 나누고 최대한 의존성을 낮춰서, 다른 스크립트에서도 만들어둔 기능을 재활용할 수 있게 만듭니다.
총으로 오브젝트를 쐈을 때 재질별로 다른 사운드·파티클이 나타나도록 만들었고 어떤 오브젝트는 물리적으로 분리되게 구현했던 경험이 있습니다.
배트 접촉 순간의 속도·방향으로 포물선 궤적과 최종 낙구 지점을 연산. 투구/타구/포구 이벤트 주도권을 상태 플래그로 분리하고 공기 저항 감쇄 공식을 보정했습니다.
가장 인접한 수비수에게 포구 타겟을 할당하고, 나머지는 백업 커버 및 베이스 수비로 전환하는 지능형 수비 구조를 구현했습니다.
Ball의 상태 플래그(_aiThrows, _playerThrows, _isBattedBall)로 지금 공을 누가 제어 중인지 명확히 구분하고, 타구 시에만 공기 저항 감쇄 계수(0.35f)를 조건부로 적용해 투구 궤적과 다른 물리 거동을 구현BallProjectileCalculator에서 Rigidbody의 선형 속도·질량을 기반으로 포물선 궤적을 매 프레임 재계산하고, LineRenderer로 예측 낙구 지점까지 궤적을 시각화BaseballPlayer를 상속한 수비수가 타구 방향·낙구 지점을 분석해 가장 가까운 수비수에게 포구 타겟을 할당하고, 나머지는 FSM으로 베이스 커버·백업 상태로 전환AssignSpecialRole로 상황에 따라 수비 위치를 동적으로 재배정하고, 투수의 베이스 커버와 외야 백업 동선까지 자동으로 전환되도록 구현CountsProvider로 파울라인·스트라이크 존·플라이 아웃을 판정
저격총 3D 모델을 실린더·슬라이드·볼트 등 개별 파츠로 분리 모델링해, 슬라이드 가변저항 값에 따라 실린더 Z축이 실시간으로 움직이고 장전 시 탄피 배출(Pop Out)·재장전(Push In)이 순차 트리거되는 물리 기반 볼트 액션 메커니즘을 구현했습니다.
레이캐스트로 목표물 거리를 측정하고 중력과 바람 편차를 계산해 실시간 탄착 마커를 표시합니다. 스코프 줌 배율과 거리에 따라 마커 스케일을 자동 보정했습니다.
중앙 1, 상하좌우 4, 대각 4 등 9개 방향 벡터를 실시간 선형 결합해 3D 시야각을 수학적으로 형성했습니다. 레이어마스크로 유리 투과와 벽면 차폐를 분기 연산하고 인지 게이지를 누적해 발각 상태 머신을 제어했습니다.
본체와 드론 간 1인칭 시점 전환, 이동 속도에 따른 바퀴 회전 물리와 도약 점프를 구현했습니다. 배터리 방전 시 화면 노이즈와 REC 타임코드 UI, 보안문 홀딩 해킹 연출을 적용했습니다.
외부 플러그인 없이 SetPixel() / CopyTexture()로 구현. 플레이어 월드 좌표를 미니맵 텍스처 좌표로 실시간 변환하고 이동 경로 반경의 알파값을 0으로 뚫어 탐색한 지형을 밝힙니다.
남은 연소 시간에 따라 Light.range와 파티클 크기를 실시간 Lerp 감쇠시켜 긴장감을 부여하고, 맵 내 횃불 접촉 시 즉시 재충전되도록 구현했습니다.
배치한 블록을 Elements enum 명령어로 바꾸어 Dictionary<int, Elements>로 직렬화하고, index를 명령 포인터처럼 옮기며 한 줄씩 해석합니다. 반복 블록은 시작·종료 인덱스와 남은 횟수를 별도 리스트로 관리해 루프 재진입 시 포인터를 되감고, 조건 블록은 드롭다운으로 고른 상황을 트리거 충돌과 매칭해 분기합니다.
밤 챕터는 타일맵 머티리얼을 조명에 반응하는 셰이더로 교체하고 베이스 틴트를 거의 검정으로 낮춰, 배치한 Point·Spot Light가 비추는 곳만 길로 드러나도록 했습니다. 가로등 아이템을 밟으면 맵 전체 조명이 순차 점등됩니다.
격리된 브릿지 네트워크 환경에서 각 서비스의 의존성과 포트 포워딩을 관리하며 Docker Compose로 클라우드 네이티브 아키텍처를 구현했습니다.
세션 정합성을 위해 Redis 인메모리 세션 스토리지를 도입하고, HTTP 요청과 웹소켓 실시간 통신을 분리 라우팅해 트래픽 병목을 방지했습니다.
난이도마다 수를 정하는 방식이 다릅니다. 하 난이도는 무작위로 소환·공격하고, 중/상 난이도는 3~4수 앞까지 내다보는 Minimax 탐색으로 유불리를 점수화하되 잡을 수 있는 수부터 먼저 검토해(Alpha-Beta 가지치기) 계산을 더 깊이까지 확보합니다. 극악 난이도는 즉시 외통수가 나는 수를 우선 찾고, 없으면 후보 수마다 30번씩 무작위 진행을 시뮬레이션해(몬테카를로 롤아웃) 가장 유리한 수를 고릅니다.
메인 메뉴, 난이도 선택 카드, 장기판·손패·코스트를 보여주는 플레이 화면, 장군/외통수 알림 배너, 결과 통계를 보여주는 게임오버 모달까지 UI Canvas 없이 UI Toolkit(VisualElement·USS)만으로 코드 기반 구축했습니다. 기물 자체도 Painter2D로 직접 드로잉한 정8각형 커스텀 엘리먼트입니다.
IMoveRule 전략 패턴(King/Advisor/Elephant/Horse/Chariot/Cannon/Pawn)으로 장기 표준 행마법을 분리 구현하고, MoveRuleFactory로 조회HexagonElement)를 커스텀해 Canvas/Image 없이 Painter2D로 정8각형 기물과 이중 림 라인을 직접 렌더링, USS 커스텀 프로퍼티로 색상·두께 제어RewardedInterstitialAd)를 연동, .gitignore 처리된 로컬 시크릿 파일로 상용 키를 분리하고 에디터에서는 자체 제작한 광고 시뮬레이터 UI로 안전하게 테스트LocalizationManager)
card / usage / custom / config 4개 테이블로 구성된 관계형 스키마를 설계했습니다. cardID 기반으로 지출 내역을 연계하고 Batch 쿼리로 잔여 한도 갱신과 데이터 무결성을 안정적으로 유지합니다.
화면을 그리는 위젯과 데이터를 다루는 로직을 CreateUsageProvider, InfoMng, CustomMng 등 역할별 ChangeNotifier로 나눠 분리했습니다. 지출 입력 폼에서 값이 바뀌면 해당 Provider만 notifyListeners()를 호출하고, 그 값을 구독하는 미리보기 카드 위젯만 다시 그려집니다. 지출 내역을 추가·삭제할 때도 화면 전체를 다시 빌드하는 대신 구독 범위를 좁혀 관련된 위젯만 갱신되도록 최적화했습니다.
네이티브 영역에서 NotificationListenerService를 구현해 곡명·아티스트·앨범 아트워크 바이트를 추출하고, EventChannel 스트림으로 Flutter UI에 동기화했습니다.
미디어 정보·1초 주기 시계·5가지 무드 컬러 테마를 독립 Provider로 분리해 전체 화면 리빌드를 방지했습니다.
초단기예보 발표 주기(매시 30분)에 맞춰 현재 45분 미만이면 이전 시간대 API를 호출하는 동적 시각 계산 로직을 구현하고, 중첩 XML 응답을 xml2json으로 변환해 6개 핵심 지표를 안전하게 매핑했습니다.
맑음/구름많음/흐림 값에 따라 구름 개수(1/5/10)와 생성 좌표를 동적 연산하고, flutter_animate의 무한 왕복 슬라이드를 적용했습니다.
원료별 화학 반응 상수, 투입 용액 순도, 수분 희석 비율 등 다변수 배합 공식을 수학적으로 모델링해 목표 총중량에 맞는 최적 투입량을 정밀 산출합니다.
비누·화장품이라는 소재에 맞는 톤앤매너를 컬러 팔레트 선정부터 직접 설계하고, 카드형 레이아웃과 flutter_animate 트랜지션 같은 세부 인터랙션까지 다듬어 기획부터 구현까지 일관된 완성도를 추구했습니다.
MenuMng·PageMng·Mng·DataMng·OilMng·FileMng 등 6개 매니저 클래스를 ChangeNotifierProvider로 등록해 화면별 상태를 분리 관리calculateLye()에서 오일별 중량 비율과 검화값(NaOH/KOH)을 누산한 뒤 순도·농도로 보정해 필요 잿물량을 산출calculateWater()가 콜드(오일 중량 비율)·페이스트(잿물×3)·핫(잿물×1.5) 프로세스별로 서로 다른 공식을 적용해 수분량을 계산calculateFat()으로 오일별 지방산 조성을 비율 가중 합산해 전체 배합의 지방산 프로필을 백분율로 정규화
AI가 분석한 시선 집중도 좌표를 HTML5 Canvas 위에 가우시안 블러·그라디언트 기반 히트맵으로 실시간 시각화하고, 이미지 해상도에 맞춘 반응형 캔버스 스케일링으로 정확도를 확보했습니다. 로컬 환경에는 DB 인프라가 갖춰져 있지 않아, 세션·DB 의존 로직을 걷어낸 별도 데모 서버를 구성해 업로드 → AI 분석 → 시각화로 이어지는 핵심 파이프라인만 독립적으로 검증했습니다.
모든 컴포넌트가 --primary100, --background100 같은 시맨틱 CSS 변수만 참조하도록 스타일을 설계해, body에 클래스 하나만 바꿔도 색상 팔레트 5종과 라이트/다크 모드가 화면 전체에 동시에 반영되는 테마 시스템을 구축했습니다. 색상 선택 상태와 다크모드 여부, 시스템 다크모드 감지 결과를 하나의 값으로 합성해 hidden input에 동기화하고, 저장 시 서버로 전송해 다음 접속에도 유지되도록 만들었습니다.
/storage/uploads/{userId}/ 경로에 저장하고, DB에 파일 경로를 먼저 기록한 뒤 AI 분석을 실행하는 /analyze 엔드포인트 구현child_process.spawn으로 Python 시선 예측 모델(ai_tracker.py)을 직접 실행하고, CUDA/NCCL GPU 환경 변수를 커스텀 설정해 연동
눈 깜빡임, 입 모양, 귀 움직임 등을 각각 독립적인 쉐이프 키로 분리 제작해, 각 표정 채널이 서로의 메쉬를 침범하지 않고 자연스럽게 블렌딩되는 모핑 시스템을 구축했습니다.
손가락 구분 없이 뭉툭한 포수 글러브 메쉬에 포켓(웹)과 손목 경첩 부위만 별도 본으로 나누고 웨이트를 조절해, 공을 잡는 순간 포켓만 자연스럽게 오므라들고 손등 쪽 메쉬는 뒤틀리지 않도록 만들었습니다.