웹 서비스를 운영하다가 갑자기 브라우저 화면에 502 Bad Gateway 경고가 뜨는 난감한 상황을 경험해봤을까? 당황해서 일단 Nginx나 PHP 프로세스를 무작정 재시작하여 임시로 넘어가는 경우가 많다. 다만 원인을 정확히 찾지 못하면 트래픽이 몰리거나 서버가 재부팅될 때마다 동일한 장애가 계속 반복된다.이번에는 Nginx 502 Bad Gateway···
PHPUnit으로 단위 테스트를 작성하고 코드 커버리지(Code Coverage)를 측정할 때, 테스트 실행 시간이 터무니없이 길어져 지루하게 기다린 경험이 있을 것이다.다만 대부분의 개발자들은 이 병목의 원인이 Xdebug의 디버깅 오버헤드 때문이라는 점과 이를 대체할 수 있는 전용 라이브러리가 존재한다는 사실을 잘 모른다.이번에는 PHPUnit 커버리지···
개발자라면 한 번쯤 문자열 치환 작업으로 골머리를 앓아본 경험이 있을 것이다. 특히 대용량 파일이나 HTML 템플릿을 다룰 때 str_replace() 함수를 무분별하게 사용하면 메모리가 급증하고 속도가 급격히 떨어진다. 다만 대부분의 개발자들은 이게 함수 자체의 문제인지, 아니면 사용 방식의 문제인지 구분하지 못한 채 단순히 '느리다'고만 느낀다. 이번에···
Java 백엔드 개발자라면 한 번쯤 Elasticsearch를 붙여본 경험이 있을 거다. 다만 Spring Boot 프로젝트에서 Elasticsearch RestClient를 설정하는 순간 'Connection refused' 에러가 뜨면서 벽에 부딪히는 경우가 많다. 포트 번호가 틀렸나, 서버가 안 떠있나, 아니면 설정이 잘못됐나 하면서 무작정 인터넷에서···
서버 장애 발생이나 주요 비즈니스 이벤트 발생 시 슬랙(Slack) 채널로 실시간 알림을 발송하는 기능은 백엔드 시스템의 필수 요소다. 다만 Slack Incoming Webhook URL을 설정하고 단순 텍스트를 보냈는데 HTTP 400 에러가 발생하거나, 특수문자 이스케이프 미처리로 메시지 본문이 깨져 알림 수신에 실패하는 경우가 많다. 이번에는 Sla···
웹사이트에 카테고리 페이지나 게시글을 작성한 뒤 구글 검색 결과를 확인했을 때, URL 주소가 길고 지저분하게 출력되는 경험을 해봤을 것이다. 대부분 홈 페이지부터 현재 위치까지 연결되는 빵부스러기(Breadcrumb) 스니펫이 멋지게 나올 것으로 기대하지만, 실제로는 파라미터가 뒤엉킨 긴 URL 그대로 노출되는 경우가 많다. 다만 많은 개발자들이 이를 해···
배열을 다룰 때 여러 배열을 하나로 합치거나 키-값을 매핑해야 할 일이 자주 생긴다. 그런데 array_merge(), array_combine(), array_replace() 중 어떤 함수를 쓸지 정하지 못해 삽질하는 개발자가 많다. 각 함수가 겹치는 부분도 있고, 미묘한 차이가 있어서 상황에 맞지 않는 함수를 쓰면 예상 밖의 결과가 나온다. 이번에는 ···
이미지 처리가 필요한 PHP 프로젝트에서 갑자기 imagecreatefromjpeg() 함수가 작동하지 않는 경험을 해봤을까. 대부분의 개발자는 파일 경로나 JPEG 파일 형식 문제만 의심하고, 실제 원인인 GD 라이브러리 미설치나 JPEG 지원 부재를 놓친다. 이번에는 imagecreatefromjpeg() 함수가 정확히 뭔지, 왜 실패하는지, 어떻게 완···
서비스 내에서 화상 상담이나 온라인 강의를 자동화하기 위해 Zoom 미팅을 백엔드 시스템과 연동해야 했던 적이 있을 것이다.다만 기존의 단순했던 JWT(JSON Web Token) 인증 방식이 공식 폐기되고 Server-to-Server OAuth 인증 구조로 변경되면서 토큰 발급 과정에서 오류를 겪는 경우가 많다.이번에는 Zoom Server-to-Ser···
데이터베이스에서 조회한 결과를 배열로 받을 때 mysqli_fetch_array()를 쓰는 개발자가 많다. 다만 대부분은 세 번째 매개변수(fetch_mode)가 뭔지, 왜 있는지 모르고 그냥 기본값으로 방치한다. 결과적으로 배열에서 값을 꺼낼 때 숫자 인덱스로도, 컬럼명으로도 접근할 수 있어서 혼동하거나, 불필요한 메모리를 낭비하거나, 코드의 의도가 불명···
카톡으로 페이지를 공유하는 버튼을 웹사이트에 달고 싶은데, 공식 문서를 봐도 JavaScript 예제만 있고 PHP 백엔드에서 어떻게 처리해야 하는지 감이 잡히지 않는 경험을 해봤을까. 대부분의 개발자들은 프론트엔드의 카톡 공유 SDK만 설정하고, 서버에서 실제로 전송되는 데이터나 검증 로직을 제대로 구현하지 못한 채로 넘어간다. 이번에는 카카오톡 공유 A···
테스트 코드를 작성하다가 입력값만 살짝 바꿔가며 유사한 검증 메서드를 수십 번 반복 작성해 본 적이 있을 것이다.다만 대부분의 개발자들은 단순 복사 붙여넣기로 테스트 케이스를 늘리다가 유지보수가 불가능할 정도로 파일이 무거워지는 문제의 원인을 모르는 경우가 많다.이번에는 PHPUnit의 DataProvider가 정확히 뭔지, 왜 필요한지, 어떻게 적용하여 ···
서버 메모리가 갑자기 100%에 도달하면서 MySQL이나 PHP-FPM 프로세스가 무응답으로 종료되는 현상을 경험해봤을 것이다.로그 파일에도 특별한 에러 메시지 없이 서비스가 그냥 죽어버려 당황했던 적이 많다.다만 대부분의 개발자들은 정확한 원인이 리눅스 커널의 OOM Killer 작동 때문이라는 점과 이를 방지하는 Swap 메모리 설정법을 잘 모른다.이번···
React나 Vue 같은 프레임워크로 멋지게 개발한 SPA 웹사이트를 오픈했는데 구글 검색 결과에 빈 페이지가 뜨거나 색인이 아예 생기지 않는 현상을 경험해봤을 것이다.다만 대부분의 개발자들은 '구글 크롤러는 자바스크립트를 잘 실행해주니까 문제없겠지'라고 막연하게 생각하다가 검색 노출이 통째로 날아간 뒤에야 원인을 찾기 시작한다.이번에는 클라이언트 사이드 ···
PHP에서 문자열을 일정한 길이의 배열로 쪼갤 때 str_split()을 흔히 사용한다. 다만 대부분의 개발자들은 한글이나 이모지 같은 멀티바이트 문자를 처리할 때 예상과 다른 결과를 얻으며, 청크 길이 설정이 정확히 뭐하는 건지 모른 채 인터넷에서 가져온 코드를 그냥 복사해 붙인다. 이번에는 str_split()이 정확히 뭔지, 왜 문제가 생기는지, 어떻···
웹 페이지를 만들다 보면 요소의 너비와 높이를 정했는데 레이아웃이 자꾸 깨진다는 경험이 흔하다. 특히 padding이나 border를 추가했을 때 요소가 예상보다 커지는 현상을 겪는 개발자들이 많다. 다만 이 문제의 정확한 원인과 해결책을 제대로 아는 사람은 드물다. 이번에는 CSS Box Model이 정확히 뭔지, 왜 계산 오류가 발생하는지, box-si···
E2E 테스트를 실행할 때마다 성공과 실패를 오가는 간헐적 테스트 실패(Flaky Test)를 경험해봤을까?로컬 개발 환경에서는 100% 통과하던 테스트가 GitHub Actions나 Jenkins 같은 CI 파이프라인만 타면 허망하게 에러를 뱉는 상황을 자주 겪는다.다만 많은 개발자가 이 문제를 해결하겠다고 cy.wait(5000) 같은 임의의 대기 시간···
신규 페이지를 올렸는데 며칠이 지나도 검색 결과에 안 뜬다. Google Search Console에 접속해보니 '발견됨'이라고는 하는데 색인이 생성되지 않은 상태다. 혹시 서버 문제가 있나 싶어 robots.txt도 확인하고, 메타 태그도 다시 점검했지만 여전하다. 개발자들은 보통 이 상황에서 멍하니 대기하거나, 무작정 재크롤링만 요청한다. 다만 대부분은···