사람인
회원수 680만, 연간 입사지원 3,500만 건의 채용 서비스
이력서 PDF 다운로드 속도 개선
2026.01 - 2026.03
기존 2대 변환 서버의 브라우저 재실행·렌더링 대기 병목을 해소하고, 단일 서비스 전용 구조를 Kubernetes 기반 공용 PDF 변환 인프라로 전환
성과 : PDF·HTML 생성 평균 처리시간 약 51% 단축, Kubernetes 기반 공용 변환 구조 구축
1. 확장 한계를 해소하기 위해 PDF 변환 구조를 공용 인프라 기반으로 전환
- 기존 PDF 변환 서버는 2대의 단순 구성으로 운영되어 트래픽 증가에 유연하게 대응하기 어려웠음
- 사람인 서비스 중심 구조라 신규 서비스에서 공통으로 활용하기 어려웠음
- 배포와 운영 구조가 표준화되지 않아 안정적인 확장과 운영 자동화에 한계가 있었음
- GitLab CI 기반으로 빌드·테스트·배포 파이프라인을 구성하고 Harbor·SonarQube·Helm·ArgoCD를 연계한 배포 흐름을 구축함
- 기존 2대의 변환 서버를 신규 서버 노드 4대, Pod 10~20 규모의 Kubernetes 운영 구조로 확장함
- 사람인 외 신규 서비스에서도 공통으로 사용할 수 있도록 PDF 변환 구조를 전환함
- PDF 변환 서비스를 배포 및 확장 가능한 구조로 전환해 증가하는 요청에 유연하게 대응할 수 있게 됨
- 단일 서비스 전용 구조를 공용 인프라 기반으로 개선해 확장성을 확보함
- CI/CD와 Kubernetes 기반 운영 체계를 통해 배포 일관성과 운영 안정성을 높임
2. 브라우저 생명주기 충돌과 렌더링 병목을 제어해 처리 성능과 안정성을 함께 개선
- 유휴 시간 기반 종료 로직이 요청 처리 시점과 겹치면 브라우저 오류가 발생할 수 있었음
- 불필요한 요청과 비효율적인 HTML 로딩 대기 조건으로 PDF·HTML 생성 시간이 길었음
- 사내 정적 리소스 서버에서 CSS를 정상적으로 불러오지 못해 레이아웃이 깨지는 문제가 있었음
- 유휴 시간 기반 자동 종료 및 재실행 로직을 적용하고, 작업 중인 요청이 있을 경우 브라우저가 종료되지 않도록 보완함
- 브라우저 종료 중에는 신규 요청이 기존 브라우저를 사용하지 않고 대기하도록 제어함
- CDP 기반 요청 차단 방식을 적용해 불필요한 요청 비용을 줄이고, HTML 로딩 대기 조건을 실제 렌더링 흐름에 맞게 최적화함
- User-Agent를 추가해 방화벽 차단 이슈를 해결함
- 브라우저 생명주기 충돌로 인한 오류 가능성을 줄여 재사용 구조에서도 안정적인 운영이 가능해짐
- PDF 및 HTML 생성 평균 처리시간을 약 51% 단축함
- 처리 속도뿐 아니라 레이아웃 안정성까지 함께 개선함
3. 모니터링 체계를 구축하고 확장 기준을 정비해 운영 가시성과 대응력을 확보
- 서비스 상태와 리소스 사용량을 종합적으로 파악하기 어려워 운영 이슈를 빠르게 인지하기 어려웠음
- 오토스케일링 및 리소스 조정 기준이 명확하지 않아 운영 판단이 경험에 의존하는 부분이 있었음
- Grafana와 SigNoz 기반으로 서비스 모니터링 체계를 구성함
- 기존에 연결되지 않았던 서비스까지 모니터링 범위를 확장함
- 수집된 지표를 바탕으로 오토스케일링 기준과 리소스 사이즈를 조정함
- 서비스 상태와 병목 지점을 빠르게 파악할 수 있는 운영 가시성을 확보함
- 모니터링 지표 기반으로 리소스 운영과 확장 판단이 가능한 구조를 마련함
맞춤법 검사 API Java 모듈 전환
2025.09 - 2025.10
노후화된 맞춤법 검사 API를 PHP에서 Java로 전환하고, Java 실행 방식에 맞는 구조로 재설계해 성능을 개선
성과 : 4000자 기준 응답시간 7.98초 → 3.71초, 약 53% 개선
1. PHP 구조를 그대로 이식하지 않고 Java 실행 방식에 맞는 전환 기준을 수립
- 기존 PHP 기반 맞춤법 검사 API가 노후화되어 유지보수성과 확장성이 떨어졌음
- 기존 PHP 모듈 구조를 그대로 Java로 옮기면 오히려 처리 성능이 저하되는 문제가 있었음
- 기존 모듈의 처리 흐름을 분석해 PHP와 Java가 강점을 가지는 입력 형태와 실행 방식이 다르다는 점을 확인함
- PHP는 긴 단락 단위 처리에, Java는 문장·문단 단위 분할 처리에 더 적합하다는 점을 바탕으로 구조 전환 방향을 재정의함
- 단순 포팅이 아니라 Java 런타임 특성에 맞는 분할 처리 중심 구조로 재설계 기준을 수립함
- 단순 이식이 아닌 Java 특성에 맞는 구조 전환 필요성을 명확히 정의함
- 이후 문장 분할·병렬 처리 구조를 설계할 수 있는 기술적 기준을 마련함
2. 긴 텍스트 지연을 줄이기 위해 문장 분할·청크 병렬 처리와 순서 보장 구조를 구현
- 긴 텍스트를 단일 흐름으로 처리하면 응답시간이 길어졌음
- 병렬 처리 시 결과 순서가 뒤섞일 수 있어 정확한 병합 방식이 필요했음
- BreakIterator 기반으로 문장을 분할하고, 처리 효율이 가장 좋았던 300자 내외 청크로 재구성함
- 분할한 청크를 CompletableFuture 기반으로 병렬 처리하고, 각 결과에 index를 담아 수집함
- 처리 완료 후 index 기준으로 정렬·병합해 문장 순서를 유지하는 구조를 적용함
- 긴 텍스트에 적합한 병렬 처리 아키텍처를 구현함
- 응답시간 단축의 핵심이 된 실행 구조를 마련하면서도 결과 순서 보장을 함께 달성함
3. 성능 테스트와 JVM 지표 점검으로 구조 개선 효과와 운영 안정성을 검증
- 구조 전환과 병렬 처리 적용 이후 실제 응답시간이 얼마나 개선됐는지 정량적으로 검증할 필요가 있었음
- 동시 요청 증가 상황에서도 GC, Old 영역, Metaspace 상태를 포함해 운영 안정성을 함께 확인해야 했음
- 500자·2000자·4000자 기준 속도 및 부하 테스트를 수행해 PHP 상용 버전과 Java 전환 구조의 응답시간을 비교함
- jstat 로그를 기반으로 Young GC, Full GC, Old 영역, Metaspace 사용량을 함께 점검해 운영 환경에서의 메모리 동작을 확인함
- 성능 개선의 주요 원인이 Java 구조 전환과 병렬 처리 방식에 있음을 수치로 검증하고, 메모리 관리 포인트는 운영 관점에서 별도로 정리함
- 4000자 기준 응답시간을 7.98초에서 3.71초로 약 53% 개선함
- PHP 상용 대비 Java 전환 구조의 성능 향상 효과를 정량적으로 검증함
- Full GC 없이 운영 가능함을 확인했고, Metaspace 관리 필요성 등 운영 안정화 포인트도 함께 도출함
PC 개인 MY 홈 성능 개선
2024.09 - 2024.10
반복 호출과 불필요한 처리 흐름을 개선해 응답 속도를 단축
성과 : TTFB 기준 평균 3초에서 1초 이하로 단축
1. 반복 호출과 불필요한 처리 흐름을 제거해 응답 속도와 측정 신뢰도를 함께 개선
- 페이지 내 반복 호출되는 API와 불필요한 처리 흐름으로 응답 속도가 느렸음
- 측정 과정에서 사내 웹 디버그바 영향으로 LCP 데이터가 왜곡되는 문제가 있었음
- 반복 호출되던 API 구간을 분석하고 제거함
- 데이터 처리 흐름을 단순화해 페이지 응답 시간을 줄임
- 환경변수 기반으로 디버그바 노출 여부를 분기하도록 수정함
- 리팩토링을 통해 코드 가독성과 유지보수성을 함께 개선함
- TTFB 기준 평균 3초 수준이던 응답시간을 1초 이하로 단축함
- 실제 사용자 환경에 가까운 성능 데이터를 기반으로 개선 효과를 확인함
AI 자기소개서 유료화 서비스 개발
2025.07 - 2025.08
AI 자기소개서 서비스 유료화 과정에서 이용권 차감 로직과 코칭 중계 API를 개발하고, 로그 기반 QA 지원 체계를 정리
성과 : 유료화 정책, 이용권 차감 기준, 중계 API 연동 구조를 일관되게 정리해 일정 내 안정적으로 런칭하고, 로그 기반 추적 체계로 초기 운영 대응 기반 마련
1. 유료화 정책과 연동 구조를 정리해 일관된 서비스 흐름과 QA 기준을 마련
- 서비스 유료화에 따라 기능 사용 조건과 이용권 차감 기준을 명확히 정의할 필요가 있었음
- 검색 기능과 AI 기능을 연결하는 과정에서 요청/응답 구조와 예외 케이스를 일관된 기준으로 정리해야 했음
- AI 자기소개서 서비스의 유료 기능 정책과 이용권 차감 로직을 설계하고 구현함
- 검색·AI 기능 연동을 위한 중계 API를 구축하고 요청/응답 데이터 구조 및 기능 흐름을 정리함
- 상세 요청·응답 로그 기반으로 QA 이슈를 분석하고 예외 상황을 추적 가능한 형태로 정리함
- 유료화 정책과 시스템 연동 기준이 일관되게 정리되어 개발과 QA를 같은 기준으로 진행할 수 있게 됨
- 로그 기반 추적 체계를 통해 일정 내 안정적으로 런칭하고 운영 초기 대응 기반을 마련함
Redis 서버 분리 및 확장
2024.08 - 2024.12
Redis 서버 분리와 신규 서버 이관 구조를 정리하고, 반복 수정 없이 확장 가능한 호출 구조로 개선
성과 : 서버 추가 시 반복 수정이 필요하던 구조를 공통화해 이관 공수를 줄이고, Redis 분리·확장을 유연하게 수행할 수 있는 호출 구조 마련
1. 서버 추가 시 반복 수정이 필요하던 구조를 리팩토링해 Redis 확장과 이관에 유연한 호출 구조를 마련
- 기존 구조는 서버 추가 시 호출부마다 직접 수정이 필요해 확장 공수가 컸음
- 서비스별 이관 범위와 배포 가능 시점이 달라 작업 병목이 발생할 수 있었음
- Redis 공통 코드를 정리하고 호출 클라이언트만 추가할 수 있도록 REST 호출부 함수를 리팩토링함
- 팀원 간 작업 진척도와 배포 준비 상태를 구분해 관리하고, 병목 없이 진행되도록 이관 및 배포 순서를 조율함
- 서버 분리 및 확장 시 반복 수정 비용을 줄일 수 있게 됨
- 기술 개선과 함께 팀 단위 이관 효율을 높일 수 있는 기반을 마련함