다크 모드
《실전 Vue 3 & TypeScript: jQuery 레거시에서 완성하는 게시판 아키텍처》
사내 개발자를 위한 단일 코드베이스 점진적 리팩터링 & 풀스택 실무 가이드
📦 실습 예제 풀스택 소스코드 패키지 (.zip)
Spring Boot 3 백엔드 + Vue 3 프론트엔드 + 14단계 챕터별 실습 코드가 모두 포함되어 있습니다. (약 550KB, node_modules 및 빌드 캐시 제외)
🗺️ 단일 게시판 코드의 14단계 진화 로드맵
🚀 풀스택 실습 환경 구성 및 따라하기 안내
본 교재는 코드를 눈으로 읽기만 하는 책이 아닙니다.
개발자가 직접 한 줄씩 코드를 작성(Hands-on)하고 브라우저와 콘솔에서 동작을 검증하며 아키텍처의 진화를 체감할 수 있도록 설계되었습니다.
📥 예제 소스 다운로드 및 Git 저장소
- 압축 파일 직접 다운로드: 📦
vue3-board-architecture.zip다운로드
1) 프로젝트 디렉터리 구성
vue3-board-architecture/
├── backend/ # Spring Boot 3 백엔드 (H2 DB, REST API: 8080)
├── frontend/ # Vue 3 + TypeScript 프론트엔드 (Vite: 3000)
│ ├── src/
│ │ ├── BoardApp.vue # 👈 1장부터 독자가 직접 코딩해 나갈 메인 컴포넌트!
│ │ ├── practice/ # 👈 2장 미니 반응형 엔진 등 순수 TS 실습 파일
│ │ ├── composables/ # 👈 5장 로직 분리 Composable 함수들
│ │ └── components/ # 👈 6~8장 공통 컴포넌트(BoardTable 등)
│ └── package.json # 프론트엔드 의존성 및 실습 스크립트
└── chapters/ # 14단계 챕터별 실습 교재 원고 (HTML 뷰어 지원)2) 터미널 2개로 실습 환경 기동하기
실습을 위해 2개의 터미널 창을 열어 각각 백엔드와 프론트엔드를 실행합니다:
bash
# [터미널 1] 백엔드(Spring Boot 3) 실행 (포트: 8080)
cd backend
./mvnw spring-boot:run
# (Windows PowerShell / CMD의 경우: .\mvnw.cmd spring-boot:run)
# [터미널 2] 프론트엔드(Vue 3) 실행 (포트: 3000)
cd frontend
npm install
npm run dev3) 브라우저 접속 주소
- jQuery 레거시 화면 확인:
http://localhost:8080/legacy-board.html - Vue 3 점진적 리팩터링 실습 화면:
http://localhost:3000 - HTML 교재 뷰어 (웹 서빙):
http://localhost:8080/docs/index.html - HTML 교재 뷰어 (오프라인 로컬):
docs/index.html(브라우저에서 더블 클릭 실행) - 2장 반응형 엔진 터미널 실습:
cd frontend && npm run practice:reactivity
🗂 챕터별 원고 바로가기 (Chapters)
- Chapter 01. 돌아가기만 하는 사내 레거시: jQuery 게시판의 종말
- Chapter 02. Vue 3 반응형 엔진의 밑바닥 까보기 (Reactivity Deep Dive)
- Chapter 03.
<script setup>과 반응형 유실 문제의 정복 - Chapter 04. 800줄로 비대해진 Fat Component의 위기
- Chapter 05. Composable 패턴으로 로직 독립시키기
- Chapter 06. 계층형 댓글 트리와 Provide / Inject (DI)
- Chapter 07. 게시판 DTO와 컴포넌트 경계선의 타입 계약
- Chapter 08. 어디든 재사용 가능한 제네릭
BoardTable<T>제작 - Chapter 09. 상태는 언제 컴포넌트를 떠나야 하는가? (Pinia 철학)
- Chapter 10. '좋아요' 낙관적 업데이트와 Pinia 플러그인
- Chapter 11. 라우터 네비게이션 가드를 활용한 인가(Authorization) AOP
- Chapter 12. HTTP 레이어 격리와 프론트엔드 에러 바운더리
- Chapter 13. 10,000개 댓글 렌더링 최적화와 메모리 누수 방지
- Chapter 14. 실전 Vitest와 MSW(Mock Service Worker) 테스트
[부록 (Appendix)] 실무 현장 투입을 위한 엔터프라이즈 확장
- Appendix A. 사내 실무 환경설정 및 Docker/Nginx 배포 가이드
- Appendix B. 사내 표준 UI 라이브러리(Ant Design Vue / Tailwind) 브릿지 가이드
- Appendix C. 실습 환경 트러블슈팅 5대 FAQ
👥 사내 스터디 리더(진행자)를 위한 주차별 운영 키트
사내에서 4주 스터디를 주관하는 팀장 또는 시니어 개발자를 위한 주차별 핵심 토론 질문 및 PR 검수 기준입니다:
[Week 1] Ch 01 ~ 03: 반응형의 본질과 선언적 멘탈 모델
- 토론 질문: "우리가 과거 jQuery에서
$('#tbody').html()로 화면을 그릴 때와, Vue 3ref로 화면을 그릴 때 메모리와 렌더링 성능 관점에서 가장 결정적인 차이는 무엇인가?" - PR 검수 포인트: 코드베이스에
document.querySelector나innerHTML이 완전히 사라졌는가?reactive객체를 비구조화 할당하여 반응성을 유실한 곳이 없는가?
[Week 2] Ch 04 ~ 06: Fat Component 탈출과 IoC/DI
- 토론 질문: "컴포넌트가 800줄로 비대해졌을 때, 단순 하위 컴포넌트로 쪼개는 것(UI 분할)과 Composable로 로직을 도려내는 것(로직 분할)의 차이는 무엇인가?"
- PR 검수 포인트:
usePagination과usePostFilter가 평문 객체(Plain Object)를 반환하며 컴포넌트와 느슨하게 결합되어 있는가? 대댓글 트리에서 3단계 이상 Props Drilling 없이Provide/Inject가 올바르게 적용되었는가?
[Week 3] Ch 07 ~ 10: 타입 계약과 엔터프라이즈 상태 관리
- 토론 질문: "모든 상태를 Pinia에 넣으면 왜 안 되는가? Local State, URL Query, Pinia Global State를 구분하는 우리 팀의 기준은 무엇인가?"
- PR 검수 포인트: Spring Boot DTO와 TypeScript 인터페이스가
any없이 1:1로 매핑되었는가? 제네릭BoardTable<T>의 Scoped Slot에서 타입 추론이 깨지지 않는가? 낙관적 업데이트에 롤백 방어 코드가 있는가?
[Week 4] Ch 11 ~ 14 & 부록: 인프라, 최적화, 그리고 배포
- 토론 질문: "컴포넌트 내부에서
axios.get을 직접 부르는 것을 왜 우리 팀 PR에서 엄격히 금지해야 하는가?" - PR 검수 포인트:
postRepository로 네트워크 계층이 완벽히 격리되었는가? 10,000개 댓글에VirtualList와shallowRef가 적용되었는가?npm run test시 모든 단위/통합 테스트가 통과하는가?