김준섭Java Backend Developer
금융 SI 4개 프로젝트(ING·NH 농협·KDB·메리츠증권)에서 레거시 전환, 운영 안정화, 배치 검증을 수행했습니다. 형상관리가 없는 시스템은 디컴파일로, SVN 환경은 Git+Jenkins로 바꿔왔고, 지금은 자택 홈랩 위에서 qwer4.org 포털·블로그·AI 서비스를 직접 운영하며 개발 이후를 계속 검증합니다.
Profile
나는 이런 개발자입니다
- 레거시를 두려워하지 않습니다. 형상관리가 없던 AML 시스템을 디컴파일로 분석해 TO-BE 전환 작업을 수행했고, ING 프로젝트에서는 SVN 기반 운영 환경을 Git + Jenkins CI/CD로 전환했습니다.
- 개발만 하고 끝내지 않습니다. 홈랩과 공개 포털을 직접 운영하며 배포·인증서 교체·인프라 페일오버까지 경험합니다. 서비스가 죽으면 직접 고쳐야 하는 환경이 최고의 운영 훈련입니다.
- 팀 자산을 만드는 문서화를 합니다. Jira 보드 세팅, Confluence 운영 가이드, Git 형상관리 문서를 정리하며 신규 인원이 빠르게 온보딩할 수 있는 기준을 만들었습니다.
Strength
핵심 강점
- 레거시 전환 리스크 관리 — 형상관리 없는 시스템도 디컴파일 분석으로 변경 범위를 파악하고, SVN→Git 전환과 CI/CD 도입으로 ING 프로젝트 배포 시간을 약 70% 단축했습니다.
- 금융 도메인 4건 이상 — 수출입 금융(ING), 시장리스크(NH), 글로벌 뱅킹 예산·경비(KDB, 130개 프로그램), AML(메리츠, 일 130~150만 건 배치)을 직접 담당했습니다.
- 운영까지 책임지는 개발 — WildFly 인증서 교체, JDK 업그레이드, SSO 장애 분석, JEUS 포팅을 포함한 운영 이슈를 개발 외 역할로 수행했습니다.
- 공개 검증 가능한 결과물 — qwer4.org 포털, blog.qwer4.org, ai.qwer4.org를 자체 하이퍼바이저·ZTA Tunnel·nginx로 직접 운영 중입니다. 페일오버 테스트 전 항목 PASS.
Timeline
커리어 타임라인
메리츠증권 AML 재구축
Oracle to PostgreSQL 전환, JEUS 포팅, CDD 공통 모듈화, 배치 검증 업무를 수행하고 있습니다.
산업은행 글로벌 뱅킹
경영지원 예산, 경비 도메인 130개 프로그램을 담당하며 대규모 금융 SI를 경험했습니다.
사내 표준화 기여
Jira, Confluence, Git, SKYLark UI 문서와 템플릿을 정리하며 협업 기준 정리에 참여했습니다.
ING 유지보수와 운영 대응
개발, 배포, 인증서, JDK, SSO, 취약점 대응까지 함께 맡으며 운영 감각을 키웠습니다.
NH 농협은행 시장리스크
F1 컨설팅과 협업하며 WebSquare 보고서와 SKYLark 설정 화면, 배치 운영을 경험했습니다.
아이엠비씨스템 입사
금융 SI 웹 개발 경력을 시작하며 Java 기반 프로젝트에 본격적으로 투입됐습니다.
Selected Work
대표 경험
메리츠증권 AML 재구축
산업은행 글로벌 뱅킹 재구축
사내 개발 표준화 및 문서 체계 개선
- 주간보고 양식과 이슈 흐름 기준을 정리해 협업 방식의 일관성을 높였습니다.
- Git, 개발환경, UI 관련 문서를 작성하거나 정리하며 신규 인원 온보딩에 기여했습니다.
- 시스템 관리자 문서와 인수인계 문서를 정리해 문서 이원화 방지에 참여했습니다.
ING 은행 수출입 금융 시스템
NH 농협은행 시장리스크 시스템 구축
- 시장리스크 업무 흐름을 이해한 상태에서 신규 화면 개발과 유지보수를 수행했습니다.
- 설정 화면과 보고서 화면이 다른 기술 스택으로 구성된 환경을 경험했습니다.
- 배치 운영 지원과 배포 대응을 함께 수행했습니다.
Trouble Shooting
실제로 겪고 해결한 문제들
이력서에는 나오지 않는, 실제 운영 환경에서 마주친 문제와 분석 과정입니다.
ING — 운영
WildFly 인증서 만료 → SSO 간헐적 실패
특정 사용자만 간헐적으로 SSO 로그인 실패. 에러 로그에는 "Connection reset" 외에 단서가 없었음.
서버 간 TLS 핸드셰이크 실패임을 확인 → WildFly 키스토어 인증서 만료 발견.
인증서 재발급 및 키스토어 교체, UAT·운영·백업 서버 순차 적용 후 세션 정책 재확인.
"간헐적"이라는 증상은 인증서 만료 초기에 나타나는 패턴임을 이후 유사 사례에 활용했음.
HomeLab — 인프라
ZTA Tunnel 이중 연결 → 인증 API 404 간헐적 발생
qwer4.org 포털 로그인 API가 외부에서 간헐적으로 404. 내부에서는 정상.
두 노드에서 동일 Tunnel ID로 ZTA 에이전트가 실행 중임을 확인 → 터널이 round-robin으로 트래픽을 분배. 미러 노드의 nginx에 /api/auth/ 블록이 누락돼 있었음.
미러 노드 nginx에 /api/auth/ proxy 블록 추가, auth-api bind를 모든 인터페이스로 변경해 양쪽 모두 정상 처리.
로그를 어느 노드에서 봐야 하는지를 먼저 확정해야 한다는 걸 확인했음.
메리츠 — 레거시
형상관리 없는 레거시 분석 → 디컴파일 기반 비교
기존 AML 5.0 시스템에 형상관리(VCS)가 없고, 운영 서버 클래스 파일만 존재.
운영 .class를 디컴파일 후 TO-BE 코드와 diff 비교. 변경 범위와 누락 로직을 직접 추적.
기간계 연계 화면 개발, CDD 공통 모듈화 작업에 기존 로직 손실 없이 반영.
코드가 없는 게 아니라 "찾는 방법이 다를 뿐"이라는 관점이 생겼음.
HomeLab — 배포
portal-vue 배포 후 Blank Screen
빌드 후 배포 완료 메시지가 났지만 브라우저에서 흰 화면만 표시.
JS 번들 파일 크기 확인 → 원본 대비 크기가 매우 작음 → base64 echo 방식의 plink 명령어 길이 제한으로 파일 잘림 확인.
tar + 청크 방식 배포 스크립트로 전환. 이후 배포 검증 절차(파일 크기 확인)를 표준화.
"배포 성공"과 "서비스 정상"은 다른 체크포인트임을 확인했음.
ING — 레거시
NULL 조회 결과 무방비 접근 → 운영 NPE 노출
사용자가 잘못된 날짜 값 입력 후 조회 시 화면에 NPE 에러만 표시. 에러 단서 없음.
selectOne 결과가 null인 상태에서 .get() 메서드를 null 체크 없이 직접 호출. 레거시 코드 전반에 유사 패턴 다수 존재.
BusinessException으로 null 케이스 처리, 메시지 코드를 통해 사용자 친화적 안내 추가. 동일 패턴 구간 일괄 검수.
JVM 예외가 화면에 그대로 노출되면 디버깅도 사용자 경험도 모두 나빠진다는 걸 확인했음.
ING — WAS
WildFly 피크 타임 응답 지연 → JVM 힙 리사이징 반복
업무 피크 타임 이후 WAS 응답이 간헐적으로 느려짐. OOM 로그 없어 원인 불명.
WAS 로그에서 Full GC 발생 빈도 확인 → 초기 힙(-Xms)과 최대 힙(-Xmx)이 달라 힙 리사이징이 반복 발생.
-Xms와 -Xmx를 동일 값으로 통일, MetaspaceSize 상한 추가. Full GC 빈도 급감.
"느려졌다"는 증상에서 GC 로그까지 계층별 지표를 함께 봐야 원인을 찾을 수 있다는 것을 확인했음.
메리츠 — DB 전환
Oracle → PostgreSQL 마이그레이션 중 전용 함수 불일치
Oracle에서 정상 동작하던 쿼리가 PostgreSQL 전환 후 오류 발생. 배치 처리 중 다수 실패.
Oracle 전용 함수(NVL, DECODE, TO_DATE 포맷)가 PostgreSQL에서 미지원. AML 5.0 쿼리 전반에 혼재.
PostgreSQL 동등 함수로 매핑(NVL→COALESCE, DECODE→CASE WHEN). 배치 쿼리 270여 건 순차 검수 및 수정.
DBMS 전환은 접속정보 변경이 아니라 함수 체계·NULL 처리·날짜 포맷 전체를 재검증해야 하는 작업임을 확인했음.
Growth
교육과 성장
Bootcamp
항해99 백엔드 부트캠프 수료
2025년 7월 5일부터 2025년 9월 13일까지 항해99 백엔드 부트캠프에 참여했습니다. GitHub 공개 저장소 기준으로
hhplus-tdd-java, study-learn-spring-posts, hhplus-e-commerce-spring에
포인트 과제, Spring Boot 기반 게시판과 JWT 인증, 이커머스 서버 구조 학습 내용을 정리했습니다.
Course
클라우드환경 (SaaS) 솔루션 전환과정
2023.09, 위블 교육을 통해 자사 솔루션에 적용하기 위한 Docker 기반 클라우드 전환과 SaaS 운영 관점을 학습했습니다. 실무에 바로 연결할 수 있는 배포와 운영 변경 포인트를 정리하는 데 초점을 맞췄습니다.
Course
Docker 기본 / 클라우드기반 Docker 활용
2022.04, 구트아카데미 교육을 통해 웹 애플리케이션 배포, 유지보수, 네트워크 구축에 필요한 Docker 기본기를 학습했습니다. 이후 홈랩과 실무 운영 경험으로 연결해 컨테이너 관점을 확장했습니다.
Course
빅데이터 분석 & Java 개발자 과정
2021.06부터 2021.12까지 에이콘아카데미에서 HTML, CSS, JavaScript, JSP, Spring, Database, Python, 웹 크롤링, 데이터 분석, 머신러닝, 딥러닝까지 폭넓게 학습하며 개발 전환의 기반을 만들었습니다.
Backend
Web Stack
Data
Database / Middleware
Infra
Self-hosted Platform
HomeLab / Public Platform
이 사이트는 어떤 구조로 만들어져있나요?
지금 보고 있는 이 포트폴리오 사이트는 제가 직접 구성한 홈랩 위에서 운영되고 있습니다. 상용 클라우드 없이, 자택 물리 서버 → 하이퍼바이저 → 서비스 컨테이너 → 리버스 프록시 → ZTA Tunnel 경로로 공개됩니다.
공개 포털 스택
qwer4.org
- Vanilla HTML/CSS/JS — 프레임워크 없이 직접 구성. 로딩 속도 최우선
- nginx (엣지 노드 + 미러 노드) — 이중화 구성, 한쪽 장애 시 ZTA Tunnel 자동 페일오버
- Python HTTP 서버 — 방명록 API, 인증 API, 유지보수 API를 단일 호스트로 운영
- ZTA Tunnel + Zero Trust Access — 포트 개방 없이 공개, 관리용 서브도메인은 GitHub OAuth 보호
어드민 패널 스택
admin.qwer4.org
- Vue 3 + Tailwind v4 SPA — 관리자 대시보드. Vite 빌드 후 nginx 정적 서빙
- Kotlin/Spring Boot — 서비스 제어 API. 각 컨테이너/VM 상태 조작
- LibreNMS — 네트워크·서버 모니터링 + 알림
- JWT 기반 포털 인증 — 회원가입 시 영상·AI 서비스 계정 자동 프로비저닝
블로그 스택
blog.qwer4.org
- Quartz v4.5.2 + Node 22 — Obsidian 노트를 마크다운 정적 사이트로 빌드
- Obsidian → Git push → rebuild.sh — 글 발행 파이프라인. SSH 원격 빌드
- CDN — JS/CSS 에셋 캐싱, 이미지 최적화
- 커스텀 CSS (custom.scss) — 다크 테마, 폰트, 레이아웃 직접 구성
AI 서비스 스택
ai.qwer4.org
- vLLM + 로컬 LLM 모델 — GPU 서버 위에서 로컬 추론. GPU 메모리 관리 직접 튜닝
- Open WebUI — 웹 프론트엔드. 포털 계정과 SSO 연동
- Discord Bot — 서버 제어, 블로그 동기화, 홈랩 모니터링 에이전트
- Anki 대시보드 — 학습 데이터 시각화 + AI 카드 자동 생성
기술 선택의 이유 — 단계별로 어떻게 접근했나요?
인프라 철학
왜 클라우드 대신 자체 서버를 구축했나요?
클라우드는 트래픽이 없는 개인 프로젝트에도 비용이 지속 발생합니다. 더 중요한 이유는, 인프라 문제를 서비스 제공자가 추상화해주지 않는 환경이 실력을 만든다는 확신입니다. 배포 실패, 인증서 만료, 네트워크 장애를 직접 디버깅해야 하는 환경이 운영 감각을 키웁니다. 이 경험이 현업 레거시 전환 작업에서 시스템을 빠르게 파악하고 운영 이슈에 대응하는 능력으로 연결됐습니다.
컨테이너 설계
왜 LXC 컨테이너로 서비스를 격리했나요?
장애 격리가 핵심 이유입니다. 하나의 서비스가 메모리를 과다 사용하거나 런타임 오류가 발생해도 다른 서비스에 영향을 주지 않습니다. 각 컨테이너의 OS·런타임 환경을 독립적으로 관리할 수 있어 업그레이드·포팅 리스크도 줄어듭니다. 메리츠 AML 프로젝트에서 레거시 포팅 작업을 담당하면서 "환경 격리"의 중요성을 체감한 것이 설계 배경입니다.
가용성 설계
왜 로드밸런서 없이 이중화 구성을 했나요?
ZTA Tunnel의 자체 라운드로빈 기능을 이용한 고가용성 설계입니다. 별도 로드밸런서를 추가하면 장애점이 오히려 늘어납니다. 두 엔드포인트가 동일한 nginx 설정을 유지하는 한, 한쪽이 다운되어도 터널이 자동으로 나머지 노드로 트래픽을 보냅니다. 실제 페일오버 테스트에서 전 항목 PASS를 확인했습니다.
프론트엔드 선택
왜 공개 포털은 Vanilla JS, 어드민은 Vue 3인가요?
공개 포털(qwer4.org)은 로딩 속도가 최우선이라 프레임워크 없이 구성했습니다. 반면 어드민 대시보드는 실시간 상태, 서비스 제어, 조건부 렌더링이 많아 반응형 데이터 바인딩이 필요합니다. 코드가 복잡해질수록 유지보수 비용 차이가 크게 납니다. 목적에 맞게 스택을 구분하는 것이 프레임워크를 맹목적으로 따르는 것보다 낫다고 판단했습니다.
SSO 설계
왜 OAuth/OIDC 표준 대신 직접 SSO를 구현했나요?
현재 규모에서 OAuth/OIDC 구현은 오버엔지니어링입니다. 포털 JWT를 발급하고 각 서비스의 브릿지 페이지에서 토큰을 주입하는 방식으로 실제로 작동하는 SSO를 구축했습니다. 토큰 전달 방식의 보안 트레이드오프를 이해하고 적용한 점이 중요하며, 표준 프로토콜이 필요한 시점(멀티 도메인, 외부 IdP 연동)에 전환할 수 있는 구조로 설계했습니다.
블로그 선택
왜 Quartz를 블로그로 선택했나요?
평소 Obsidian을 메모 도구로 사용하고 있어, 별도 CMS 없이 마크다운 파일이 그대로 블로그가 되는
파이프라인이 필요했습니다. Quartz는 Obsidian 링크 문법을 그대로 지원하고 정적 빌드로 빠릅니다.
WordPress나 Ghost처럼 DB를 요구하지 않아 운영 부담이 없고,
글 발행이 git push → rebuild.sh 한 줄로 끝납니다.
언어 선택
왜 Java와 Kotlin을 선택했나요?
실무는 Java 기반 레거시 SI가 중심이라 Java에 익숙합니다. 홈랩 신규 서비스는 Kotlin/Spring Boot로 구성했는데, Java와 100% 상호운용되면서도 null safety, data class, extension function으로 코드가 훨씬 간결해집니다. 기존 Java 지식을 버리지 않으면서 더 나은 코드를 쓸 수 있는 언어라는 점이 선택 이유입니다. 기술 선택 시 "팀의 기존 자산을 활용할 수 있는가"를 먼저 봅니다.
코드 패턴
홈랩 서비스 코드 구조는 어떻게 잡았나요?
홈랩 백엔드(Ktor/Spring Boot)는 Controller–Service–Repository 3계층을 기본으로 했습니다. 혼자 개발하는 환경이라 패턴 자체보다 "3개월 후 내가 다시 읽을 수 있는가"를 기준으로 설계했습니다. 배포 스크립트는 멱등성(idempotent)을 원칙으로 작성해, 반복 실행해도 결과가 같도록 했습니다. 서비스 간 직접 호출 대신 nginx 라우팅을 경유하도록 해 서비스 IP가 바뀌어도 다른 코드를 수정하지 않아도 됩니다.
테스트 전략
홈랩에서 테스트는 어떻게 했나요?
단위 테스트 코드보다 실 환경 검증을 우선했습니다. 배포 후 curl로 HTTP 상태 코드와 응답 크기를 확인하고, JS 번들 파일 크기를 원본과 비교하는 검증 절차를 표준화했습니다. 고가용성 테스트는 기본 노드를 강제로 내린 상태에서 외부 접속이 미러 노드로 자동 전환되는지 전 항목 확인했습니다. "테스트 환경"과 "운영 환경"을 분리하지 않고, 운영 자체가 테스트 환경입니다.
서비스 설계
홈랩 서비스 설계 시 가장 먼저 고려한 것은?
보안 경계를 먼저 정했습니다. 서버 포트를 외부에 직접 열지 않고 ZTA Tunnel을 경유하도록 설계했고, 관리 도메인(admin.qwer4.org)은 CF Access로 외부 인증 게이트를 추가했습니다. 그 다음은 장애 격리입니다. 각 서비스를 별도 LXC에 배치해 한 서비스 장애가 다른 서비스로 전파되지 않도록 했습니다. 새 서비스를 추가할 때는 배포·nginx·Tunnel·모니터링 등록·대시보드 카드를 체크리스트로 순서대로 처리합니다.
CI/CD
홈랩 배포 파이프라인은 어떻게 구성했나요?
별도 CI 서버 없이 역할별 배포 스크립트로 구성했습니다. 블로그는 Obsidian → git push → rebuild.sh 하나로 발행이 완료됩니다. 어드민 포털은 Vite 빌드 후 tar+청크 방식으로 전송해 plink 명령어 길이 제한 문제를 피하고, 배포 후 파일 크기 검증까지 자동화했습니다. Jenkins나 GitHub Actions를 쓰지 않은 이유는 단일 개발자 환경에서 오버헤드가 이점보다 크기 때문입니다. 대신 스크립트 자체를 검증 가능하고 반복 실행 가능한 형태로 유지합니다.
아키텍처 설계
홈랩 아키텍처는 어떤 순서로 설계했나요?
네트워크 경계를 먼저 그렸습니다. VLAN 설계로 서비스(VLAN 20)·IoT(VLAN 10)·게스트(VLAN 30)·NAS(VLAN 40)를 분리한 뒤, 그 위에 서비스를 하나씩 올렸습니다. 서비스별 IP·포트·도메인·인증 방식을 서비스 맵으로 관리해, 어느 서비스가 어떤 경로로 공개되는지 항상 파악할 수 있게 했습니다. IaC(Terraform/Ansible)로 Proxmox VM/LXC 생성을 코드화해 재현 가능한 인프라를 유지합니다.
홈랩 구축 과정
하드웨어 구성은 어떤 기준으로 결정했나요?
하이퍼바이저를 먼저 선택했습니다. 오픈소스 제품을 선택한 이유는 커뮤니티가 크고 무료라 롤백과 스냅샷이 쉬웠습니다. 네트워크 장비(라우터 + VLAN 지원 L3 스위치)는 네트워크 세그멘테이션이 목적이었고, 로컬 GPU는 vLLM 로컬 AI 추론을 위해 포함했습니다. 스토리지는 RAID 기반 NAS를 하이퍼바이저와 분리해, 서버 장애 시에도 데이터가 보존되도록 설계했습니다.
서비스 운영
홈랩 운영 중 문제를 어떻게 추적하나요?
엣지 노드의 cron이 매 1분마다 전 서비스를 폴링해 health.json을 갱신하고, 어드민 대시보드에서 실시간 상태를 확인합니다. LibreNMS는 SNMP 기반으로 스위치·라우터·서버 전체 트래픽을 모니터링합니다. 장애가 발생하면 "어느 노드에서 요청이 처리됐는가"를 먼저 확인합니다. 동일 ZTA Tunnel에 두 노드가 연결돼 있어 로그를 볼 대상이 달라질 수 있기 때문입니다. 기본 노드 업그레이드나 점검 시에는 미러 노드만 남겨두면 서비스를 내리지 않고 작업할 수 있습니다.
Public Proof
공개 링크
Portfolio
Public Portfolio
채용 담당자가 빠르게 읽을 수 있도록 경력 요약과 프로젝트를 정리한 공개 포트폴리오입니다.
Portal
HomeLab Portal
직접 운영 중인 공개 포털입니다. 개인 서비스와 링크 허브의 역할을 합니다.
Blog
Tech Writing
Obsidian 기반으로 운영 중인 기술 블로그입니다. 실무와 홈랩 기록을 남기고 있습니다.
GitHub
Code & History
개인 프로젝트 코드와 개발 흔적을 확인할 수 있는 저장소입니다.
Contact
면접 또는 협업 문의는 아래로 연락해 주세요.