Software Engineer

Backend & Infrastructure Engineer

Java / Spring Boot 기반 백엔드 설계부터 k3s 온프레미스 인프라 운영, AI 데이터 파이프라인 구축까지 — 아이디어를 프로덕션으로 연결합니다.


01

기술 스택

Backend
Java 21Spring Boot Spring Data JPAQueryDSL Spring SecurityJWTRedisFlyway
Database
PostgreSQLMySQLRedisH2PostGIS
DevOps / Infra
DockerKubernetes (k3s) GitHub Actionsingress-nginxcert-manager ProxmoxOPNsenseWireGuardCloudflare TunnelVeleroMinIONAS
AI / Data
Python 3.12asyncio Whisper (STT)OllamaKhoj / RAG
Monitoring
GrafanaPrometheus LokiTempoOpenTelemetry

02

역량 기술서

01
백엔드 설계 및 개발 역량
Java 21 + Spring Boot로 RESTful API 서버를 설계할 때, 도메인을 프레임워크로부터 독립시키는 것을 우선합니다. 헥사고날 아키텍처로 Domain 레이어에서 의존성을 걷어내고 UseCase와 Port 인터페이스를 분리해, DB 없이 Mock만으로 비즈니스 로직을 검증하는 테스트 구조를 만듭니다. QueryDSL 타입 안전 쿼리, DTO 계층 분리, Optimistic Lock 동시성 제어, 크레딧 교환 같은 도메인 규칙을 상황에 맞게 조합합니다.
02
인증 및 보안 시스템 구축
인증·보안을 웹/앱 멀티 플랫폼 관점에서 설계합니다. Spring Security 위에 JWT·Redis 세션과 OAuth2 소셜 로그인을 얹되, 토큰 교체의 원자성과 브루트포스 방어처럼 '공격받는 지점'을 먼저 고려합니다. 관리자 formLogin 브루트포스 lockout, IDOR 방지 인가 검증, PWA 콜드스타트 시 refresh 실패를 로그아웃으로 오인하지 않는 세션 유지까지 — 로그인 성공을 넘어 오남용·엣지케이스를 막는 것을 인증의 범위로 봅니다.
03
성능 최적화 경험
'느리다'를 추측이 아니라 측정으로 접근합니다. 병목을 먼저 계측하고 공간 인덱스·캐시·비동기 처리 중 원인에 맞는 도구를 고른 뒤, 개선 전후를 수치로 검증합니다. 위치 기반 조회부터 파일 업로드, 대규모 크롤링과 LLM 추론까지 각기 다른 병목을 실제 서비스 지표로 끌어올린 경험이 있습니다.
04
DevOps 및 인프라 운영
아이디어를 실제 운영 환경까지 직접 연결합니다. 개인 서버를 Proxmox + OPNsense로 재설계해 서비스·관리·스토리지를 VLAN으로 분리하고, 관리 인터페이스는 WireGuard 뒤로·사용자 서비스는 Cloudflare Tunnel로 포트 개방 없이 노출합니다. 그 위 k3s 클러스터에 Deployment·PVC·Ingress·Health Probe 매니페스트를 직접 작성하고, cert-manager SSL 자동화와 함께 push 한 번으로 테스트→빌드→배포가 도는 CI/CD·이미지 태깅 기반 즉시 롤백을 갖췄습니다.
05
관측성(Observability) 및 운영 자동화
운영은 '보이지 않으면 고칠 수 없다'는 전제로 접근합니다. Prometheus·Loki·Tempo로 메트릭·로그·트레이스를 한 스택에 묶어 장애를 추적 가능하게 만들고, Alertmanager·Uptime Kuma로 감지 체계를 세웁니다. DB Dump에 그치지 않고 장애 시 클러스터 상태 복구까지 고려해 etcd Snapshot·Velero 다계층 백업을 스크립트·스케줄러로 자동화했습니다.
06
AI · 데이터 파이프라인 & RAG 운영
비구조 데이터를 서비스가 바로 쓸 수 있는 구조화 데이터로 바꾸고, 그 지식을 검색 가능하게 운영합니다. STT·크롤링으로 원천을 모아 LLM으로 JSON을 자동 파싱하되 대규모·장시간 작업에서 '중단돼도 이어서 도는' 안정성(체크포인트·원자적 저장·자동 재시작)을 함께 설계합니다. 로컬 LLM RAG 지식 베이스에서는 Frontmatter 스키마·pre-commit 검증으로 데이터 정합성을 지키고, recall@5를 실측해 불필요한 하이브리드 검색 구현을 걷어내는 등 검색 품질을 근거로 판단합니다.

