3D 애셋 마켓플레이스, AI PoC 프로젝트, 사내 시스템 등 백엔드 개발부터 AWS 인프라 구성, CI/CD 파이프라인 구축, 시스템 안정화 작업까지 사내 전반적인 프로젝트를 주도적으로 진행했습니다. 서비스 장애의 원인을 분석하고, 구조 개선을 통해 문제를 해결한 경험과 테스트 코드 문화 도입으로 팀 전체의 품질 향상에 기여했습니다.
단순히 요청을 그대로 처리하기보다, 항상 ʻ왜’를 먼저 고민하며 본질에 맞는 방향으로 구현하거나, 상황에 따라 우선순위를 조정해 더 나은 결과로 이어지도록 조율해왔습니다. 문제가 발생했을 때도 단순 대응보다는 근본적인 원인을 파악하고, 재발하지 않는 구조로 개선하는 데 집중했습니다. 그 과정에서 남긴 코드와 문서는 동료들이 이해하기 쉬운 형태로 구성하고자 노력했고, 실제로 코드와 문서를 깔끔하게 작성한다는 피드백과 함께 항상 맡은 바를 안정적으로 해낸다는 평가를 받았습니다.
3D Asset 마켓플레이스 polyground 백엔드 개발 및 운영 (https://polyground.ai)
대량 데이터 삭제 중 OutOfMemoryError로 인해 애플리케이션이 반복적으로 재시작되는 문제 발생
- 운영 중인 서비스에서 일정 주기로 미사용 리소스를 삭제하는 배치 작업을 수행하던 중, 데이터량이 증가하면서 삭제 속도가 급격히 느려지고, OutOfMemoryError가 반복적으로 발생
- JPA가 생성한 In Query가 삭제 대상 엔티티 전체를 메모리에 로딩한 뒤, 각각에 대해 순차적으로 삭제하는 비효율적인 구조를 확인 - 삭제 대상이 많아질수록 메모리 점유가 선형 증가했고, GC가 이를 따라가지 못해 결국 OOM으로 이어지는 흐름이 발생
- @Query를 사용해 범위 조건 기반의 단일 삭제 쿼리를 직접 작성하고, 쿼리가 DB 내부에서 일괄 실행되도록 구조를 변경
- 이로 인해 메모리 사용량이 안정적으로 유지되었고 삭제 속도도 기존 대비 5배 이상 개선. 유사한 문제가 반복되지 않도록 메서드 이름 기반으로 생성되던 쿼리 로직을 전수 조사
포인트 중복 사용 방지를 위한 설계
- 포인트 사용 기능을 설계할 당시, 사용자가 동일 포인트를 중복 차감하는 상황을 사전에 방지할 필요가 있다고 판단
- MySQL InnoDB의 기본 격리 수준인 Repeatable Read는 트랜잭션 내에서 동일 데이터를 읽을 때 일관된 결과를 보장하지만 동일한 데이터를 동시에 수정하려는 트랜잭션 간 충돌은 제어하지 못함
- 이 경우 두 트랜잭션이 동시에 포인트 데이터를 조회한 후 차감 로직을 실행하면, 각자 독립된 스냅샷을 기준으로 차감하게 되어 중복 차감이 발생할 수 있는 상황
- 이러한 동시성 문제를 차단하기 위해 select ... for update 구문으로 트랜잭션 내 포인트 데이터를 잠금 처리해, 다른 요청이 해당 포인트를 동시에 사용할 수 없도록 설계하여 기능 오픈 이후 단 한 건의 중복 차감 이슈 없이 안정적인 포인트 시스템 운영
파일 업로드 시 OutOfMemoryError 발생
- 다수의 사용자가 동시에 수 MB 이상의 파일을 업로드할 경우, OutOfMemoryError가 발생하고 애플리케이션이 간헐적으로 재시작되는 문제 발생
- 힙 덤프와 GC 로그 분석 결과, MultipartFile이 업로드된 파일을 통째로 메모리에 적재하는 구조에서 문제 발생
- G1 GC 환경에서는 이러한 객체가 대용량 객체로 분류되어 Old 영역에 직접 할당되며, 회수 주기가 길고, 연속된 메모리 공간을 필요로 하기 때문에 메모리 할당 실패로 이어질 가능성이 높음
- 동시 요청이 몰릴 경우 GC가 이를 제때 회수하지 못해 결국 OOM이 반복적으로 발생
- 이를 해결하기 위해 파일 처리 방식을 InputStream 기반의 스트리밍 구조로 전환, 파일을 버퍼 단위로 처리하는 방식으로 변경
- 이로 인해 메모리에 전체 파일을 적재하지 않게 되어 대용량 객체 생성을 차단하고, G1 GC의 Old 영역에 대한 부하를 줄이며 안정적인 메모리 사용이 가능한 구조로 개선
테스트 코드 작성 문화 도입
- 잦은 요구사항 변경과 결함 수정이 반복되는 상황에서, 기능 검증이 매번 수작업으로 이루어지면서 피드백 루프가 느려지고 테스트 누락으로 인한 품질 저하 위험을 인지
- 이를 해결하기 위해, 비즈니스 흐름과 역할이 자연스럽게 드러나는 DCI 패턴 기반으로 테스트 코드를 작성하고, 도메인 중심의 테스트 구조를 정립함으로써 누구나 코드 흐름을 빠르게 파악하고 유지보수할 수 있는 기반을 마련
- 테스트 작성 경험이 부족한 동료들을 위해 예제 중심의 가이드를 작성해 공유하고, 팀 전체가 일관된 방식으로 테스트를 작성할 수 있도록 유도
- 그 결과, 코드 커버리지 73%를 달성했고, 테스트 자동화 환경 속에서 안심하고 리팩토링할 수 있는 개발 문화를 팀 내에 정착
생성형 AI를 이용한 텍스트 기반 이미지 생성 PoC 프로젝트
- 다양한 생성형 AI 모델(TTI, ITI, IT3)을 활용한 텍스트 기반 이미지 생성 PoC 프로젝트를 진행하며, 모델별 요청, 응답 흐름이 거의 유사함에도 중복 코드가 많아 관리와 확장이 어려운 구조를 발견
- Spring AI 프로젝트의 모델 추상화 구조를 참고해 템플릿 메서드 패턴 기반으로 리팩토링하여, 이를 통해 공통 로직을 통합하면서 새로운 모델을 최소한의 코드로 쉽게 추가할 수 있는 구조로 개선
모니터링 외부 세미나를 듣고 모니터링의 중요성에 대해 사내 발표 진행 (문서)
- 외부 모니터링 세미나에서 얻은 인사이트를 바탕으로 모니터링의 필요성과 주요 지표의 활용 방안에 대해 사내 발표 진행
- 발표 후 팀 내에 모니터링 도구 활용 논의가 활발해지고, 실제 운영 중인 서비스에 기본적인 헬스체크와 슬랙 알림 기반의 경고 시스템을 적용하는 계기를 마련
더보기