𝟭𝟬 𝗣𝗛𝗣 𝗕𝘂𝗴𝘀 𝗧𝗵𝗮𝘁 𝗕𝗿𝗲𝗮𝗸 𝗥𝗲𝗮𝗹 𝗣𝗿𝗼𝗷𝗲𝗰𝘁𝘀

코드는 내 컴퓨터에서는 잘 작동합니다. 서버에 푸시하면 모든 것이 망가집니다. 로그에는 아무런 에러도 없습니다. 그저 잘못된 결과만 보일 뿐입니다.

이러한 버그들은 교과서에서 나오는 것이 아닙니다. 실제 로그인 시스템, 상점, API에서 발생합니다. 코드 리뷰 단계에서는 괜찮아 보이지만 운영 환경(production)에서 실패합니다.

다음은 11번부터 20번까지의 버그와 해결 방법입니다.

• 무한 루프 (Infinite Loops) 카운터를 증가시키는 것을 잊으면 PHP 프로세스가 잠깁니다. 이는 서버 전체를 다운시킬 수 있습니다. 해결 방법: 루프 카운터가 항상 증가하는지 확인하세요.

• 대소문자 구분 문제 (Case-Sensitivity Issues) PHP는 "Admin"과 "admin"을 서로 다른 문자열로 인식합니다. 이는 접근 제어를 무너뜨립니다. 해결 방법: 문자열을 비교하기 전에 strtolower()를 사용하세요.

• 수학 연산 및 절삭 (Math and Truncation) 소수점에 (int)를 사용하면 반올림되지 않고 소수점 이하가 잘려 나갑니다. 이는 결제 시스템에서 금융 오류를 일으킵니다. 해결 방법: round() 또는 number_format()을 사용하세요.

• JSON 에러 (JSON Errors) json_decode는 기본적으로 객체(object)를 반환합니다. 이를 배열처럼 사용하려고 하면 스크립트가 실패합니다. 해결 방법: 두 번째 인자로 true를 전달하여 배열로 받으세요.

• XSS 보안 위험 (XSS Security Risks) 사용자 입력을 직접 출력하면 공격자가 스크립트를 삽입할 수 있습니다. 해결 방법: 항상 htmlspecialchars()를 사용하세요.

• 경로 오류 (Path Failures) 상대 경로는 로컬 환경에서는 작동하지만 라이브 서버에서는 실패합니다. 해결 방법: 절대 경로를 위해 __DIR__ 상수를 사용하세요.

• 중복 데이터 (Duplicate Data) 사용자가 제출 버튼을 더블 클릭하는 경우가 많습니다. 이로 인해 데이터베이스에 중복 항목이 생성됩니다. 해결 방법: 먼저 레코드가 존재하는지 확인하고, 데이터베이스에 UNIQUE 제약 조건을 사용하세요.

• 배열 병합 (Merging Arrays) array_merge()는 숫자 키를 0으로 재설정합니다. 이는 데이터 구조를 파괴합니다. 해결 방법: 키를 유지하려면 + 연산자나 array_replace()를 사용하세요.

• 보이지 않는 에러 (Invisible Errors) 운영 환경에서 에러를 끄는 것은 보안에 좋지만, 로그를 남기지 않으면 디버깅에 매우 불리합니다. 해결 방법: log_errors를 1로 설정하고 error_log 경로를 정의하세요.

• 루프 참조 (Loop References) foreach 루프는 원본 배열이 아닌 데이터의 복사본을 수정합니다. 해결 방법: & 기호를 사용하여 참조를 생성하되, 루프가 끝난 후에는 항상 해당 변수를 unset 하세요.

이러한 버그의 대부분은 에러를 발생시키지 않습니다. PHP는 계속 실행되지만 잘못된 결과를 만들어냅니다. 이 점이 바로 이 버그들을 위험하게 만듭니다.

코드를 작성하는 것은 쉽습니다. 하지만 운영 환경에 적합한 코드를 작성하려면 시스템이 어떻게 실패하는지를 이해해야 합니다.

전체 가이드는 여기서 확인하세요: https://dev.to/bikkisingh/10-php-bugs-that-break-real-projects-and-how-to-fix-them-part-2-7hm