개발하다 보면 더 이상 필요 없는 변수나 배열 요소를 삭제해야 할 상황이 자주 생긴다. 대부분의 개발자는 단순히 `unset()`을 호출하면 된다고 생각하지만, 실제로는 메모리 해제 시점, 배열 구조 변화, 그리고 반복문 내에서의 예상치 못한 동작까지 신경 써야 할 게 많다. 이번에는 `unset()`의 정확한 동작 원리부터 실전에서 자주 하는 실수까지 완···
프로젝트에서 Jest 스냅샷 테스트를 도입했는데, 코드를 조금만 수정해도 자꾸 실패한다는 불평을 팀원들에게서 자주 듣는다. 심지어 실제로 버그가 아닌데도 스냅샷만 갱신하는 데 시간을 쓰고 있진 않나. 스냅샷 테스트는 컴포넌트 렌더링 결과나 API 응답을 자동으로 기록했다가, 이후 변경을 감지하는 강력한 도구다. 다만 올바른 사용법을 모르면 거짓 양성(fal···
파일 업로드 폼을 만들었는데 $_FILES 배열이 텅 비어있다. 백엔드 코드는 멀쩡한데 왜 자꾸 파일이 안 넘어오는 걸까. 대부분의 개발자들은 이 상황에서 PHP 코드만 디버깅하다가 며칠을 낭비한다. 사실 $_FILES 배열이 비는 원인은 PHP 설정, HTML 폼 속성, 서버 리소스 등 여러 곳에 숨어있다. 이번에는 실무에서 직접 겪은 $_FILES 배열···
PHP 개발자라면 누구나 한 번쯤 마주친 에러가 있다. 'Warning: Cannot modify header information - headers already sent by'라는 메시지. 특히 로그인 처리나 세션 설정을 하려고 session_start()를 호출할 때 이 오류가 터진다. 하지만 대부분의 개발자들은 이 에러가 왜 발생하는지, 정확히 어디···
PHP 개발자라면 strtotime() 함수로 날짜 문자열을 Unix 타임스탬프로 변환하려다 예상과 다른 결과를 얻은 경험이 있을 것이다. "2024-01-15 14:30:00"을 파싱했는데 엉뚱한 값이 나오거나, 특정 날짜 형식에서는 아예 false가 반환되기도 한다. 다만 대부분의 개발자들은 왜 이런 일이 발생하는지 정확히 모른 채 그냥 date() 함···
Node.js 개발자라면 누구나 "비동기 논블로킹"이라는 말을 들어봤을 것이다. 다만 대부분의 개발자들은 이벤트 루프가 정확히 어떻게 동작하는지, 왜 어떤 콜백은 먼저 실행되고 어떤 콜백은 나중에 실행되는지 정확히 알지 못한 채 코드를 작성한다. 그러다 보니 예상 밖의 타이밍 이슈나 성능 병목이 생겨도 원인을 파악하기 어렵다. 이번에는 Node.js 이벤트···
신규 기능을 오픈하거나 대규모 이벤트를 앞두고 내 백엔드 API가 과연 몇 명의 동시 접속자를 견딜 수 있는지 궁금했던 적이 있을 것이다. 다만 정확한 한계 수치나 성능 병목 지점을 모른 채 서비스부터 오픈했다가, 트래픽이 몰려 서버가 다운되고 피를 보는 경우가 많다.이번에는 가벼우면서도 강력한 부하 테스트 도구인 k6가 정확히 무엇이고, 왜 필요한지, 그···
웹 서버에 접근할 때 사용자명과 비밀번호를 입력하는 팝업 창을 본 적 있을까. 그것이 HTTP Basic Authentication이다. 대부분의 개발자들은 이 방식이 웹 서버(Nginx, Apache) 설정에서만 가능하다고 생각해서, 애플리케이션 레벨에서 구현할 생각을 안 한다. 하지만 PHP 코드 내에서 직접 Basic Auth를 검증하고 제어할 수 있···
PHP 코드를 작성하여 배포한 직후 런타임 환경에서 TypeError나 Call to a member function on null 에러가 발생해 급하게 핫픽스를 배포했던 경험이 있으신가요? 단순한 문법 검사(Lint)만으로는 실제 코드가 실행되는 시점에 발생하는 타입 불일치나 잠재적인 비즈니스 로직 버그를 미리 잡아내기 어렵습니다. 다만 대부분의 백엔드 ···
백엔드 로직 하나 수정하고 포스트맨으로 일일이 엔드포인트를 호출하며 테스트했던 경험이 있을 것이다. 코드가 복잡해질수록 수정 위치와 멀리 떨어진 다른 API가 갑자기 터지는 사이드 이펙트를 일일이 손으로 찾아내기는 사실상 불가능에 가깝다. 다만 정확한 테스트 환경 구축 방법이나 데이터베이스 Mocking 처리 기준을 모르는 경우가 많다. 이번에는 Jest와···
SNS에 글을 공유할 때 예쁜 썸네일이 나오는 경우와 나오지 않는 경우를 본 적 있을까. 대부분의 개발자는 Open Graph 메타태그만 넣고, 이미지를 하드코딩된 파일 경로로 고정해둔다. 하지만 게시글마다 다른 제목, 날짜, 카테고리 정보를 담은 썸네일을 동적으로 생성할 수 있다면 훨씬 더 프로페셔널한 SNS 공유 경험을 만들 수 있다. 이번에는 PHP의···
수동으로 브라우저를 켜고 회원가입부터 결제 페이지까지 일일이 클릭하며 테스트하다 지친 경험이 있을 것이다. 다만 막상 E2E(End-to-End) 테스트 자동화를 도입하려 해도 Cypress와 Playwright 중 어떤 도구를 골라야 할지 몰라 망설이는 개발자가 많다. 이번에는 두 도구가 정확히 어떻게 다른지, 왜 필요한지, 그리고 실제 프로젝트에 어떻게···
백엔드 API 개발이 늦어져 프론트엔드 화면 구현이나 단위 테스트를 진행하지 못하고 무작정 기다린 경험이 있을 것이다.다만 정식 API가 나올 때까지 컴포넌트 내부에 임시 데이터를 하드코딩하거나 fetch 함수를 직접 수정하는 방식은 나중에 코드를 정리할 때 버그를 유발하기 쉽다.이번에는 네트워크 계층에서 실제 HTTP 요청을 가로채는 MSW(Mock Se···
웹 서비스를 개발하며 회원 시스템을 구축할 때 사용자의 비밀번호를 md5나 sha256으로 단순 해싱해서 DB에 저장해 본 경험이 있을까? 다만 대다수 개발자가 솔트(Salt)의 정확한 개념이나 Bcrypt 알고리즘의 필요성을 모른 채 인터넷 블로그의 구형 코드를 그대로 복사해 붙이는 경우가 많다. 이번에는 PHP에서 제공하는 password_hash()와···
PHP로 배열을 다루다 보면 특정 키가 존재하는지, 값이 있는지 확인해야 할 순간이 자주 온다. 다만 대부분의 개발자들은 isset(), array_key_exists(), in_array() 세 함수의 차이를 명확히 모른 채 상황에 맞지 않는 함수를 써서 버그를 만든다. 이번에는 이 세 함수가 정확히 뭐가 다르고, 언제 어떤 걸 써야 하는지, 그리고 각각···
PHP에서 파일을 include하거나 설정 파일을 로드할 때, 경로를 잘못 지정해서 골치 아파본 경험이 있을까? 특히 다른 폴더 구조의 서버로 이사할 때 갑자기 파일을 못 찾는 에러가 터진다. 다만 대부분의 개발자들은 상대경로와 절대경로의 차이를 정확히 모른 채 인터넷에서 가져온 코드를 그냥 복사해 붙인다. 이번에는 __FILE__과 __DIR__ 상수가 ···
웹 서비스를 이용할 때 사용자가 여러 브라우저 탭을 열어두고 한쪽에서 로그아웃을 하거나 장바구니 품목을 변경했는데, 다른 탭에는 기존 정보가 그대로 남아있어 오작동하는 문제를 경험해봤을 것이다.다만 많은 개발자들이 탭 간 실시간 데이터 동기화를 어떻게 깔끔하게 구현해야 하는지 정확한 방법과 원리를 모른 채 복잡한 WebSockets나 localStorage···
웹 애플리케이션에서 수만 건의 JSON 데이터를 가공하거나 복잡한 연산을 수행할 때 브라우저 화면이 완전히 얼어붙어 클릭조차 되지 않는 현상을 경험해봤을까? 웹 서비스를 개발하다 보면 한 번쯤 마주치는 대표적인 UI 멈춤(Freezing) 현상이다.다만 대부분의 개발자들은 자바스크립트가 싱글 스레드로 동작한다는 점을 잊고, 단지 setTimeout이나 Pr···