구직중
황성준Seongjoon Hwang
Portfolio / 2026

카메라·영상·3D부터 백엔드까지
두루 관심이 많습니다

황성준
Seongjoon Hwang

멀티카메라 동기 촬영 시스템과 3D Reconstruction 파이프라인을 만들었고, 최근에는 분산 시스템과 검색·추천 파이프라인을 만들었습니다. Kotlin·Unity·Rust처럼 처음 다루는 기술로도 만들어 왔습니다.

Projects

카드를 누르면 상세가 열립니다.

Now & Go — AI 여행 플래너

4인 팀 · 백엔드 공통 모듈 · 아키텍처 설계 2025.09 — 2026.03
검색 → 추천 → 대리결제를 잇는 여행 커머스 / Java · Spring Boot 3 · Python · Kafka · Redis · Elasticsearch
Role
백엔드 공통 모듈과 아키텍처 설계를 맡아 팀 전체 커밋의 약 46%를 담당했습니다. 아래 세 가지가 제가 직접 설계·구현한 축입니다.
73
Gradle Modules
15
공통 모듈
46%
팀 커밋 담당
88k
Java LOC
01 — Search & Recommendation

RAG 파이프라인

Problem
일반 LLM은 플랫폼의 최신 상품·실시간 재고를 알 수 없어 환각 위험이 큽니다. 대화 기억도 도구 호출도 필요 없는 우리 요구에는 LangChain이 오버스펙이고, 검색의 핵심이 카테고리 슬롯 보장이라 ES 쿼리 제어권을 포기할 수 없었습니다.
Solution
Haiku로 의도를 뽑고 → Titan으로 임베딩 → ES에서 슬롯 보장 + kNN·BM25 RRF로 후보를 만들고 → PostgreSQL에서 라이브 SKU를 붙인 뒤 → Sonnet이 계획을 생성하고 → 서버가 제약을 검증해 위반 시 재시도합니다.
Interactive — 단계를 눌러 파이프라인을 따라가 보세요
← → 키로도 이동
6
Pipeline Stages
2
Search Modes
3
Negation Layers
사진 2장
RAG 추천 화면 — 3개 여행 계획
01RAG 추천 화면 — 3개 여행 계획
파이프라인 설계 — 의도→검색→생성→검증
02파이프라인 설계 — 의도→검색→생성→검증
02 — Concurrency

분산락 & Outbox

Problem
PostgreSQL 직접 조회 방식은 동시 접속 시 같은 좌석 행에 락 경합이 걸리고 대기 트랜잭션이 쌓이며 커넥션 풀이 고갈됩니다. 결제까지 15분을 기다려야 하는데 그동안 DB 커넥션을 잡고 있을 수 없었습니다.
Solution
좌석 선점을 Redis로 옮기고 선점(15분 TTL) → 확정(10초 락) 2단계로 나눴습니다. 해제는 Lua로 소유자 확인과 삭제를 원자적으로 묶어 남의 락을 지우는 사고를 막았습니다.
Insight
이건 락이라기보다 예약 홀드입니다. TTL을 락 수행시간이 아니라 결제 세션 길이로 잡았기 때문에, 사용자가 결제를 포기해도 15분 뒤 좌석이 자동으로 풀립니다 — 만료 배치가 필요 없습니다.
  • 획득SET key uuid NX EX 900 한 커맨드로 원자적. SETNX 후 별도 EXPIRE는 그 사이 프로세스가 죽으면 TTL 없는 영구 락이 남습니다.
  • 해제 — GET으로 확인하고 DEL 하면 그 사이 TTL이 만료돼 남의 락을 지울 수 있어, Lua 스크립트로 확인과 삭제를 원자적으로 묶었습니다.
  • 확정 — 결제 콜백은 at-least-once라 중복이 옵니다. lock:confirm-seats:{orderNo}이중 확정을 차단했습니다.
  • Outbox — DB 커밋 후 Kafka 발행이 실패하면 이벤트가 유실됩니다. 트랜잭션 안에서 outbox에 적재하고 폴링 잡이 발행하도록 바꿔 8개 write-service에 일괄 적용했습니다.
  • 알려진 한계 — watchdog이 없어 TTL을 초과하는 작업은 상호배제가 깨질 수 있고, 단일 Redis 기준이라 RedLock은 아닙니다. 최종 방어선은 DB 유니크 제약이어야 합니다.
