프론트엔드
Next.js 15 서버 컴포넌트 분리 전략
App Router 환경에서 서버 컴포넌트와 클라이언트 컴포넌트를 분리하는 핵심 원칙은 간단하다. 데이터 패칭과 SEO 관련 렌더링은 서버 컴포넌트에, 사용자 인터랙션(클릭, 입력, 상태 관리)은 클라이언트 컴포넌트에 배치한다. 실무에서 가장 많이 실수하는 부분은 서버 컴포넌트 안에서 useState나 useEffect를 호출하는 것이다. 이를 방지하려면 인터랙티브 요소를 별도 파일로 추출하고 "use client" 지시어를 상단에 선언하면 된다. 또한 서버 컴포넌트에서 클라이언트 컴포넌트로 데이터를 props로 내려주는 패턴(Server-to-Client Composition)을 활용하면, 불필요한 클라이언트 번들 크기를 줄이면서도 인터랙션을 유지할 수 있다.
백엔드
PostgreSQL 파티셔닝으로 로그 테이블 성능 개선
수억 건의 로그 데이터를 단일 테이블에 보관하면 쿼리 성능이 급격히 떨어진다. PostgreSQL의 선언적 파티셔닝(Declarative Partitioning)을 사용해 월별로 테이블을 분리하면, 특정 기간 조회 시 해당 파티션만 스캔하므로 성능이 10배 이상 개선된다. 구현 방법: CREATE TABLE logs (...) PARTITION BY RANGE (created_at) 으로 부모 테이블을 만들고, CREATE TABLE logs_2026_02 PARTITION OF logs FOR VALUES FROM ('2026-02-01') TO ('2026-03-01') 으로 월별 자식 테이블을 생성한다. pg_cron 확장을 활용하면 매월 1일 자동으로 다음 달 파티션을 생성하는 스케줄도 등록할 수 있다.
인프라
Docker Compose 로컬 개발환경 한 방 세팅
docker-compose.yml 하나로 PostgreSQL, Redis, Elasticsearch를 동시에 띄울 수 있다. 핵심 설정: depends_on으로 서비스 간 의존성을 명시하고, volumes로 데이터 영속성을 확보한다. healthcheck를 설정하면 DB가 완전히 준비된 후에 앱 컨테이너가 시작되도록 순서를 보장할 수 있다. 환경변수는 .env 파일로 분리하고 docker-compose.yml에서 env_file로 참조하면 비밀값이 버전 관리에 포함되지 않는다. 개발 시에는 docker compose watch를 활용하면 소스 코드 변경 시 자동으로 컨테이너가 재시작되어 핫 리로드와 유사한 경험을 얻을 수 있다.