GG FACTORY 개발팀의 기술 경험과 노하우를 공유합니다.
Next.js의 `app/sitemap.ts`를 오랜만에 다시 봤는데, 코드가 대략 이런 모양이었다. export default function sitemap(): MetadataRoute.Sitemap { const now = new Date() return [ {...
Next.js로 기존 프로젝트를 마이그레이션하면서 가장 많이 놓치는 파일이 loading.tsx입니다. 단순히 "로딩 스피너를 보여주는 파일" 정도로 인식하고 넘어가기 쉽지만, 실제로는 React Suspense와 결합된 스트리밍 렌더링의 진입점 역할을 하는 핵심 파일...
Lighthouse로 프로덕션 서비스를 감사하다 보면 Best Practices 항목에서 감점이 발생하는 경우가 많습니다. 대부분의 원인은 보안 헤더 미설정입니다. 최근 코드 리뷰 중 next.config.ts에 보안 헤더가 전혀 설정되어 있지 않은 프로젝트를 발견했습...
들어가기 전에 ISR에 대한 간단한 설명 ISR(Incremental Static Regeneration)은 Next.js의 렌더링 전략 중 하나다. 이름이 길지만 개념은 단순하다. 빌드 시점에 정적 HTML을 미리 만들어두되, 일정 시간이 지나면 백그라운드에서 조용히...
웹앱을 운영하면서 마주한 가장 큰 숙제는 "느리다"는 사용자 피드백과, SEO 성과 지표에서 조용히 쌓여가던 크롤링 오류입니다. 원인을 추적해 보니 세 가지 지표가 서로 맞물려 있었습니다. TTFB(Time To First Byte), 캐시 적중률, 그리고 검색 봇 재...
MongoDB Atlas를 쓰다 보면 컬렉션 화면에서 `Indexes`와 `Search Indexes`라는 두 가지 메뉴를 보게 된다. 이름이 비슷해서 같은 기능의 확장판처럼 느껴질 수 있지만, 실제로는 해결하는 문제가 꽤 다르다. 특히 검색 기능을 붙이려는 시점에는 ...
웹사이트나 앱을 만들려면 "서버"라는 게 필요합니다. 서버는 쉽게 말해 여러분의 서비스를 24시간 돌려주는 컴퓨터입니다. 카페로 비유하면, 손님(사용자)이 언제 와도 커피를 내려줄 수 있도록 항상 켜져 있는 커피머신과 같습니다. 그런데 문제가 있습니다. 이 커...
우선 글을 작성하게 된 이유는 많은 분들이 Cursor Save As에 대해서 검색을 하시길래 작성해봤습니다. "버전 관리는 Git이 다 해주는데, 굳이 '다른 이름으로 저장(Save As)'을 쓸 일이 있을까?" 의문도 존재하지만 Git Repository를 세탕...
이번에 정말 충격적인 사건이 터졌습니다. 전 세계에서 가장 많이 쓰이는 HTTP 클라이언트 라이브러리 axios가 npm 공급망 공격을 당했습니다. 이번 공격은 단순한 버그가 아니라, maintainer 계정을 해킹해 악성 버전을 직접 배포한 전형적인 Supply ...
사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...