구직중
황성준Seongjoon Hwang
Portfolio / 2026

카메라·영상·3D부터 백엔드까지
만들어 왔습니다

황성준
Seongjoon Hwang

카메라 100대로 사람을 찍어 3D로 복원하는 일을 했습니다. 클라우드 네이티브 백엔드도 할 수 있습니다.

Projects

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

Now & Go — AI 여행 플래너

4인 팀 · 백엔드 공통 모듈 · 아키텍처 설계 개발 약 1개월
검색 → 추천 → 대리결제를 잇는 여행 커머스 / Java · Spring Boot 3 · Python · Kafka · Redis · Elasticsearch
Role
백엔드 공통 모듈과 아키텍처 설계를 맡았습니다. 인증·이벤트·데이터소스 등 공통 모듈, 서비스 간 통신 구조, RAG 추천, 동시성 제어를 다뤘고, 그중 RAG 추천분산락 두 가지를 아래에 소개합니다.
01 — Search & Recommendation

RAG 파이프라인

Summary
“8월에 부산, 아이랑 느긋하게, 회는 빼고” 같은 문장을 넣으면 지금 실제로 예약 가능한 상품만 골라 3일치 여행 계획 3개를 만들어 줍니다.
Problem
ChatGPT 같은 일반 LLM은 우리 플랫폼에 그 상품이 실제로 있는지, 그날 자리가 남았는지를 모릅니다. 없는 상품을 추천하면 예약이 안 되니, LLM에게 답을 맡기지 않고 DB에서 먼저 찾아온 실제 상품만 근거로 주고 계획을 쓰게 했습니다. RAG라고 부르는 방식입니다. 대화 기억도 외부 도구 호출도 필요 없는 구조라 LangChain은 오버스펙이었고, 숙소·먹거리·놀거리가 각각 최소 몇 개씩은 꼭 담겨야 한다는 요구 때문에 검색 쿼리 제어권을 넘길 수 없었습니다.
Solution
Haiku가 문장에서 조건(지역·기간·동행·취향)을 뽑고 → Titan이 문장을 숫자 벡터로 바꾸고 → Elasticsearch가 뜻이 비슷한 상품(kNN)과 단어가 겹치는 상품(BM25)을 따로 찾아 순위를 합치면서(RRF) 카테고리별 최소 개수를 강제로 채우고 → PostgreSQL에서 그 날짜의 실제 재고·가격을 붙이고 → Sonnet이 이 후보만으로 계획을 쓰고 → 마지막에 서버가 규칙 위반을 직접 검사해, 어기면 이유를 알려주고 다시 쓰게 합니다.
Interactive — 단계를 눌러 파이프라인을 따라가 보세요
사진 2장
RAG 추천 화면 — 3개 여행 계획
01RAG 추천 화면 — 3개 여행 계획
파이프라인 설계 — 의도→검색→생성→검증
02파이프라인 설계 — 의도→검색→생성→검증
02 — Concurrency

분산락 & Outbox

Summary
같은 좌석을 두 사람이 동시에 눌러도 한 명만 잡히게 하고, 결제를 포기하면 15분 뒤 자동으로 풀립니다.
Problem
좌석 선점을 DB로 막으면 결제가 끝날 때까지 그 행을 붙잡고 있어야 합니다. 그런데 결제까지 15분이 걸립니다 — 동시 접속이 몰리면 같은 행을 기다리는 트랜잭션이 쌓이고(락 경합), DB 접속 슬롯이 바닥납니다(커넥션 풀 고갈).
Solution
좌석 잡기를 DB 밖 Redis로 옮기고, 선점(15분 뒤 자동 만료) → 결제 확정(10초) 2단계로 나눴습니다. 풀 때는 ‘내가 잡은 게 맞는지 확인’과 ‘삭제’를 쪼갤 수 없는 한 덩어리로(Lua) 처리해, 남의 좌석을 실수로 푸는 사고를 막았습니다.
Insight
락이라기보다 예약 홀드에 가깝습니다. 만료 시간을 작업이 걸리는 시간이 아니라 결제에 주는 시간으로 잡았습니다.
  • 획득SET key uuid NX EX 900 ‘좌석 잡기’와 ‘15분 뒤 만료 설정’을 한 명령으로 처리합니다. 둘로 나눠 쓰면 그 틈에 서버가 죽었을 때 영원히 안 풀리는 좌석이 남습니다.
  • 해제 — ‘내 것인지 확인’과 ‘삭제’를 따로 하면 그 틈에 만료가 지나 남이 새로 잡은 좌석을 지워버릴 수 있습니다. 둘을 쪼갤 수 없는 한 덩어리로(Lua) 묶었습니다.
  • 확정 — 결제 콜백은 같은 요청이 두 번 이상 올 수 있습니다(재시도 때문에). 주문번호로 잠금을 걸어 이중 확정을 차단했습니다 (lock:confirm-seats:{orderNo}).
  • Outbox — DB 저장은 됐는데 알림 이벤트 발행이 실패하면 이벤트만 사라집니다. 이벤트를 같은 트랜잭션 안에 함께 저장해두고 별도 작업이 꺼내 발행하도록 바꿔, 쓰기 서비스 8개에 일괄 적용했습니다.
  • 알려진 한계 — 작업이 15분을 넘기면 만료가 먼저 와서 상호배제가 깨질 수 있고 (연장해주는 장치를 두지 않았습니다), Redis 한 대 기준이라 RedLock이 아닙니다. 그래서 마지막 방어선은 DB의 유니크 제약입니다 — 앞이 다 뚫려도 같은 좌석 두 줄은 DB가 거부합니다(uk_sku_seat).
