문제 해결 경험
개발자에게 있어 다양한 시스템 문제의 원인을 분석하고 해결하는 과정은 생각보다 중요한 경험이라고 생각합니다. 소프트웨어 공학에서는 명확한 요구사항을 기반으로 분석과 설계가 이루어진다고 하지만, 실제로는 도메인 전문가들조차 불명확한 정보를 가지고 있는 경우가 많습니다. 도메인과 요구사항이 불명확할수록 시스템에 안전하지 않은 결함이 내재될 가능성이 높아집니다.
비즈니스 도메인의 이해
개발 지식만으로는 충분하지 않으며, 비즈니스 도메인에 대한 이해가 필수적입니다. 고객 요구사항을 제대로 이해하기 위해서는 해당 도메인 영역의 배경 지식이 필요한 경우가 많습니다. 고객이 전달한 요구사항 중 불확실하거나 생략된 부분을 고려하고, 다양한 방향과 대안을 제시함으로써 시스템 문제 발생 가능성을 최소화해야 합니다.
다양한 시스템 문제에 대응하기 위해서는 백엔드뿐만 아니라 프론트엔드와 인프라 영역에 대한 지식이 필요하며, 문제 원인 분석과 최적의 해결책 선택을 위해 관련 키워드를 알고 있어야 합니다. 따라서 현재 조직에서 경험하지 못하는 많은 문제들에 대해서는 다양한 개발자와 IT 기업이 공유하는 트러블슈팅 자료와 영상을 참고하려고 노력합니다.
더 나은 시스템을 구축하는 개발자가 되기 위해, 또는 업무에서 충분히 정리하지 못하는 부분을 보완하기 위해 GitHub이나 개인 블로그에 문제 해결과 원인 분석 내용을 기록하고 있습니다.
다음은 제가 경험한 대표적인 트러블슈팅 사례입니다:
시계열 데이터베이스 통신을 위한 커넥션 풀 구현 과정에서 Apache Commons Pool2 라이브러리의 인터페이스와 문서를 충분히 검토하지 않아 미흡하게 구현했습니다. 이로 인해 TCP 소켓 연결 누수가 발생했고, 근본 원인 분석을 통해 해결한 경험입니다.
Spring의 일반적인 지식과 다양한 시스템 운영에 대한 이해 부족으로 Spring 유틸리티 클래스 사용 시 메모리 누수가 발생했습니다. 이 문제의 근본 원인 분석과 해결 과정을 통해 Redis의 운영 측면 설정에 대해서도 학습하게 되었습니다.
STOMP + SockJS 기반 WebSocket 구성에서 사용자가 브라우저를 새로고침할 때 연결 문제가 발생했습니다. 이 문제를 분석하고 해결하면서 Nginx 디렉티브 선언 위치에 따라 증상이 달라질 수 있다는 것을 알게 되었습니다.
S사의 AWS VDI 환경(보안상 이유로 구성)에서 ALPN 정책으로 인한 HTTPS 및 HTTP/2 연결 문제를 경험했습니다. 직접 해결책을 구현하지는 않았지만, 고객사 인프라팀이 단서를 찾아 대안 솔루션을 제공하여 해결되었습니다.
Spring Actuator 엔드포인트를 통한 빌드 정보 API가 의도대로 작동하지 않는 문제를 해결했습니다. Spring Boot의 자동 구성과 빈 등록 어노테이션의 실행 순서로 인한 문제였으며, 이를 분석하고 해결한 경험입니다.