archive
App Router: 서버 컴포넌트, 제약사항과 주의점
개발을 하다 보면 웬만한 건 다 안다고 생각할 때가 있는데, 기술은 정말 끝이 없다. 최근 Next.js의 App Router로 마이그레이션을 진행하면서 수많은 "빨간 줄(에러)"과 싸웠다.단순히 "서버에서 렌더링 된다"를 넘어서, 도대체 뭘 쓸 수 있고 뭘 쓸 수 없는지, 그리고 "실수하기 딱 좋은 함정"들이 무엇인지, 내가 겪은 시행착오를 바탕으로 상세하게 정리해 본다.1. 서버 컴포넌트(RSC), 다시 보자기본 개념은 간단하다. "서버에서 돌고, 결과물(HTML/JSON)만 브라우저로 보낸다." 하지만 이게 가져오는 파급력은 생각보다 크다.
왜 굳이 이걸 쓸까? (장점 심화)Zero Bundle Size: 서버 컴포넌트 내부에서만 쓰이는 라이브러리(예: 마크다운 파서, 날짜 변환기 등)는 브라우저 번들에 포함되지 않는다.보안: API Key나 민감한 토큰이 브라우저로 노출될 일이 없다. 서버에서 다 처리하니까.2. 절대 쓰면 안 되는 것들 (제약 사항)서버 컴포넌트는 리액트 컴포넌트지만, "리액트 훅(Hook)"을 쓸 수 없다. 이 부분이 가장 헷갈렸다.
2-1. State와 Lifecycle 관련 Hooks 사용 불가
서버는 요청을 받으면 컴포넌트를 한 번 딱 실행해서 결과를 보내고 끝이다. "상태(State)"를 유지하거나, "마운트 된 후(Effect)"라는 개념 자체가 없다.useState, useReducer (X)useEffect, useLayoutEffect (X)useRef (X) - 렌더링 결과물에 영향 없는 변수는 쓸 수 있지만, DOM 접근용으론 불가.
2-2. 브라우저 전용 API 사용 불가
서버(Node.js 환경)에서 돌기 때문에 브라우저 객체는 당연히 없다.window, document, navigator (X)localStorage, sessionStorage (X)onClick, onChange 같은 이벤트 핸들러 (X)3. 실수하기 딱 좋은 포인트 (주의점 & 패턴)이론은 알겠는데 막상 코드를 짜다 보면 마주치는 에러들이다.주의점 1: Props 직렬화(Serialization) 문제
서버 컴포넌트에서 클라이언트 컴포넌트로 데이터를(props) 넘길 때, 그 데이터는 반드시 네트워크를 탈 수 있는 형태(직렬화 가능)여야 한다.가능: string, number, array, object (JSON 가능한 것들)
2025. 12. 26