연구원 · 백엔드개발팀
2023.08 – 재직 중
유아·초등 독서 학습 서비스 웅진북클럽(MAU 최대 10만)의 백엔드 개발과, Java 8~21 · Spring Legacy~Boot 3 등 스택이 제각각인 10여 개 교육 콘텐츠 서비스를 동시에 운영하고 있습니다.
웅진북클럽 3.0 백엔드 전면 개편
2026.04 – 현재
기존 2.0 서비스를 전면 개편하는 프로젝트 · 서버 5인 중 자원 참여, 콘텐츠(도서·음원·영상) 도메인 담당
Java 17 · Spring Boot 3.2 · JPA · PostgreSQL · Spring Batch · NCP Object Storage · SK CDN
- 콘텐츠 데이터 모델 재설계 — 2.0의 상품 중심 구조를 도서코드 기반 모델로 다시 설계(신규 모듈, 엔티티 12개). 4종으로 흩어져 있던 세트 식별키를 하나로 통일하고, 세트·낱권 조회를 공통 API 5개로 정리
- 데이터 경계 분류 및 API 이관 — 콘텐츠 API 157개가 쓰는 테이블 148개의 3.0 이관 / 2.0 잔류 / 폐기 분류안을 작성해 팀 기준으로 삼고, 담당 API 64개 분석, 49개 이관·15개 폐기 판정. 기존 경로·파라미터·응답 형식을 유지해 클라이언트는 도메인만 바꾸면 되도록 하고, DB 간 JOIN 대신 API 호출로 데이터를 조립
- 운영 배치 무중단 전환 — 운영 배치 86건의 영향도를 판정하고, 콘텐츠 테이블을 쓰는 배치 6종을 원본 유지 + V2 분리 방식으로 전환. 전환 후 V1 결과를 대조해 V2에서 누락된 조건(같은 주문의 다른 도서 라이선스까지 취소되는 문제)을 잡아 수정
- 콘텐츠 CMS 설계 — 검증 환경 등록 → 운영 승격 구조로 설계하고, 운영 쓰기 API 차단과 삭제 대신 비공개 처리로 운영 사고 방지
- DRM 교체 — 공급사 폐업으로 유지보수가 끊겨 장애가 나도 대응할 수 없던 외부 DRM 솔루션을 AES-GCM·RSA-OAEP 기반 자체 암호화 방식으로 교체 (클라이언트 개발자와 2인 작업)
- JPA 성능 점검 — MyBatis 중심이던 팀에서 JPA 성능 점검을 맡아 N+1 발생 지점을 찾고 fetch join·벌크 조회·DB 페이징으로 개선
학원·공부방 학습패드 로그인/권한 시스템 재구축
2026.01 – 2026.05
학원·공부방에서 공용으로 쓰는 학습패드의 회원 인증과 학습 권한을 관리하는 시스템 · 서버 4인 중 자원 참여, 로그인·권한 동기화 배치·학습 과목 목록 조회 담당
Java 21 · Spring Batch 5 · MyBatis · Oracle · MariaDB
- 로그인 구조 개편 — 로그인마다 Stored Procedure(SP)가 회원 권한을 실시간 동기화하던 구조를 배치(동기화 대상 선정 → 권한 동기화)와 로그인 API로 분리. 수강 계약 정보로 ID/PW를 미리 발급해 패드에서 별도 인증 절차 없이 로그인하도록 개선
- SP → SQL 벌크 전환 — 수강 계약마다 반복 호출되던 권한 계산 SP를 SQL 8개로 전환하고 chunk 단위 IN절 벌크화. chunk(500건)당 권한 쿼리 4,000회 → 8회, DB 왕복 건당 3+N회 → chunk당 3회
- 조회 실행 계획 개선 — 수강 계약 조회 순서를 적중률 기준으로 재배치하고 실행 계획 힌트 적용, 조회 Cost 5,583 → 29
- 처리 시간 단축 — 24만 건 전체 처리 시간을 초기 구현 약 4시간(추정)에서 운영 실측 20~30분으로 단축
- 안전한 전환 — 임시 테이블·CSV 기록 기반 검증 환경으로 운영 데이터 영향 없이 측정하고, 기존 SP와 신규 쿼리 결과를 비교하는 테스트 코드로 동등성을 검증한 뒤 전환
- 오픈 후 정합성 이슈 해결 — 레거시 SP 병행 호출(운영 123만 회)로 권한 데이터가 덮어써지는 원인을 찾아 해결
구매 이력이 많은 회원의 도서 통계 API 응답 지연 개선
2025.10
SQL 튜닝 · 실행 계획 분석 · Scouter
- 문제 발견 — APM(Scouter)에서 구매 도서가 많은 회원의 읽은 책·책장 수 조회가 30~40초 걸려 에러로 집계되는 문제 발견
- 원인 분석 — 실행 계획 분석 결과 콘텐츠 테이블 Full Scan으로 시작, 독서 이력 JOIN 후 집계하며 행 증폭, Using temporary / filesort 발생
- 쿼리 재설계 — 드라이빙 테이블을 회원 구매 목록으로 변경, LEFT JOIN 제외 로직을 NOT EXISTS로 전환, 독서 이력은 선행 집계 후 JOIN
- 결과 — 최악 케이스 기준 36초 → 9초 이내로 단축
레거시 서비스 운영 및 빌드·배포 환경 정비
2023.08 – 현재
Java 8 · Java 11 · Spring Legacy · Maven · Jenkins · MyBatis · Oracle · MariaDB
- 수동 배포 → Jenkins 전환 기반 마련 (2026.10) — 서버에 class 파일을 직접 올리던 Spring 4 백오피스를 git 소스 기반 Jenkins 빌드·배포로 바꿀 수 있게 정비. 개발자 PC 캐시에만 의존하던 Maven 빌드를 빈 환경에서 재현되게 고치고(폐기 저장소·넥서스 도메인·Java 8 비호환 플러그인 정리), 서버에만 있던 환경 설정 16개를 Maven profile(local/dev/prd)로 형상 관리에 편입. Jenkins Job 구성은 플랫폼팀 담당
- 빌드 환경 이슈 해결·정리 — 사내 넥서스 미러가 프로젝트 내부 저장소까지 가로채 jar를 못 찾던 문제를 원인 분석해 해결. 브랜치를 prd/dev로 정리하고 로컬 세팅·빌드·트러블슈팅을 README 하나로 통합해 신규 개발자가 clone 직후 빌드 가능하도록 함
- Redis 업그레이드 후 서버 기동 불가 해결 (2025.12) — 검증계 Redis 7 업그레이드 뒤 콘텐츠 서버가 연결 실패를 무한 재시도하며 메모리 부족으로 기동되지 않던 문제. Lettuce 5.2가 Redis 6 이상의 ACL을 지원하지 않는 것을 원인으로 특정해 lettuce-core 6.2.6·reactor-core 3.4로 올려 해결하고, 같은 위험이 있는 서버를 전수 점검
- 레거시 환경 트러블슈팅 — TLS 버전 불일치, 외부 Tomcat 배포 설정 등 운영 중 만난 문제를 원인 분석해 해결하고 블로그·위키에 기록