INDEX
<aside>
📌 내 손 안의 작은 전시회, Esthète
B2C 온라인 전시회 플랫폼
- TEAM Stack
- Next JS, TypeScript, React Native
- AWS S3, CloudFront, RDS, EC2, Spring boot, Docker Compose, MySQL
- Figma
- Swagger
WEB(Front) 오준서 Next JS, TypeScript APP(Front) 강제구 React Native WEB / APP(Back) 민한결, 이수빈 Spring boot
</aside>
<aside> 📌 CMS WEB Front-End
개발 환경
Next JS
, TypeScript
기능 구현
https://www.youtube.com/watch?v=B-3IrsyK8B4&list=WL&index=1
<aside>
📌 Next ver14
RSC?
RSC(React Server Component)는 React18부터 도입된 개념
말 그대로 서버에서 동작하는 컴포넌트를 지칭
Client Component와 가장 큰 차이점은 렌더링되는 장소가 서버인지 클라이언트인지
RSC는 서버에서 한 차례 해석된 이후 Client로 전달되고, RCC는 Client가 JS 번들을 다운로드 받은 이후 해석함
- 사용자가 브라우저 접근 시도 시 페이지를 띄우기 위해 서버로 요청
- 서버는 component tree를 root부터 실행하며 serialized json format으로 재구성
- RCC는 서버에서 직접 해석하지 않고 ‘Module reference” 라고 하는 새로운 타입 적용하고 placeholder로 대체
- 서버로부터 직렬화된 결과물을 Stream 형태로 Client가 전달받게 되고, 함께 다운로드한 JS Bundle을 참조하여 Module reference 타입 등장할 때마다 RCC를 렌더링해서 빈 공간 채운 뒤, DOM에 반영하면 실제 화면에 스크린이 보인다.
RSC 장점
- Zero Bundle Size
- RSC는 서버에서 이미 모두 실행된 후 직렬화된 JSON 형태로 전달되기 때문에 어떠한 bundle도 필요하지 않다.
- No more getServerSideProps / getStaticProps
</aside>
<aside>
📌 Warning: Prop className did not match. Server: "sc-iBPTVF gYzxoH" Client: "sc-pGaPU jNmjyv"
문제 인식
- Next SSR로 인해 일단 서버에서 렌더링이 되지만, 이후 라우팅 과정에서 브라우저 렌더링(CSR)을 하면서 서버에서의 className과 클라이언트에서 className이 달라져서 생기는 현상
해결 시도
next.config.js 파일 아래 코드 추가
const nextConfig = { compiler: { styledcomponents: true, }, }
문제 발생
- CSS-in-JS 방식 styled-component로 커스터마이징된 swiper 라이브러리 간섭 영향 CSS 충돌
재해결
Next의 RSC와 RCC의 hydration 과정 고려
컴포넌트가 렌더링되고 난 후에 HTML요소를 가져오게 한다.
// Hydration-------------------------------------------- const [element, setElement] = useState<HTMLCollectionOf<HTMLHtmlElement> | null>(null); useEffect(() => { setElement(document.getElementsByTagName("html")); }, []); if (!element) return <></>;
</aside>
<aside>
📌 Next Image
문제 인식
원리
해결
<Image sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw" />
// next.config.js
const nextConfig = {
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
minimumCacheTTL: 60,
// 이미지가 캐싱 되는 기간은 next.config.js의 images.minimumCacheTTL 구성 또는
// CDN에서 응답한 이미지의 Cache-Control 헤더 중 더 큰 것으로 정의
}
장점