8
Services (Outbox)
0
Lost Events
2
Lock Stages
사진 2장
분산락 시퀀스 — SETNX 선점 · Lua unlock
01분산락 시퀀스 — SETNX 선점 · Lua unlock
Outbox 패턴 — 비즈니스 데이터와 이벤트를 한 트랜잭션에 함께 쓰고, 폴링 잡이 Kafka로 발행하며, 수신측은 event_id로 중복을 거른다
02Outbox — 이벤트를 같은 트랜잭션에 적재하고 폴러가 발행
상품 생성 다단계 트랜잭션 — 실패 시 앞 단계를 역순으로 되감는 보상 처리
03상품 생성 다단계 트랜잭션 · 실패 시 보상 처리

모바일 3D Gaussian Splatting 뷰어 · 에디터

창업 시도 · 단독Rust · wgpu · Flutter
데스크톱 전용 3DGS를 Apple 모바일 GPU에서 실시간 렌더 · 편집 · 내보내기
Problem
3DGS는 알파 블렌딩이라 그리는 순서가 곧 결과입니다. 그래서 표준 래스터라이저(SIBR/INRIA)는 매 프레임 수백만 스플랫을 카메라 깊이순으로 전역 정렬합니다 — 워크그룹끼리 서로를 기다릴 수 있는 데스크톱 NVIDIA를 전제로 한 설계입니다. Apple 모바일 GPU는 타일 기반 지연 렌더링(TBDR)이라 워크그룹 간 forward-progress가 보장되지 않습니다. 전역 정렬은 "다른 워크그룹이 반드시 진행한다"는 가정 위에서만 도는데, 그 가정 자체가 성립하지 않습니다.
Solution
정렬 알고리즘을 4번 이식해 전부 실패했습니다. 알고리즘을 바꿔도 결과가 똑같다는 것이 "느린 것"이 아니라 "구조적으로 못 도는 것"이라는 증거였습니다. 그래서 정렬을 워크그룹 밖으로 내보내지 않는 per-tile 로컬 정렬로 문제를 다시 정의했습니다. 화면을 타일로 쪼개고, 각 타일에 걸치는 스플랫만 워크그룹 로컬 메모리 안에서 정렬합니다. 워크그룹끼리 동기화할 일이 없으니 forward-progress 가정이 필요 없습니다.
정렬 이식 4회 — 실패 기록이 곧 근거
  • 1 · 단일 패스 radix sort — 워크그룹 간 prefix sum 교환 지점에서 GPU 정지
  • 2 · 멀티패스 분할 — 패스를 쪼개 동기화를 줄여도 같은 지점에서 정지
  • 3 · bitonic sort — 정렬 네트워크로 교체. 알고리즘이 달라도 결과 동일
  • 4 · CPU 정렬 폴백 — 돌긴 하나 전송 비용으로 프레임 예산 초과
4가지 접근이 같은 지점에서 똑같이 멈춘다는 것이, 튜닝으로 넘을 벽이 아니라 하드웨어 실행 모델의 제약임을 말해줬습니다. 이 판단을 근거로 알고리즘 최적화를 접고 문제 정의를 바꿨습니다.
그 밖의 렌더링 성능 작업
  • 제로카피 표시 경로 — wgpu(Metal) → IOSurface → Flutter Texture. GPU 텍스처를 CPU로 내렸다 올리지 않고 그대로 합성 레이어에 넘깁니다
  • 16바이트 정렬 어피니티 — 스플랫 속성을 GPU가 한 번에 읽는 크기로 묶어 메모리 접근 횟수를 줄임
  • 프레임 예산 기준의 판단 — 평균 fps가 아니라 프레임당 시간 상한을 기준으로 정렬·업로드·드로우 각 단계의 비용을 나눠서 봤습니다
사진 3장
인앱 캡처 — 3DGS 렌더 결과
01인앱 캡처 — 3DGS 렌더 결과
비파괴 편집 — 3D 박스 볼륨 선택
02비파괴 편집 — 3D 박스 볼륨 선택
SPZ 내보내기 · 10× 압축
03SPZ 내보내기 · 10× 압축
29fps
P50 @1.0× · 74만 splat
4M
Splats Renderable
0
Bridge Copy / Frame

메가커피 손흥민 AR 광고

