Skip to content

문제 해결 경험

저는 개발자에게 시스템에서 발생하는 다양한 문제들의 원인을 분석하고 해결하는 과정을 경험하는 것은 생각보다 중요하다고 생각합니다. 소프트웨어 공학 관점에서는 명확한 요구사항을 토대로 분석과 설계가 이루어진다고 말해오지만 현실적으로는 해당 도메인의 경험 많은 전문가들도 명확하지 않은 정보를 가지고 있습니다. 명확하지 않은 것들이 많은 도메인과 요구사항 일수록 시스템은 안전하지 않은 결함을 내재하게될 가능성이 높습니다.

비즈니스 도메인의 이해

개발 관련 지식 뿐만 아니라 비즈니스 도메인에 대한 이해가 반드시 필요합니다. 고객의 요구사항을 이해하기 위해서는 도메인 영역의 배경 지식을 알고 있어야하는 경우가 상당히 많습니다. 고객이 전달한 요구사항 중에서 확실하지 않거나 생략된 부분을 고려해야하고 그에 따라 작업에 대한 여러가지 방향과 대안을 만들어두고 제안하여 시스템에 문제를 일으킬 가능성을 최소화 해야합니다.

백엔드 뿐만 아니라 프론트엔드 그리고 인프라 영역에 대한 지식을 알고 있어야 시스템에서 발생하는 다양한 문제에 대해서 최소한의 대응이 가능하며 관련 키워드를 알고 있어야 문제에 대한 원인 분석과 최적의 해결 방안을 선택할 수 있습니다. 따라서, 현재 조직에서 경험하지 못하는 많은 문제들은 수 많은 개발자와 IT 기업에서 공유하는 트러블슈팅에 대한 글이나 영상을 보고 참고하려고 노력합니다.


더 나은 시스템을 만들어가는 개발자가 되기 위해서 혹은 업무적으로 제대로 정리하지 못하는 부분을 보완하기 위하여 깃허브개인 블로그에 문제해결과 원인 분석에 대한 내용을 남기고 있습니다.

다음은 대표적인 트러블슈팅에 대한 기록입니다.

TCP 소켓 핸들 누수 문제

시계열 데이터베이스와의 통신을 위한 커넥션 풀을 구현하는 과정에서 Apache Commons Pool2 라이브러리에서 구현을 요구하는 인터페이스와 문서를 자세히 살펴보지 않아서 미흡하게 구현을 한 부분이 있었고 이로 인해 TCP 소켓 연결에 대한 누수가 발생하여 원인 분석을 통해 조치하게된 경험입니다.

레디스 메모리 사용량이 조금씩 증가하는 현상

스프링에 대한 일반적인 지식과 다양하게 동작하는 시스템을 제대로 이해하지 못하고 스프링에서 제공하는 유틸 클래스를 사용하게 되면서 발생한 메모리 누수 문제이며 이에 대한 원인 분석과 조치에 대한 경험입니다. 이를 통해 레디스에 대해서도 운영적인 측면의 옵션 설정하는 것을 알게 되었습니다.

웹 페이지 새로고침 시 웹소켓 연결을 하지 못하는 문제

STOMP + SockJS 방식으로 구성한 웹소켓 연결에서 사용자가 브라우저를 새로고침 하는 상황이 있는 경우 웹소켓 연결이 안되는 문제에 대한 원인 분석과 조치에 대한 경험입니다. 이 문제의 경우 Nginx 디렉티브 선언 위치에 따라 증상이 있을 수도 있다는 것을 알게 되었습니다.

NLB의 ALPN 정책이 VDI 환경에서 적용되지 않음

S사 고객의 AWS 환경에서 보안 사유로 인해 VDI 환경을 구성해야하는 경우 인프라 구성에 따른 ALPN 정책으로 인해 HTTPS 및 HTTP/2 연결이 정상적이지 않는 문제에 대한 경험입니다. 직접적인 조치를 수행한 것은 아니지만 고객 측 인프라팀에서 실마리를 찾았고 대안을 제공해주어서 해결되었습니다.

빌드 정보 API가 등록되지 않은 이유

스프링 액추에이터 엔드포인트를 통해 스프링 부트 기반의 서버 애플리케이션에서 빌드 정보를 제공하는 API를 작성했으나 스프링 부트의 자동 구성과 빈을 등록하는 어노테이션의 동작 순서로 인해 의도한대로 동작하지 않았던 문제를 해결한 경험입니다.