반복되는 큰 흐름은 고정하고, 바뀌는 정책만 제어하는 구조를 선호합니다
프레임워크 내부를 파고들어 기술적 빈 틈을 메우는 것과, 비즈니스 복잡도를 구조화하여 오래 유지되는 시스템을 설계하는 것 — 두 방향 모두 좋아합니다.
주로 Kotlin + Spring 기반의 백엔드를 설계하고, 필요에 따라 프론트엔드(React/Next.js), 인프라, 운영 자동화까지 함께 다룹니다.
반복되는 업무나 도메인 로직은 라이브러리·SDK·플랫폼 모듈로 추상화하고, 바뀌는 정책은 외부에서 안전하게 확장할 수 있는 구조를 만드는 데 관심이 많습니다.
Backend
- Kotlin, Spring Boot 4.0
- JPA / Hibernate Reactive, PostgreSQL, Liquibase
- Kotlin Coroutines, Kafka
- Kotlin JDSL, Hexagonal Architecture, DDD
Frontend
- TypeScript, React 19, Next.js 15+
- Vite, TanStack Query, Zustand
- shadcn/ui, Tailwind CSS
Test / Infra
- Kotest, MockK, ArchUnit, Testcontainers
- Playwright
- Docker, Docker Compose
- Kubernetes/K3s, GitOps
Open Source · Image Optimization Tool / Multiplatform Library
이미지 최적화에 Google Squoosh를 즐겨 썼지만, CLI가 Node.js 업데이트 이후 깨진 채로 유지보수가 중단되었습니다. 터미널에서 변환·압축·리사이즈까지 한 번에 해결하는 도구로 시작해, Rust core 기반 CLI와 Desktop GUI, Kotlin/JVM·Python 바인딩까지 제공하는 멀티플랫폼 라이브러리로 확장했습니다.
- MozJPEG, OxiPNG, ravif, libjxl 등 고성능 코덱 기반
- JPEG, PNG, WebP, AVIF, QOI, JPEG XL 지원
- CLI(
convert,optimize,resize,crop,extend) — 배치 처리 + 병렬 실행 - Desktop GUI 제공 — 터미널 작업과 GUI 기반 단일 이미지 작업 모두 지원
- Kotlin/JVM 바인딩 — UniFFI + JNA 기반, fluent API(
SlimgImage) 제공, Maven Central 배포 - Python 바인딩 — maturin 기반 네이티브 휠, PyPI 배포
- macOS(Apple Silicon/Intel), Linux(x86_64/ARM64), Windows(x86_64) 크로스플랫폼
Side Project · Self-hosted Database Snapshot Platform
"지난달 말에 이 데이터가 어떻게 되어 있었어?" — 운영 중에 이런 질문을 받을 때마다 pg_dump를 복원해서 확인하는 과정이 번거로웠습니다. DB 테이블을 주기적으로 Parquet 파일로 스냅샷하고, 백업 복원 없이 DuckDB로 바로 SQL 조회할 수 있는 셀프 호스팅 도구를 직접 만들었습니다.
- PostgreSQL, MySQL 데이터소스에서 테이블 단위 스냅샷을 Apache Parquet로 캡처
- DuckDB 기반 SQL 쿼리 엔진 — 스냅샷을 복원 없이 즉시 조회·조인·집계
- 두 스냅샷 간 row-level diff 비교 — 추가·삭제·변경된 행을 색상으로 구분
- Cron 기반 자동 스냅샷 + 일별/월별 보관 정책으로 스토리지 자동 관리
- StorageProvider 추상화로 Local / S3-compatible / SMB-NAS 스토리지 확장 가능
Open Source · Kotlin Coroutine Repository Library
Kotlin Coroutines + JPA 조합으로 개인 서비스를 만들다가, 여러 엔티티에 걸친 트랜잭션을 코루틴 컨텍스트에서 안정적으로 처리할 수 없는 한계에 부딪혔습니다. Reactive 스택으로 전환하고 싶었지만, Spring Data JPA의 메서드 네이밍 쿼리(findByNameAndStatus 등)를 포기하기 아쉬워서 — Hibernate Reactive 위에서 그대로 쓸 수 있게 직접 만든 라이브러리입니다.
- PartTree 기반 동적 쿼리 생성 — Spring Data 메서드 네이밍 규칙 호환
suspend기반 Coroutine Repository API 제공- 코루틴 트랜잭션 통합 — Vert.x context, Hibernate Reactive session, CoroutineContext 전파 문제 해결
- Spring Boot 3.x & 4.0 멀티버전 지원
- Maven Central 배포
🔗 hibernate-reactive-coroutines on GitHub
Open Source · Type-safe Excel Generation / Parsing Library
실무에서 Apache POI로 Excel을 다루다 보면 스타일링, 수식, 조건부 컬럼 처리에서 코드가 급격히 복잡해집니다. 특히 사용자 권한에 따라 노출 컬럼이 달라지는 요구사항이 반복되면서, 컬럼을 선언하기만 하면 나머지는 알아서 처리되는 구조가 필요했습니다.
// 컬럼을 선언하기만 하면 Excel 시트 완성
sheet.column("이름") { it.user.name }
sheet.column("부서") { it.user.department }
sheet.column("연락처") { it.user.phone ?: "-" }
// 권한에 따라 노출 컬럼을 분기
if (context.isAdmin) {
sheet.column("급여") { it.salary }
}- 단순한 케이스는 어노테이션(
@Column)으로, 복잡한 케이스는 DSL(excel { })로 처리 - 동일한 정의로 Excel 생성과 파싱 양방향 지원
- 선언적 스타일링 —
@HeaderStyle,@ConditionalStyle, HEX 색상, 사전 정의 테마 - 수식, 조건부 스타일, header group, freeze pane, auto filter 지원
- SXSSF 기반 streaming으로 대용량 Excel 처리 지원
Open Source · Gradle Plugin / Developer Tooling
Bun을 전역 설치하지 않아도 Gradle 빌드 안에서 프로젝트별 버전을 고정하고 자동 다운로드할 수 있도록 만든 Gradle 플러그인입니다. 프론트엔드 빌드가 포함된 JVM 프로젝트에서 “로컬에 Bun이 설치되어 있어야만 빌드되는 문제”를 줄이기 위해 만들었습니다.
- Bun binary 자동 다운로드 및 버전 고정
- Gradle Configuration Cache 호환
- Incremental Build 지원
BunTask,BunxTask,BunInstallTask제공- macOS, Linux, Windows x64/arm64 지원
Company projects are described in a de-identified way, focusing on architecture, responsibilities, and technical contributions rather than product or repository names.
Professional Work · Private
여러 고객사 사업에서 반복되던 인증, 사용자, 상담, 강의, 게시판, 파일, 알림, SMS, 리포트 생성 등의 기능을 모듈형 SDK로 표준화했습니다. 공통 도메인 로직은 프레임워크와 인프라에서 분리하고, 고객사별 정책은 SDK 외부에서 확장할 수 있도록 설계했습니다.
- Multi-module SDK로 반복 도메인을 조합 가능한 플랫폼 모듈로 구성
- Hexagonal Architecture + DDD 기반 도메인/인프라 분리
- 고객사별 정책을 SDK 수정 없이 override/extension 할 수 있는 구조
- 이벤트 기반 모듈 간 통신으로 직접 의존 최소화
- Excel/report generation, SMS, user sync, consulting/course/board/file 등 반복 도메인 모듈화
- 테스트 가능한 순수 도메인 모델과 Spring/JPA adapter 계층 분리
Private repository
Professional Work · Private
AI를 활용한 교육 도메인 서비스를 설계하고 구현했습니다. Kotlin/Spring Boot 기반 백엔드와 React/Vite 기반 프론트엔드를 함께 다루며, LLM 호출, SSE 스트리밍, 결과 스냅샷 영속화, E2E/a11y 테스트까지 end-to-end로 구성했습니다.
- LLM API 호출 및 결과 스냅샷 저장
- SSE 기반 실시간 진행 상태 스트리밍
- 외부 API 호출 구간과 DB transaction 구간 분리
prepare → external call → persist흐름으로 connection leak 방지- Playwright 기반 E2E 테스트 및 접근성 검증
Private repository
Professional Work · Private
사내 공통 SDK 위에서 구현된 여러 사업 애플리케이션의 운영 데이터를 Kafka 기반 이벤트 흐름으로 수집하고, 중앙 백오피스에서 통합 조회·관리할 수 있는 구조를 개발했습니다.
- 여러 사업 애플리케이션에서 발생하는 운영 데이터를 Kafka로 통합
- 학생, 상담, 강의, 미팅, 출석 등 도메인 데이터를 중앙 백오피스에서 조회·관리
- Liquibase 기반 schema evolution 관리
- Kotlin JDSL 기반 type-safe query로 통합 조회 모델 구성
- Testcontainers 기반 통합 테스트 환경 구성
Private repository
Professional Work · Private
서비스와 인프라 리소스를 GitOps 방식으로 관리하는 운영 환경을 구성했습니다. 배포 manifest를 코드처럼 리뷰·추적하고, 애플리케이션 버전과 운영 설정 변경 이력을 Git 중심으로 관리하는 흐름을 만들었습니다.
- 서비스별 Kubernetes manifest 구조화
- 애플리케이션 버전과 운영 설정 변경 이력의 Git 기반 추적
- 반복 배포 작업을 선언형 manifest 변경으로 표준화
- 서비스/인프라 변경을 리뷰 가능한 단위로 분리
Private repository
Professional Work · Private
외부 SaaS API에서 대용량 파일 메타데이터를 수집하고, worker pipeline을 통해 NAS에 자동 백업하는 시스템을 구축했습니다. 수집, 다운로드, 상태 관리 책임을 분리하고 Kafka 메시징으로 두 agent를 연결했습니다.
- Collector / Downloader agent 분리
- 외부 SaaS API 연동 및 파일 메타데이터 수집
- Kafka 기반 download request / response pipeline
- NAS/SMB 저장소 연동
- 상태 DB 기반 백업 진행 상태 관리
- 백업 완료 후 원본 정리 자동화
Private repository
-
레거시 시스템 현대화
PHP/그누보드 기반 시스템을 Java/Spring + React 기반 API 서버/클라이언트 구조로 전환했습니다. -
운영 자동화
데이터 마이그레이션, 통계 집계, 외부 API 연동 등 반복 업무를 스크립트와 배치 작업으로 자동화했습니다. -
도메인 모듈화와 정책 확장 구조 설계
반복되는 비즈니스 기능은 공통 모듈로 고정하고, 고객사·사업별로 달라지는 정책은 외부에서 확장할 수 있도록 분리하는 구조를 선호합니다.




