Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 체크포인트
배포 링크
https://yangs1s.github.io/front_6th_chapter4-1/react/
https://yangs1s.github.io/front_6th_chapter4-1/vanilla/
기본과제 (Vanilla SSR & SSG)
Express SSR 서버
<!--app-html-->,<!--app-head-->)서버 사이드 렌더링
클라이언트 Hydration
window.__INITIAL_DATA__스크립트 주입Static Site Generation
심화과제 (React SSR & SSG)
React SSR
renderToString서버 렌더링React Hydration
Static Site Generation
구현 과정 돌아보기
가장 어려웠던 부분과 해결 과정
플레이스홀더 없음/이미 채워짐 플레이스홀더 없음/이미 채워짐원본 파일로 써야하는 이유를 AI를 통해서 찾아봄
SSG 템플릿의 조건
빌드된 파일을 템플릿으로 쓰면 안 되는 이유
SSR 검색·필터링 테스트
문제
SSR 검색·필터 테스트에서 #search-input 값이 ''로 SSR되어 toHaveValue("젤리")가 타임아웃으로 실패했습니다.
원인 파악 과정
해결:
컨텍스트 사용
요청 전용 라우터를 컨텍스트로 만들었습니다. 요청 전용 라우터를 컴포넌트에 안전하게 전달하기 위해서 사용해야해서 컨텍스트를 이용했습니다.
구현하면서 새롭게 알게 된 개념
하이드레이션
서버사이드 렌더링은 웹 페이지를 서버에서 미리 렌더링하여 클라이언트에게 HTML을 전달하는 방식이다. 이때 클라이언트 측에서 자바스크립트를 통해 추가적인 기능(예: 이벤트 처리, 상태 관리 등)을 활성화하는 과정을 하이드레이션이라고 한다.
왜 하이드레이션이 필요한가?
하이드레이션의 동작 방식
구현을 통해서 SSR에서는 아무런 움직임을 줄수 없다는점? CSR 스크립트를 통한 기능을 활성화 시킬수 있다는점을 알았고, 하이드레이션 과정에서 클라이언트와 서버의 구조가 일치해야한다는걸 알게되었어요
서버 상태관리 초기화를 하는 이유
얻는 이점
1. 사용자 경험 (UX) 개선
❌ Before: 상품목록 → 로딩스피너 → 상품목록 (깜빡임) ✅ After: 상품목록 → 상품목록 (매끄러움)2. 성능 개선
3. SSR의 이점 유지
4. 일관성 보장
처음 구현시 어색해서 csr인건지 아님 ssr인건지 잘 몰랐고, 화면 깜빡임과, 중복으로 api가 호출되고 이래서 찾아보다가 이해했습니다.
성능 최적화 관점에서의 인사이트
사실 어떤 관점으로 생각해야는지 잘 모르겠습니다.
https://medium.com/wantedjobs/%EC%9B%B9-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94-ssr-cache-%EC%A0%81%EC%9A%A9%EA%B8%B0-bf022e3a1a72
성능 최적화 관점에서의 인사이트
비즈니스적 중요성 - 매출과 직결되는 문제
원티드 사례를 보면서 깨달은 것은 성능 최적화가 단순한 기술적 개선이 아니라는 점입니다. 속도가 매출과 사용자 유지에 직접적인 영향을 미치는 비즈니스 핵심 요소라는 걸 알게 됐습니다.
근거와 동기가 있다보니 성능 최적화의 중요성을 제대로 인식하게 되었고, 단순히 "기술적으로 멋있어서" 하는 작업이 아니라 사용자 유지와 매출에 직결되는 중요한 업무라는 걸 생각해 봤습니다.
기술적 관점에서의 최적화 경험
1. 컨텍스트/라우터 최적화
과제를 진행하면서 라우터 성능 개선에 집중했습니다:
2. SSR/하이드레이션 최적화
하이드레이션 과정에서 발생하는 성능 문제들을 해결했습니다:
실제 체감한 최적화 효과
처음에는 "그냥 동작하면 되는 거 아닌가?"라고 생각했는데, 실제로 최적화를 적용해보니 확실한 차이가 있었습니다:
결론
성능 최적화라는게 비즈니스적으로나 기술적으로 두개 다 의미가 있고 중요하다는점이였고, 저도 아직 백수지만 회사에 들어갈때는 이러한 경험과 마인드셋으로 앞으로 사용자 중심의 성능 최적화를 지속해야겠다고 생각합니다.
학습 갈무리
SSR/SSG 과제 Q&A 정리
Q1. 현재 구현한 SSR/SSG 아키텍처에서 확장성을 고려할 때 어떤 부분을 개선하시겠습니까?
현재: 전역 productStore 공유로 요청 간 상태 오염 위험
개선: 요청별 스토어 인스턴스 생성, DI(Dependency Injection) 패턴 도입
현재: 하드코딩된 라우트 등록, 단순 패턴 매칭
개선:
라우트 설정 외부화(JSON/YAML)
중첩 라우트, 레이아웃 라우트 지원
라우트 가드(인증, 권한) 체인 구조
(추가 고려사항: 캐싱 전략, 마이크로서비스 분리, CDN 활용, 로드 밸런싱 등을 생각해볼 수 있음)
Q2. Express 서버 대신 다른 런타임(Cloudflare Workers, Vercel Edge Functions 등)을 사용한다면 어떤 점을 수정해야 할까요?
런타임 API 전환
SSR 엔트리 적응
renderToPipeableStream) 대신 Web Streams 지원(renderToReadableStream) 고려render(url, query)는 그대로 재사용 가능하되, 로더/템플릿 주입은 Web API로 처리템플릿/정적 자원
라우팅/URL 처리
Request.url로 pathname/search 파싱해render(pathname, query)호출MSW/모킹
Q3. 현재 구현에서 성능 병목이 될 수 있는 지점은 어디이고, 어떻게 개선하시겠습니까?
전역 상태 오염 문제
문제 상황:
main-server.tsx에서 모든 SSR 요청이 하나의 전역productStore인스턴스를 공유해결 방향:
Q4. 1000개 이상의 상품 페이지를 SSG로 생성할 때 고려해야 할 사항은 무엇입니까?
규모가 커지면 빌드 시간의 급격한 증가, 메모리 부족, 전역 상태 충돌 문제가 발생합니다. 여러 페이지를 동시에 생성하는 과정에서 전역 상태가 섞여서 엉뚱한 내용이 저장될 수도 있습니다.
핵심 해결책:
Q5. Hydration 과정에서 사용자가 느낄 수 있는 UX 이슈는 무엇이고, 어떻게 개선할 수 있을까요?
주요 UX 이슈들
1. 상호작용 지연
2. 깜빡임과 화면 변화
3. 중복 로딩
4. 입력 데이터 손실
개선 방법
상태 일치: 서버와 클라이언트 초기 상태를 같게 만들기
우선순위: 중요한 UI부터 하이드레이션하기
피드백: 사용자에게 현재 상태 명확히 알려주기
데이터 보호: 사용자 입력 손실 방지하기
Q6. 이번 과제에서 학습한 내용을 실제 프로덕션 환경에 적용할 때 추가로 고려해야 할 사항은?
에러 핸들링 및 Fallback 전략
Q7. Next.js 같은 프레임워크 대신 직접 구현한 SSR/SSG의 장단점은 무엇인가요?
직접 만들어보니까
장점:
1. 학습 효과와 깊은 이해
2. 커스터마이징 자유도
단점:
유지보수 비용과 안정성
Q8. Next.js를 이용하여 SSG 방식으로 배포하려면 어떻게 해야 좋을까요?
Next.js SSG 배포 방법
1. 설정 변경
2. 페이지별 정적 생성
3. 빌드 및 배포
주의사항:
코드 품질 향상
개선하고 싶은 부분
학습 연계
다음 학습 목표
아직은 백수고 취업하고 있어서 실무에 연계는 어떻게 해볼지 생각은 안해봤습니다.
리뷰 받고 싶은 내용
현재 SSR에서 전역 productStore를 모든 요청이 공유하고 있는데, 동시 요청 시 상태 오염 가능성이 있었던거 같았습니다.
static-site-generate.js에서 Promise.all로 상품 상세 페이지 병렬로 생성했었는데.
ssg 테스트를 할때, 기대했던 상세페이지가 안나오고 엉뚱한 상세페이지가 나오더라고요.
해결 방법으로 요청별 스토어 인스턴스 생성 vs Context Provider 격리 중 어느 쪽이 좀 효율적인지 궁금합니다.