RD101C++ · Python
얼굴용 8K 카메라 24대 스튜디오 · 전신용 라즈베리파이 100대 스튜디오 (별개 구성) · 3D Reconstruction
  • Raw(DNG) 취득 → ISP 전처리 — 디모자이킹 · 노이즈 리덕션 · 색공간 보정으로 센서 출력을 복원 가능한 영상으로 정제
  • 체커보드 intrinsic/extrinsic 캘리브레이션을 주기적으로 재수행 — 렌즈 왜곡 계수와 카메라 간 외부 파라미터를 갱신
  • 카메라 간 화이트 밸런스·색온도 편차 보정 — 색감이 어긋나면 스테레오 매칭이 실패합니다
  • 스테레오 매칭 기반 3D 복원 후 전경 분할로 AABB 재설정, 메쉬·텍스처 아틀라스 최적화
  • 얼굴은 8K 카메라 24대로 좁은 범위를 고밀도로, 전신은 라즈베리파이 100대로 넓은 범위를 커버 — 서로 다른 스튜디오입니다
  • 두 촬영본의 색·기하 편차를 각각 정합한 뒤 3D 복원에 투입
  • 본인 기여는 raw mesh 전달까지이며 이후 후처리 공정은 별도 담당자가 진행했습니다
사진 5장
얼굴 촬영 스튜디오 — 8K 카메라 24대
01얼굴 촬영 스튜디오 — 8K 카메라 24대
얼굴 스튜디오 결과물 — HumanRF 3D 복원
02얼굴 스튜디오 결과물 — HumanRF 3D 복원
전신 촬영 스튜디오 — 라즈베리파이 100대
03전신 촬영 스튜디오 — 라즈베리파이 100대
스테레오 매칭 3D 복원
04스테레오 매칭 3D 복원
메가커피 AR 납품 결과
05메가커피 AR 납품 결과
24
얼굴 · 8K 카메라
100
전신 · 라즈베리파이

실시간 가상 프로덕션

RD101Unreal · Calibration
크로마키 스튜디오 구축 · Unreal 기반 실시간 합성 솔루션 운영
  • 크로마키 스튜디오 구축과 카메라 캘리브레이션 담당
  • Unreal 기반 실시간 키잉·합성 파이프라인 운영
  • 드라마 「별들에게 물어봐」 촬영 현장 프리뷰에 활용
사진 2장
크로마키 스튜디오
01크로마키 스튜디오
카메라 캘리브레이션
02카메라 캘리브레이션

Galaxy S20 100대 동기 촬영 시스템

단독 개발FluxPlanet · Kotlin
멀티카메라 3D Reconstruction 스튜디오 / 카메라 앱 단독 개발 · 동기화 로직 설계
Problem
3D 복원 품질이 동기화 정밀도에 직결되는데, Android 기본 NTP와 외부 NTP 서버는 정밀도가 미달입니다. 외부 서버는 네트워크 홉이 추가되어 오차가 오히려 커집니다. GPS·하드웨어 플래시 싱크는 100대 규모에 비용·실현성이 맞지 않았습니다.
Solution
단말 1대를 로컬 NTP 서버로 지정해 나머지 99대가 동일 네트워크에서 직접 동기화하고, 남은 잔여 오차는 연사 2장으로 흡수했습니다. 첫 장은 오차만큼 익스포저를 열어 찍고 버립니다. 그러면 100대의 노출이 끝나는 시점이 같아지고, 이어 찍히는 두 번째 장이 실제로 싱크가 맞은 사진입니다. 타이머로 지연을 주면 OS 스케줄링 때문에 ms 단위 보장이 안 되지만 노출 시간은 센서가 직접 세는 값이라 정확합니다.
Interactive — 100대의 시각 오차가 어떻게 수렴하는지
격자 1칸 = 단말 1대 · 색이 진할수록 오차 큼
최대 편차
— ms
동기화 전 상태입니다. 시계가 제각각이라 셔터를 눌러도 순차로 터집니다.
사진 3장
100대 카메라 리그 어레이
01100대 카메라 리그 어레이
동기 촬영 스튜디오
02동기 촬영 스튜디오
S20 100대 전신 동기 촬영
03S20 100대 전신 동기 촬영
<1ms
Sync Error
100
Devices
0
Test Shots

Ferrit — 정보보안 3D 시각화

