개발 과정에서 우리는 여러 문제를 마주하게 됩니다. 때로는 문제가 복잡하게 얽혀 있어 해결 과정에서 비효율적인 시도를 하게 되기도 합니다. 이 글에서는 제가 경험한 몇 가지 사례를 바탕으로, 문제를 효과적으로 분석하고 해결하는 방법에 대해 이야기합니다.


핵심문제를 구조적으로 분석하기

어떤 기능이든, 다양한 요소가 조립되어 하나의 '동작'을 만들어냅니다. 이를 피라미드 구조로 비유할 수 있습니다:

  • 핵심 요소: 가장 근본적인 원인 (예: DB 서버 설정)

  • 중간 요소: 핵심과 끝점을 연결하는 부분 (예: 데이터 처리 로직)

  • 끝점 요소: 최종적으로 사용자와 상호작용하는 부분 (예: 애플리케이션 코드)

문제가 발생했을 때, 끝점 요소만을 집중적으로 살펴보면 불필요한 시간이 소요될 수 있습니다.
예를 들어, SQL 서버가 4바이트를 차지하는 이모지(이모티콘)를 지원하지 않는 구성상의 문제가 있는 상황입니다.
만약 잘못된 판단으로 연결 문자열의 설정상의 원인이라고 생각하며 문제해결을 시도하면 해결되지 않습니다.
결국, 핵심 요소에서 원인을 찾아 올라가는 방식이 효율적인 경우가 많습니다.


사례 1: 4바이트 이모지와 MySQL 서버 설정

문제:

이모지(🙏)가 있는 글을 블로그 관리 DB에 저장하려고 했을 때 아래와 같은 메세지와 함께 오류가 발생했습니다:

Incorrect string value: 'xF0x9FxABx96 ' for column

분석 및 해결:

  1. 문제 원인 파악:

    • MySQL의 기본 utf8 설정은 3바이트까지만 지원합니다.

    • 이모지는 4바이트 데이터를 요구하므로, utf8mb4로 전환해야 합니다.

  2. 해결 과정:

    • MySQL 서버의 charset 설정을 utf8mb4로 변경.

    • 그러나 기존 테이블의 charset은 여전히 utf8로 설정되어 있었습니다.

    • 테이블 및 컬럼의 charset을 utf8mb4로 명시적으로 변경하여 문제를 해결.

교훈:

처음에는 문제의 원인을 서버 설정이 아닌 오류 메시지만 보고 단편적으로 문자열 관련해서 문제가 없나 찾아보려 했습니다. 
제대로 파악하지 못하고 연결 문자열에 불필요한 옵션을 추가하는 등의 실수를 했었습니다. 
이로 인해 문제의 근본 원인을 탐구하는 것이 중요하다고 생각했습니다.


문제를 다양한 관점에서 파악하기

문제가 발생했을 때, 다양한 원인을 꼼꼼하게 누락하지 않고 점검해 보아야 합니다. 
다양한 환경과 변수를 고려하는 것도 중요합니다.
어느 한 측면에서만 원인을 찾으려 하면 시간이 누수될 우려가 있습니다.


사례1:

C# Interop 라이브러리를 이용해 엑셀 파일을 생성하는 프로그램을 개발했습니다.
로컬 환경에서는 정상적으로 동작했지만, 서버에서는 엑셀 생성 과정에서 오류가 발생했습니다.

분석 및 해결:

  1. 원인 분석:

    • 로컬 환경은 Office 2019, 서버는 Office 2010 버전이 설치되어 있었습니다.

    • 로컬에서 빌드된 프로그램은 2019버전에 호환되는 라이브러리를 사용하고 있었습니다.

  2. 해결 과정:

    • 프로그램의 참조 라이브러리를 Microsoft Office 14.0 Object Library로 변경.

    • 또한, 2010버전에서 지원되지 않는 특정 함수와 디자인 요소를 제거.

  3. 결과:

    • 서버 환경에 맞춰 재빌드한 프로그램을 배포하여 문제를 해결.

교훈:

처음에는 로컬 환경에서는 잘 작동했기 때문에 서버에 잘못된 빌드의 프로그램이 올라갔을거라 추정하는 실수를 했습니다.
로컬과 배포서버와의 차이를 생각해보며 원인을 추정해가던 중 두 환경 사이의 차이를 발견하게 되었습니다.
해결하며 느낀점은 개발 환경과 운영 환경 간의 차이를 항상 염두에 두고 테스트를 진행하는 것이 중요하다는 점입니다.


사례2:

SMS 알림 서비스를 구축하던 중, 로컬에서는 정상적으로 문자 전송이 되었지만, 서버에서는 동작하지 않았습니다.
오류 메시지도 없어서 원인 파악이 어려웠습니다.

분석 및 해결:

  1. 원인 분석:

    • 배포 환경의 차이를 점검했으나 별다른 문제는 없었습니다.

    • 배포 서버에서 콘솔 프로그램을 직접 실행해 본 결과, 프로그램 자체가 제대로 동작하지 않았습니다.

  2. 해결 과정:

    • 로컬의 프로그램을 다시 배포하여 실행.

    • 이후 문제없이 작동.

교훈:

단순히 서버 환경 문제가 아닐 수 있습니다.
다양한 접근 방식을 통해 문제를 해결해야 한다고 생각했습니다.


문제 해결 능력의 중요성

위 사례들을 통해 얻은 교훈은 다음과 같습니다:

  1. 근본 원인 파악:

    • 문제의 근본 원인을 이해하면 불필요한 시행착오를 줄일 수 있었습니다.

  2. 환경 간 차이 인식:

    • 로컬과 서버 환경의 차이를 고려한 개발이 필수적입니다. 

  3. 다양한 경험의 축적:

    • 다양한 문제 해결 경험은 새로운 문제에 대한 직관을 키워줬습니다.