서버에서 갑자기 PHP 스크립트가 죽어버렸고, 로그에 'Fatal error: Allowed memory size of X bytes exhausted'라는 메시지가 남아있다면 메모리 고갈 문제를 겪고 있는 것이다. 다만 대부분의 개발자들은 memory_limit을 무작정 늘리기만 하고, 정작 왜 메모리가 낭비되는지, 어디서부터 막아야 하는지 모른 채 응급···
영수증이나 신분증 같은 이미지 파일에서 텍스트를 손수 입력하는 건 정말 귀찮다. 많은 개발자들이 OCR(광학 문자 인식) 기능이 필요하다는 걸 알지만, 대부분 복잡한 라이브러리 설정이나 비용 때문에 망설인다. 다만 국내 개발자라면 네이버 클로바 OCR API를 몰랐을 가능성이 크다. 이번에는 네이버 클로바 OCR의 정확한 사용법, 한글 인식 강점, PHP에···
모니터 크기에 맞춰 디자인한 반응형 웹사이트가 실제 모바일에서는 엉망으로 보인다. 미디어 쿼리 코드는 분명히 제대로 썼는데 왜 작동 안 할까. 대부분의 개발자들은 CSS 파일만 들었다 놨다 하면서 시간을 낭비한다. 실제로는 HTML 구조, 뷰포트 설정, CSS 캐싱, 선택자 우선순위 같은 여러 요인이 복합적으로 작용한다. 이번에는 미디어 쿼리가 작동하지 않···
모바일 사용자가 검색 결과에서 당신의 사이트를 클릭했는데, 데스크톱 레이아웃이 그대로 축소되어 표시되거나 아예 페이지를 찾을 수 없다는 오류가 나타나본 적이 있을까? 대부분의 개발자들은 모바일 최적화가 단순히 CSS 미디어 쿼리 몇 줄이면 된다고 생각하지만, 실제로는 HTML 메타 태그 설정부터 검색 엔진이 인식하는 모바일 페이지 구조까지 여러 단계를 거쳐···
검색 결과 페이지를 보면 사이트 제목 아래 회색 텍스트로 2~3줄 정도의 설명이 나타난다. 바로 메타 설명(Meta Description)이다. 이 짧은 텍스트가 사용자의 클릭 여부를 크게 좌우하는데, 많은 개발자들은 이걸 제대로 설정하지 않거나 검색 엔진이 임의로 생성하도록 방치한다. 구글이 자동으로 뽑은 설명은 맥락과 맞지 않아 클릭률을 떨어뜨리는 주요···
개발하다 보면 쉼표로 구분된 문자열을 배열로 만들거나, 배열의 요소들을 하나의 문자열로 합쳐야 할 일이 자주 생긴다. 대부분의 PHP 개발자는 implode()와 explode()를 써봤을 테지만, 매개변수 순서를 헷갈리거나 null/빈 배열 처리에서 예상과 다른 결과를 만나곤 한다. 이번에는 이 두 함수의 정확한 동작 방식, 실무에서 자주 벌어지는 실수,···
검색 결과를 보다 보면 내 사이트 제목이 중간에 끊겨서 '...'으로 표시되는 경우가 있다. 구글은 데스크톱에서 약 60글자, 모바일에서 약 50글자 범위 내에서 제목을 표시하는데, 많은 개발자들이 이 기준을 모르고 80글자 이상의 긴 제목을 작성한다. 문제는 제목이 잘리는 것뿐 아니라, 중요한 키워드가 뒷부분에 숨어버려 검색 트래픽이 줄어든다는 점이다. ···
내 웹사이트가 구글에 제대로 색인되고 있는지 확인하려면 어떻게 해야 할까. 많은 개발자들이 Search Console 대시보드의 수치만 바라보다가, 정작 특정 URL이 왜 색인되지 않는지는 알 수 없는 상황을 경험한다. Google Search Console의 URL 검사 도구는 개별 페이지의 색인 상태를 상세히 진단하고, 즉시 크롤링을 요청할 수 있는 강···
GitHub에서 저장소 정보를 조회하거나 이슈를 자동으로 생성해야 하는 상황을 경험해봤을까. 단순히 웹사이트에서 수동으로 클릭하는 것보다 API를 통해 자동화하면 훨씬 효율적이다. 다만 대부분의 개발자들은 GitHub API 인증 방식이 여러 개인 것을 모르고, 레이트 제한에 걸려서 당황하거나, 응답 형식을 제대로 파싱하지 못해 헤맨다. 이번 글에서는 Gi···
웹 레이아웃을 짤 때 Grid를 써야 하나 Flexbox를 써야 하나 고민한 적 있을까. 대부분의 개발자들은 둘 다 '정렬된 박스들'이라고 생각해서 그냥 익숙한 것만 쓰거나, 구글에서 답을 찾아서 복사-붙여넣기한다. 다만 두 방식은 근본적으로 다른 목적을 가지고 있고, 어떤 상황에서 어느 것을 쓰느냐에 따라 코드 복잡도와 유지보수성이 완전히 달라진다. 이번···
마이그레이션이나 테이블 생성 시 갑자기 나타나는 'Specified key was too long' 에러를 경험해봤을까? 인덱스나 기본키를 설정하려는데 컬럼 길이가 너무 길다며 생성이 거부되는 상황이다. 다만 대부분의 개발자들은 이 제한이 정확히 어디서 비롯되었는지, 왜 필요한지, 어떻게 해결해야 하는지 모른 채 컬럼 길이를 무작정 줄이거나 인덱스를 포기해···
프로젝트에서 Jest 스냅샷 테스트를 도입했는데, 코드를 조금만 수정해도 자꾸 실패한다는 불평을 팀원들에게서 자주 듣는다. 심지어 실제로 버그가 아닌데도 스냅샷만 갱신하는 데 시간을 쓰고 있진 않나. 스냅샷 테스트는 컴포넌트 렌더링 결과나 API 응답을 자동으로 기록했다가, 이후 변경을 감지하는 강력한 도구다. 다만 올바른 사용법을 모르면 거짓 양성(fal···
배열에서 특정 조건을 만족하는 요소만 남기고 싶을 때 반복문으로 일일이 처리한 경험이 있을까. 다만 대부분의 개발자들은 array_filter()의 정확한 동작 방식과 콜백 함수의 세 번째 인자가 뭔지 모른 채 단순 반복문만 사용하곤 한다. 이번에는 array_filter()의 원리부터 시작해서 실전 필터링 패턴까지 완벽하게 정리해서 소개하겠다. array···
파일 업로드 폼을 만들었는데 $_FILES 배열이 텅 비어있다. 백엔드 코드는 멀쩡한데 왜 자꾸 파일이 안 넘어오는 걸까. 대부분의 개발자들은 이 상황에서 PHP 코드만 디버깅하다가 며칠을 낭비한다. 사실 $_FILES 배열이 비는 원인은 PHP 설정, HTML 폼 속성, 서버 리소스 등 여러 곳에 숨어있다. 이번에는 실무에서 직접 겪은 $_FILES 배열···
검색엔진에 제출한 사이트가 한 달이 지났는데도 검색 결과에 나타나지 않는 경험을 해봤을까. 웹사이트를 만들고 구글에 등록했으면 당연히 검색되어야 한다고 생각하지만, 실제로는 크롤링, 색인, 순위결정이라는 여러 단계를 거쳐야 한다. 다만 대부분의 개발자들은 이 과정 중 어느 단계에서 문제가 생겼는지 정확히 파악하지 못한 채 답답해한다. 이번에는 Google ···
Flexbox를 처음 배울 때 가장 헷갈리는 부분이 뭘까. 아마도 여러 정렬 속성들이 정확히 언제, 어느 축에서 동작하는지 구분하지 못하는 것일 거다. justify-content, align-items, align-self가 각각 뭐 하는 건지, 그리고 왜 원하는 방향으로 정렬이 안 되는지 모르는 채 속성값을 이것저것 막 바꿔보던 경험 말이다. 다만 대부···
서비스 사용자가 급증하거나 트래픽이 몰릴 때 갑자기 서비스 전체가 먹통이 되면서 FATAL: sorry, too many clients already라는 PostgreSQL 에러 로그를 마주해본 적이 있을 것이다. 백엔드 서버는 정상인데 데이터베이스 연결이 거부되어 모든 API 요청이 500 에러를 뿜어내는 아찔한 상황이다.다만 대부분의 개발자들은 이 에러···
PHP 프로젝트를 운영하다 보면 갑자기 화면이 하얀 페이지로 변하고 에러 로그에 'Uncaught Exception' 메시지가 쌓이는 경험을 해봤을 것이다. 사용자는 아무것도 볼 수 없고, 개발자는 어디서 뭐가 잘못됐는지 알 수 없는 답답한 상황이다. 다만 대부분의 개발자들은 이 예외가 정확히 뭐고, 왜 발생하며, 어떻게 처리해야 하는지 제대로 모른 채로 ···