클라우드플레어는 어떻게 스스로를 무너뜨렸나 코드 한 줄보다 무서운 것 세계 최강의 인터넷 방패로 불리는 클라우드플레어(Cloudflare)가 다운되는 초유의 사태가 있었는데요.초당 수십 테라비트의 디도스(DDoS) 공격도 우습게 막아내던 바로 그 회사였습니다.전 세계 IT 업계가 '대체 무슨 일이냐'며 술렁였던 것도 당연했거든요.모두가 역사에 기록될 만한 거대한 사이버 공격을 예상했습니다.그런데 막상 뚜껑을 열어보니, 범인은 예상치 못한 곳에 있었는데요.외부의 적이 아니라, 가장 기본적인 코딩 실수 하나가 스스로를 공격한 '자체 디도스(Self-DDoS)'였습니다.개발자라면 누구나 한 번쯤 저질러봤을 법한 리액트(React)의 '무한 루프' 실수가 그 원인이었거든요.하지만 오늘 우리가 파고들 이야기는 이..
Vite에서 import.meta.env 타입 에러 해결하기! 5분이면 끝나는 완벽 가이드문제 상황비트(Vite)로 리액트와 타입스크립트 프로젝트를 개발하던 중에 환경변수를 사용하려고 했는데요.갑자기 이런 에러 메시지가 떴습니다.// 예시 코드const apiUrl = import.meta.env.VITE_API_URL; ^ 에러: Property 'env' does not exist on type 'ImportMeta'.환경변수를 불러오려고 했을 뿐인데 타입스크립트가 'import.meta.env'를 인식하지 못하는 거죠.처음엔 당황했지만, 생각보다 간단한 방법으로 해결할 수 있었습니다. 타입 단언으로는 해결이 안 되더라고요구글링을 해보니 타입 단언(..
React useEffect와 의존성 배열 완벽 정리! 무한 루프 피하는 꿀팁까지리액트를 배우다 보면 'useEffect'를 제대로 이해하는 게 정말 중요한데요.오늘은 이 훅을 완벽하게 마스터하기 위한 핵심 내용들을 정리해보겠습니다.제가 이번에 집중적으로 학습한 내용은 다음과 같은데요.첫째로 'useEffect'의 기본 사용법을 확실히 익히고, 둘째로 의존성 배열이 정확히 어떤 역할을 하는지 이해하는 겁니다.셋째로는 API에서 데이터를 가져와서 state에 저장하는 실전 패턴을 익히고, 마지막으로 로딩이나 에러 처리까지 포함한 완벽한 부작용 처리 방법을 배우는 거죠. useEffect가 뭐길래 이렇게 중요할까?'useEffect'는 리액트에서 제공하는 훅 중 하나인데요.리액트 컴포넌트가 '화면에 그려진 ..
Prisma 마이그레이션 중 EPERM 에러가 뜬다면? 5분만에 해결하는 방법갑자기 마주친 에러 상황프리즈마(Prisma)로 데이터베이스 스키마를 수정하고 있었는데요.평소처럼 prisma migrate dev 명령어를 실행했더니 갑자기 이런 에러 메시지가 떴습니다.EPERM: operation not permitted, ~~~~~~~~~~(디렉토리 경로)처음 보는 에러라 당황했지만, 다행히 간단한 방법으로 해결할 수 있었거든요.오늘은 제가 이 문제를 해결한 방법을 공유해보려고 합니다. 실제로 효과를 본 해결 방법크게 두 가지 방법을 시도했는데요.사실 두 방법을 동시에 적용해서 정확히 어떤 것이 직접적인 해결책이었는지는 모르겠지만, 어쨌든 문제는 깔끔하게 해결됐습니다.방법 1. node_modules 폴더..
자바스크립트 코드 이제 TPO에 맞게 쓰세요, 클린 코드를 위한 36가지 팁코딩을 하다 보면 '일단 돌아가게 만들자'는 생각에 급급할 때가 참 많은데요.하지만 기능 구현에 성공한 뒤 코드를 다시 돌아보면, 어딘가 모르게 찜찜하고 비효율적으로 보이는 순간이 분명히 찾아옵니다.마치 옷을 입을 때 시간(Time), 장소(Place), 상황(Occasion) 즉 TPO를 고려하는 것처럼, 우리 코드도 상황에 맞게 더 간결하고, 더 우아하고, 더 효율적으로 작성할 필요가 있거든요.오늘은 제가 오랫동안 알고리즘 문제를 풀고 여러 프로젝트를 거치며 차곡차곡 모아온, 코드의 'TPO'를 제대로 맞춰주는 자바스크립트 팁들을 대방출하려고 합니다.1부 가독성 한 스푼 코드는 짧고 의미는 명확하게좋은 코드의 첫 번째 조건은 ..
Object.entries에 as 쓰시는 분, 잠시만요TypeScript 프로젝트에서 객체를 다루다 보면 Object.keys, Object.values, Object.entries를 정말 자주 사용하게 되는데요.키 목록을 가져오거나, 값 목록을 가져오거나, 혹은 둘 다 한 번에 가져올 때 아주 유용한 친구들입니다.그런데 Object.keys나 Object.entries를 썼을 때, TypeScript가 반환해 주는 키의 타입이 언제나 string으로 나오는 걸 보고 고개를 갸웃한 적 없으신가요?분명 우리 객체에는 'foo'나 'bar' 같은 아주 구체적인 키만 들어있는 게 확실하거든요.하지만 TypeScript는 이 사실을 모르는 척, 그냥 아주 넓은 의미의 string이라고만 알려주는 셈입니다.con..