15분
좌석 자동 해제
8개 서비스
Outbox 적용
사진 2장
분산락 시퀀스 — SETNX 선점 · Lua unlock
01분산락 시퀀스 — SETNX 선점 · Lua unlock
Outbox 패턴 — 비즈니스 데이터와 이벤트를 한 트랜잭션에 함께 쓰고, 폴링 잡이 Kafka로 발행하며, 수신측은 event_id로 중복을 거른다
02Outbox — 이벤트를 같은 트랜잭션에 적재하고 폴러가 발행
상품 생성 다단계 트랜잭션 — 실패 시 앞 단계를 역순으로 되감는 보상 처리
03상품 생성 다단계 트랜잭션 · 실패 시 보상 처리

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

창업 시도Rust · wgpu · Flutter
데스크톱 전용 3DGS를 Apple 모바일 GPU에서 실시간 렌더 · 편집 · 내보내기
Summary
3D Gaussian Splatting은 스캔한 공간을 반투명한 점 수백만 개로 그리는 방식입니다. PC 그래픽카드 전용이었는데, 아이폰에서 실시간으로 돌게 했습니다.
Problem
이 방식은 반투명한 점들을 먼 것부터 가까운 것 순서로 겹쳐 그립니다. 순서가 틀리면 그림도 틀립니다. 표준 구현(SIBR/INRIA)은 매 프레임 수백만 개를 카메라와의 거리순으로 한 번에 통째로 정렬합니다. 이 정렬은 GPU 작업 단위(워크그룹)끼리 서로의 중간 결과를 기다리는 구조입니다. 기다리는 상대가 반드시 실행된다는 전제가 필요한데, 그 전제(forward progress)는 Vulkan·WebGPU 규격 어디에도 없습니다. 데스크톱에서는 동시에 올라가는 작업 단위가 많아 교착이 잘 안 생깁니다. Apple 모바일 GPU는 동시에 올릴 수 있는 수가 적어, 자리를 쥔 것들끼리 서로를 기다리다 멈춥니다.
Solution
전역 정렬을 네 가지 방식으로 시도했는데 전부 실패했습니다. 그래서 화면을 16×16 픽셀짜리 타일 8천여 개로 쪼개고, 각 타일에 걸치는 점만 그 타일 담당 작업 단위 안에서 정렬하게 했습니다. 작업 단위끼리 주고받을 게 없으니 앞의 전제도 안 걸립니다.
전역 정렬 4회 실패
  • 1 · decoupled look-back radix — 표준 방식. 기다리다 멈춤(스톨)
  • 2 · 직렬 스캔 — 작업 단위를 1개로. 응답 없음(hang)
  • 3 · 병렬 멀티패스 스캔 — 직접 구현. 줄무늬로 깨짐(race)
  • 4 · 검증된 오픈소스 이식kishimisu/WebGPU-Radix-Sort. 프레임이 완성되지 않음
전역 정렬을 포기하고 타일 안에서만 정렬하게 바꿨습니다. 4번에서 안 됐던 라이브러리를 그대로 썼는데 이번엔 돌았습니다.
그 밖의 렌더링 · 브리지 작업
  • 복사 없이 화면에 띄우기 — GPU가 그린 결과를 CPU 메모리로 내렸다 다시 올리지 않고, 같은 메모리를 Flutter 화면이 그대로 읽게 연결했습니다 (wgpu/Metal → IOSurface → Flutter Texture)
  • 실기에서만 나던 크래시 — Metal은 이미지 한 줄의 바이트 수(stride)가 16의 배수여야 합니다. iPhone 17의 화면 폭 1206px는 한 줄이 4824바이트라 16으로 안 떨어져 터졌습니다. 한 줄 길이를 다음 16의 배수인 4832바이트로 올려(남는 8바이트는 여백) 해결
  • 프레임 시간 상한으로 판단 — 평균 fps는 순간적인 끊김을 숨깁니다. 한 프레임에 쓸 수 있는 시간 상한을 정해두고, 정렬·업로드·그리기가 각각 얼마를 먹는지 나눠서 봤습니다
