동시 접속자가 몰리는 이벤트나 결제 처리 시스템을 운영하다가 ERROR 1213 (40001): Deadlock found when trying to get lock 에러를 마주친 적이 있을 것이다. 단순한 쿼리 오류인 줄 알고 사용자가 다시 시도하도록 유도해보지만, 트래픽이 폭증할 때마다 서비스 전체로 퍼지며 데이터베이스 트랜잭션이 롤백되는 장애를 겪곤 ···
트래픽이 갑자기 몰리거나 웹 애플리케이션 서비스 운영 중 "MySQL ERROR 1040 (HY000): Too many connections" 에러를 만난 경험이 있는가? 대부분의 백엔드 개발자는 데이터베이스 서버가 갑자기 응답을 멈추거나 웹 서비스 전체가 500 Internal Server Error로 마비되고 나서야 문제를 인지한다. 다만 정확한 원인···
이미지 처리가 필요한 PHP 프로젝트에서 갑자기 imagecreatefromjpeg() 함수가 작동하지 않는 경험을 해봤을까. 대부분의 개발자는 파일 경로나 JPEG 파일 형식 문제만 의심하고, 실제 원인인 GD 라이브러리 미설치나 JPEG 지원 부재를 놓친다. 이번에는 imagecreatefromjpeg() 함수가 정확히 뭔지, 왜 실패하는지, 어떻게 완···
서버 메모리가 갑자기 100%에 도달하면서 MySQL이나 PHP-FPM 프로세스가 무응답으로 종료되는 현상을 경험해봤을 것이다.로그 파일에도 특별한 에러 메시지 없이 서비스가 그냥 죽어버려 당황했던 적이 많다.다만 대부분의 개발자들은 정확한 원인이 리눅스 커널의 OOM Killer 작동 때문이라는 점과 이를 방지하는 Swap 메모리 설정법을 잘 모른다.이번···
누군가 새 서버를 받아서 PHP 코드를 띄우려는 순간, 반갑지 않은 빨간 에러가 화면을 덮는다. 'ERROR 1045: Access denied for user'. 대부분의 개발자는 이 메시지를 본 순간 비상이다. 데이터베이스 연결이 끊겼다는 뜻이니까. 다만 원인이 정말 다양해서, 유명한 스택오버플로우 글을 복사하거나 무작정 권한을 777로 풀어버린다. 이···
MySQL에 접속할 때 가장 흔하게 마주치는 에러가 ERROR 1045다. 데이터베이스는 설치했는데 갑자기 connection이 끊기거나, 배포 후 운영 서버에서만 접속이 안 되거나, 비밀번호를 분명히 맞게 입력했는데도 denied 된다는 메시지가 떠서 당황해한다. 다만 대부분의 개발자들은 에러 메시지만 보고 비밀번호 한두 글자를 고쳐보다가, 근본 원인을 ···
서버를 생성하고 공인 IP를 할당받은 지 몇 분 지나지도 않아 /var/log/auth.log 파일에 무수히 찍히는 SSH 접속 시도 로그를 본 적이 있을 것이다. 세상의 수많은 자동화 스캐너들이 22번 포트를 타깃으로 무차별 대입 공격(Brute Force Attack)을 퍼붓기 때문이다. 다만 대다수의 개발자들은 SSH 기본 포트를 22번 그대로 방치한···
MySQL에 한글이나 이모지를 저장하다가 갑자기 '1366 Incorrect string value for column' 에러가 터진 경험이 있을까. 대부분의 개발자들은 이 에러를 만나면 인코딩 설정이 뭔가 이상하다는 건 알지만, 정확히 어디서 뭘 잘못 설정했는지는 헷갈린다. 데이터베이스 레벨인지, 테이블 레벨인지, 컬럼 레벨인지, 아니면 연결 설정인지 말···
PHP로 데이터베이스 연동 개발을 하다가 WHERE id IN (:ids) 처럼 배열 파라미터를 통째로 바인딩해보았는가? 분명 배열에 여러 개의 PK 값을 넣어서 넘겼는데, 쿼리 결과에는 맨 첫 번째 아이템 하나만 조회되거나 심지어 SQL 구문 에러가 발생하며 멈춰 버리는 상황을 겪어봤을 것이다.다만 대부분의 개발자들은 왜 이런 현상이 발생하는지 정확한 원···
MySQL 8.0으로 업그레이드하거나 서버를 변경한 후 PHP에서 데이터베이스 연결을 시도하면 갑자기 'Client does not support authentication protocol' 에러가 떨어진다. 다만 정확히 뭐가 문제인지, 왜 갑자기 안 되는지 모르는 개발자가 대부분이다. 이번에는 MySQL 8.0의 기본 인증 방식 변화가 뭔지, 왜 이 에러···
SQL 쿼리를 실행할 때 갑자기 ERROR 1064가 튀어나오면 당황스럽다. 특히 복잡한 JOIN이나 서브쿼리를 작성했을 때는 어디가 문제인지 찾기도 힘들다. 다만 대부분의 개발자들은 에러 메시지의 "near ~" 부분을 무시하고, 스택오버플로우에서 임의로 찾은 쿼리를 복사 붙여넣기만 한다. 이번에는 ERROR 1064가 정확히 뭔지, 왜 발생하는지, 그리···
백엔드 서비스를 운영하다가 대량 데이터 업데이트나 트랜잭션 요청이 몰릴 때 ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 에러를 마주친 적이 있을 것이다. 대부분 단순 데이터베이스 과부하로 치부하고 넘어가지만, 정확한 발생 원인과 트랜잭션 잠금 매커니즘을 모르면 동일한 ···
파일 업로드 처리나 서버 리소스 관리 시 특정 파일이 실제로 존재하는지 먼저 확인해야 한다. 대부분의 개발자는 file_exists()나 is_file()을 아무 생각 없이 쓰거나, 둘의 차이를 정확히 모르고 상황에 맞지 않는 함수를 선택해서 버그를 만든다. 심하면 디렉토리인데 is_file()로 체크해서 false가 나오는 게 당연한데 마치 파일이 없다고···
정규표현식으로 이메일이나 전화번호, URL을 검증하려고 preg_match()를 썼는데 자꾸 false가 나온다는 경험을 해본 개발자가 많을 것이다. 코드는 문법적으로 틀린 게 없는데 패턴이 매칭되지 않는 현상은 대부분 메타문자 이스케이프 누락이나 구분자 선택 오류 때문이다. 다만 많은 개발자들이 정규표현식의 문법과 PHP 문자열 이스케이프를 헷갈려서 문제···
웹 애플리케이션을 개발하면서 세션(Session) 기반 로그인을 구현해본 경험은 누구나 있을 것이다. 사용자 인증 상태를 유지하기 위해 필수적인 세션이지만, 기본 설정 그대로 사용하는 개발자가 태반이다. 다만 세션 ID가 네트워크 상에서 유출되거나 탈취당했을 때 발생하는 보안 사고의 위험성을 제대로 아는 경우는 의외로 드물다.실무에서 세션 ID를 탈취하는 ···
PHP 코드를 유지보수하던 중 경고 메시지를 본 적이 있나. 'Call to undefined function mysql_fetch_array()'라는 메시지가 나타나면서 코드가 작동하지 않는 상황을 말이다. 사실 이건 단순한 버그가 아니라 PHP 5.5.0부터 mysql 확장이 공식 폐기되고, PHP 7.0.0부터는 완전히 제거된 결과다. 다만 많은 개발···
MySQL 버전을 5.7 이상으로 업그레이드하거나 서버를 이전한 직후, 기존에 잘 동작하던 SQL 쿼리에서 'ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause' 에러를 만난 적이 있을 것이다. 소스 코드를 건드리지도 않았는데 갑자기 데이터베이스 조회 기능이 터지는 바람에 당···
서버에서 갑자기 PHP 스크립트가 죽어버렸고, 로그에 'Fatal error: Allowed memory size of X bytes exhausted'라는 메시지가 남아있다면 메모리 고갈 문제를 겪고 있는 것이다. 다만 대부분의 개발자들은 memory_limit을 무작정 늘리기만 하고, 정작 왜 메모리가 낭비되는지, 어디서부터 막아야 하는지 모른 채 응급···