시큐그래프 · 단독C++ · C# · Unity
KT급 DNS 트래픽 실시간 3D 시각화 클라이언트
  • 목록이 길어질수록 느려지던 문제를 리스트 가상화로 해결 — 당시 UI 라이브러리에 해당 기능이 없어 직접 구현했습니다. 화면에 보이는 개수만큼만 UI를 만들어 재사용합니다
  • 동일 IP 텍스처 공유 캐싱으로 GPU 메모리 급증 해결
  • 소켓 스트림 수신 · PostgreSQL 커넥션 풀링 구조 설계
사진 3장
실시간 DNS 트래픽 플로우
01실시간 DNS 트래픽 플로우
3D 지구본 — 국가별 감염 근원지 추적
023D 지구본 — 국가별 감염 근원지 추적
악성 도메인 차단 콘솔 (C&C 선택 차단)
03악성 도메인 차단 콘솔 (C&C 선택 차단)

Career

2025.09 — 2026.03

클라우드 네이티브 개발자 양성 과정

메가존클라우드
모놀리식 → MSA · 4인 팀 프로젝트 Now & Go
  • DDD 도메인 분리 · CQRS · Outbox 이벤트 파이프라인 설계
  • 재사용 공통 모듈 15개 설계, RAG 검색·추천 직접 구현
  • Java/Spring · Kafka · Redis · Elasticsearch · Keycloak을 EKS에 배포
2024 — 2025

모바일 3DGS 뷰어·에디터

창업 시도 · 단독
Rust · wgpu · Metal · Flutter 전 계층 단독 구현
  • per-tile 로컬 정렬로 모바일 GPU 구조적 제약 돌파
  • MVP 완성까지 진행, 사업화에는 이르지 못함
2018.01 — 2023.12

선임 연구원

FluxPlanet · RD101
멀티카메라 동기 촬영 · Raw ISP · 3D Reconstruction 파이프라인 (C/C++/Python)
  • Raw(DNG) ISP 파이프라인 구축 — 디모자이킹 · 노이즈 리덕션 · 색공간 보정, 화이트 밸런스·색온도 보정
  • 카메라 100대 규모 intrinsic/extrinsic 캘리브레이션(체커보드) 주기 수행 — 렌즈 왜곡과 외부 파라미터 편차, 카메라 간 색감 차이가 3D 복원 품질에 직결됩니다
  • NeRF · Gaussian Splatting · HumanRF 기반 3D 복원
  • geometry · mesh · point cloud 처리, 메쉬·텍스처 아틀라스 최적화
  • 라즈베리파이 카메라 100대 + 8K Blackmagic 멀티카메라 촬영 시스템 구축·운영
  • Galaxy S20 100대 동기 촬영 시스템, 메가커피 손흥민 AR 광고 납품
  • 크로마키 기반 Unreal 실시간 합성 솔루션 운영
2017.04 — 2017.12

사원

테크윈
GStreamer 기반 CCTV 녹화 프로그램 개발
  • 카메라 영상 실시간 처리 파이프라인 경험
2015.12 — 2017.02

사원

시큐그래프
정보보안 시각화 솔루션 Ferrit — 데스크톱 클라이언트 단독 개발
  • C++ / C# / Unity 기반 실시간 소켓 수신 · 멀티스레딩 · 3D 렌더링 · 성능 최적화

Tools

Build · Test

GitGradle TDDJUnit MockitoTestcontainers pytestFlyway

Infra · Deploy

DockerKubernetes (EKS) HelmKustomize ArgoCDGitHub Actions Terraformkind LocalStackNginx AWS (EKS · S3 · Bedrock)

Observability · 협업

PrometheusGrafana LokiKibana FigmaDiscord TeamsJandi

Skills

Backend · Data

Java / Spring Boot 3Python / FastAPI Spring Cloud Gateway · WebFluxJPA KafkaRedis PostgreSQLDocker / K8s DDD · CQRSOutbox gRPC · FeignKeycloak · OAuth2 Resilience4j

AI · Search

ElasticsearchRAG Amazon BedrockTitan Embeddings Claude Haiku / SonnetkNN + BM25 RRF

Vision · 3D

C / C++Rust · wgpu · Metal Kotlin · AndroidC# · Unity FlutterUnreal Camera Calibration Raw(DNG) ISP디모자이킹 · 노이즈 리덕션 화이트밸런스 · 색보정Stereo Matching NeRFHumanRF 3D Gaussian Splattingmesh · point cloud 텍스처 아틀라스