03

프로젝트

TimeManager
2024.11 ~ 2025.03 · 팀 프로젝트(모바일 앱 프로젝트 통합) · 백엔드/인프라 담당
Spring BootQueryDSL Vue 3PostgreSQL
기존 타이머 앱은 단일 항목만 측정할 수 있어 "Study > Develop > Java" 같은 세분화된 활동 시간을 함께 관리하기 어려웠습니다. 계층 구조 기반 타이머를 설계해 카테고리별 시간을 시각화하고, 오프라인·크로스 디바이스 환경에서도 기록이 끊기지 않는 PWA 기반 웹 서비스를 개발했습니다.
주요 기여
헥사고날 아키텍처: 비즈니스 로직이 인프라 구현에 의존해 테스트·기능 추가가 어려웠던 문제를 UseCase 중심 구조로 도메인과 인프라를 분리해 개선
인증 & 인가: JWT + HttpOnly Cookie 기반 인증과 Google OAuth 2.0 로그인 구현. 클라이언트 전달 ID를 신뢰할 때 발생할 수 있는 IDOR 취약점을 막기 위해 로그인 사용자-리소스 소유자 검증 로직 추가
동시성 제어: 여러 디바이스에서 동일 데이터를 동시 수정할 때 발생하는 Lost Update를 JPA Optimistic Lock 기반 충돌 감지로 방지
CI/CD: 수동 배포 실수를 방지하기 위해 GitHub Actions로 테스트·Docker 이미지 생성·ghcr.io 배포 자동화
SnapGuide
2025.06 ~ 2025.10 · 개인 프로젝트
Spring BootSpring Security DockerGitHub Actions PostGISRedis
"여기서 어떻게 찍었어?"라는 경험에서 시작한 프로젝트. 사진 촬영 방법과 위치 정보를 공유하고 현재 위치 기반으로 주변 촬영 가이드를 탐색하는 웹 & PWA 서비스. EXIF 메타데이터를 자동 추출해 촬영 위치·카메라 설정 입력 과정을 줄였고, PostGIS 기반 공간 검색으로 근처 가이드를 빠르게 조회합니다.
주요 기여
미디어 파이프라인: Java 기본 ImageIO는 HEIC를 다루지 못해, iOS 업로드 지원을 위해 im4java + Apache Tika 기반 처리 파이프라인 구축. Magic Byte로 파일 타입 검증 후 HEIC → JPEG 자동 변환
중복 파싱 제거: EXIF·카메라 모델·GPS 추출이 각자 독립적으로 이미지를 재파싱해 1장당 3회 중복 발생하던 것을 발견, 파싱을 1회로 통합해 결과를 하위 로직에 공유하도록 개선
N+1 해결: 가이드 목록 조회 시 연관 엔티티 Lazy Loading으로 N+1 발생. QueryDSL DTO Projection을 검토했으나 미디어·썸네일까지 조립해야 해 fetch join으로 해결
CI/CD & 부하테스트: GitHub Actions로 배포 자동화. 위치 검색·이미지 업로드 기능을 k6 기반 부하 테스트로 검증
Ovlo — 교환학생 커뮤니티 플랫폼
2025.11 ~ 2026.02 · 개인 프로젝트
Java 21Spring Boot Hexagonal Archk3s GitHub ActionsGrafana Stack
교환학생 과정에서 대학 정보·생활 팁·현지 커뮤니티·중고 거래 정보가 여러 플랫폼에 분산돼 있어 겪은 불편함에서 시작한 프로젝트. 교환학생들이 해외 생활 정보를 공유하고 주변 학생들과 소통할 수 있는 커뮤니티 플랫폼을 헥사고날 아키텍처로 설계·구현했습니다.
백엔드 아키텍처
헥사고날 아키텍처: 유지보수성·확장성을 위해 Port·UseCase 기반으로 비즈니스 로직과 인프라 의존성 분리. Domain에서 프레임워크 의존성을 제거해 DB 없이 Mock만으로 단위 테스트 가능
좋아요 동시성 — 충돌 제거 설계: 반응을 (post_id, member_id) 복합 PK의 회원 1행 idempotent upsert로 처리해 서로 다른 회원 간 충돌 자체를 제거. 공유되는 좋아요 수만 DB 원자 증감(like_count = like_count + delta)으로 갱신해 낙관적 락·애플리케이션 재시도 없이 정확히 수렴
Redis 멀티 세션 인증: 기기별 독립 세션(세션 Hash + 회원별 세션 인덱스)으로 여러 디바이스에서 로그인 상태를 각각 유지. Refresh Token Rotation에 Redis WATCH/MULTI/EXEC 기반 CAS(낙관적 락)를 적용해 토큰 교체·세션 갱신을 원자적으로 처리하고, Refresh Token은 평문 대신 SHA-256 해시로만 저장
스토리지 추상화: StoragePort로 Local → S3 무중단 교체 설계. HEIC → JPEG 자동 변환
인프라 & 운영
배포되는 k3s 클러스터·네트워크 분리·관측성 스택은 Infra 프로젝트에서 별도로 정리했습니다.
교환학생 정보 수집 AI 데이터 파이프라인
2026.01 ~ 2026.03 · 개인 프로젝트 · Ovlo 연동
Python 3.12asyncio WhisperOllama / qwen3 PlaywrightSQLAlchemy
Ovlo에 필요한 대학별 교환학생 정보를 제공하기 위해 전 세계 대학 정보를 자동 수집·분석하는 다국어 데이터 파이프라인. 영상 기반 후기를 STT로 텍스트화한 뒤 LLM으로 구조화하고, 정적/JS 렌더링 페이지를 함께 처리하는 크롤링 구조를 결합해 총 2,835개 영상 중 실패·중복을 제외한 2,247개의 교환학생 레코드를 생성했습니다.
주요 기여
다국어 수집 구조: 8개 언어·25개 검색 템플릿 기반 자동 수집. 정형 규칙으로는 자유 서술형 후기를 못 뽑아, LLM으로 비정형 텍스트를 구조화 JSON으로 변환하는 후처리 흐름을 구성
운영 연속성: API 쿼터 초과 시 초기화 시점에 자동 재개하는 스케줄러 적용, API 불가 시 웹 크롤링 대체 경로로 자동 전환
자원 모니터링: GPU 장시간 추론 중 잦은 재부팅 문제를 psutil·nvidia-smi 기반 모니터링으로 완화. VRAM·CPU·네트워크 상태에 따라 작업 시점 조정
LLM 최적화: qwen3:14b → qwen3:8b 교체로 VRAM 절감 + 6배 향상 (4분 → 39초)
안정성: Playwright wait_for()로 무한 행 해결, JSONL 체크포인트+Atomic 저장으로 크래시 후 이어서 처리, Watchdog byte offset 추적으로 OOM 허위 감지 114회 문제 해결
ToneBridge — 언어 교정 플랫폼
2026.05 ~ 2026.07 · 개인 프로젝트
Java 21Spring Boot Hexagonal ArchMinIOPWA
AI 첨삭 서비스는 빠르고 즉각적이지만 뉘앙스·정확도를 완전히 신뢰하긴 어렵고, 지역 방언은 배울 곳이 마땅치 않습니다. 교환학생 시절 서로에게 "언어를 가르쳐 줘"라는 상황을 자주 겪었지만 막상 자국어를 어떻게 가르쳐야 할지 막막했던 경험에서, 사람들이 서로의 언어를 교정해줄 수 있는 플랫폼을 만들었습니다.
주요 기여
크레딧 교환 도메인: 불특정 다수의 첨삭 기여를 위해 "크레딧 교환" 규칙을 각 유스케이스에 맞게 설계
Presigned URL 업로드: 음성 첨삭 파일을 클라이언트가 MinIO에 직접 업로드하고 백엔드는 권한만 관장하도록 해 트래픽 병목 개선
Infra — 홈랩 온프레미스 플랫폼
지속 구축·운영 중 · 개인 프로젝트
ProxmoxOPNsense k3sWireGuard Cloudflare TunnelPrometheus/Loki/Tempo Velero
실제 서비스 운영 환경을 학습하기 위해 기존 평면망 홈 네트워크를 Proxmox + OPNsense 기반 인프라로 재설계하고, 그 위에 k3s 플랫폼을 구축했습니다. 서비스·관리·스토리지 영역을 VLAN으로 분리하고 VPN·모니터링·백업·CI/CD를 통합해 운영 환경과 유사한 플랫폼을 직접 설계·운영합니다.
네트워크 및 보안
VLAN 망 분리: Proxmox 위 OPNsense로 서비스·관리·스토리지 네트워크 분리, 모든 VLAN 간 통신이 방화벽 정책을 거치도록 구성
관리 인터페이스 비노출: 관리 페이지는 WireGuard 뒤로, 외부 사용자 서비스는 포트 개방 없이 Cloudflare Tunnel로 제공. WAN 인바운드는 VPN 포트만 허용
플랫폼 운영
k3s 전환: 서버 성능을 고려해 경량 k3s 클러스터 구축. 초기 Docker Compose를 검토했으나 자동 복구·확장성을 고려해 쿠버네티스로 전환
CI/CD & DDNS: GitHub Actions로 커밋 SHA 기반 이미지 태깅·자동 배포. 동적 IP 환경은 DDNS로 해결
관측성 및 복구
통합 관측성: Prometheus·Loki·Tempo로 메트릭·로그·트레이스 통합 수집. Alertmanager + Uptime Kuma로 장애 감지 체계 구축
다계층 백업: 초기 DB Dump만 수행하다가, 장애 시 k8s 리소스·클러스터 상태 복구까지 필요하다 판단해 etcd Snapshot + Velero 기반 백업 전략 설계. NAS 백업 영역 접근 정책 분리
LLM Wiki — 로컬 RAG 지식 베이스
지속 운영 중 · 개인 프로젝트
Ollama / KhojRAG ObsidianPre-commit Hooks
로컬 LLM 기반 RAG 지식 베이스를 구축하고 검색 품질·데이터 정합성을 검증하며 운영한 지식 관리 프로젝트. 프로젝트 수행 중 발생한 문제 해결 과정, 아키텍처 결정 이유, 운영 경험을 재사용 가능한 지식으로 관리합니다.
주요 기여
Frontmatter 스키마: 문서마다 형식이 달라 출처·질문 정보가 누락되던 문제를, 모든 노트의 출처·검증 상태·질문 집합을 동일 구조로 관리하는 스키마로 해결
Source of Truth 검증: pre-commit 훅으로 코드·문서 간 불일치를 커밋 단계에서 확인, SoT 레지스트리 기준으로 stale 값이 문서에 남는 것을 방지
재발 방지 규칙화: 244개 노트에서 반복적으로 마주친 오류·취약점 중 68개를 재발 방지 규칙으로 추출, 그중 심각도가 높은 49개를 모든 코딩 세션 시작 시 시스템 프롬프트에 자동 주입(2026.07 기준)