사진 3장
인앱 캡처 — 3DGS 렌더 결과
01인앱 캡처 — 3DGS 렌더 결과
비파괴 편집 — 3D 박스 볼륨 선택
02비파괴 편집 — 3D 박스 볼륨 선택
SPZ 내보내기 · 10× 압축
03SPZ 내보내기 · 10× 압축
29fps
아이폰 실기 · 74만 점 (중앙값)
0회
프레임당 메모리 복사

메가커피 손흥민 AR 광고

RD101C++ · Python
얼굴용 8K 카메라 24대 스튜디오 · 전신용 라즈베리파이 100대 스튜디오 (별개 구성) · 3D Reconstruction
  • 카메라 센서 원본(Raw)부터 직접 처리 — 색을 채우고(디모자이킹) 노이즈를 걷어내고 색공간을 맞춰 3D 복원에 쓸 영상으로 만들었습니다
  • 카메라 위치·렌즈 특성 재측정(캘리브레이션)을 주기적으로 수행 — 체커보드를 찍어 렌즈 왜곡과 카메라별 위치·각도 값을 갱신합니다. 리그가 조금씩 틀어지기 때문입니다
  • 카메라 간 색감 편차 보정(화이트 밸런스·색온도) — 같은 지점이 카메라마다 다른 색으로 찍히면 어느 픽셀이 같은 지점인지 못 찾아 3D 복원이 실패합니다
  • 얼굴은 8K 카메라 24대로 좁은 범위를 고밀도로, 전신은 라즈베리파이 100대로 넓은 범위를 커버
  • 두 촬영본의 색·기하 편차를 각각 정합한 뒤 3D 복원에 투입
  • 본인 기여는 다듬기 전 3D 메쉬 전달까지이며, 이후 후처리 공정은 별도 담당자가 진행했습니다
사진 5장
얼굴 촬영 스튜디오 — 8K 카메라 24대
01얼굴 촬영 스튜디오 — 8K 카메라 24대
얼굴 스튜디오 결과물 — HumanRF 3D 복원
02얼굴 스튜디오 결과물 — HumanRF 3D 복원
전신 촬영 스튜디오 — 라즈베리파이 100대
03전신 촬영 스튜디오 — 라즈베리파이 100대
스테레오 매칭 3D 복원
04스테레오 매칭 3D 복원
메가커피 AR 납품 결과
05메가커피 AR 납품 결과

실시간 가상 프로덕션

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

Galaxy S20 100대 동기 촬영 시스템

단독 개발FluxPlanet · Kotlin
멀티카메라 3D Reconstruction 스튜디오 / 카메라 앱 단독 개발 · 동기화 로직 설계
Summary
휴대폰 100대의 셔터를 1000분의 1초 안에 동시에 터뜨리는 앱입니다. 움직이는 사람을 100방향에서 같은 찰나에 찍어야 3D로 복원됩니다.
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
100대 간 촬영 시각 오차 (실측)

Ferrit — 정보보안 3D 시각화

시큐그래프C++ · C# · Unity
KT급 DNS 트래픽 실시간 3D 시각화 클라이언트
  • 목록이 길어질수록 느려지던 문제를 리스트 가상화로 해결 — 당시 UI 라이브러리에 해당 기능이 없어 직접 구현했습니다. 화면에 보이는 개수만큼만 UI를 만들어 재사용합니다
  • 화면의 삼각형 하나가 IP 하나입니다. 같은 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) 설계
  • 인증·이벤트·데이터소스 등 재사용 공통 모듈 설계, RAG 검색·추천 직접 구현
  • Java/Spring · Kafka · Redis · Elasticsearch · Keycloak을 EKS에 배포
2024 — 2025

모바일 3DGS 뷰어·에디터

창업 시도
Rust · wgpu · Metal · Flutter
  • 화면을 타일로 쪼개 타일 안에서만 정렬하는 방식으로 모바일 GPU 구조적 제약 돌파
  • MVP 완성까지 진행, 사업화에는 이르지 못함
2018.01 — 2023.12

선임 연구원

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

사원

테크윈
GStreamer 기반 CCTV 영상 프로그램 개발
  • GStreamer 파이프라인 구성 · 실시간 영상 수신·표시
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 ISP디모자이킹 · 노이즈 리덕션 화이트밸런스 · 색보정Stereo Matching NeRFHumanRF 3D Gaussian Splattingmesh · point cloud 텍스처 아틀라스