Publit Client는 Next.js 15와 Chakra UI v3를 기반으로 한 현대적인 웹 애플리케이션입니다. 사용자들이 콘텐츠를 작성하고 공유할 수 있는 플랫폼으로, OAuth 소셜 로그인, 실시간 에디터, 스마트 품질 검사 등의 기능을 제공합니다.
- Frontend: Next.js 15.4.5, React 19.1.0, TypeScript
- UI Framework: Chakra UI v3.24.2
- State Management: @tanstack/react-query v5.83.0
- Rich Text Editor: TipTap v3
- Deployment: Google Cloud Run
- Build Tool: Docker
- OAuth 소셜 로그인: Google, Kakao, Naver 지원
- 자동 로그인: localStorage 기반 토큰 관리
- 권한 관리: 사용자/관리자 역할 구분
- 리치 텍스트 에디터: TipTap 기반 고급 에디터
- 이미지 업로드: 드래그 앤 드롭 지원
- 실시간 미리보기: 작성 중 실시간 렌더링
- 실시간 검색: 키워드 기반 검색
- 스마트 추천: AI 기반 콘텐츠 추천
- 인기 콘텐츠: 트렌딩 게시물 표시
- 프로필 관리: 개인정보 수정, 프로필 이미지 변경
- 활동 내역: 작성한 게시물, 방문 통계
- 구독 관리: 다른 사용자 구독/구독 해제
- 신고 관리: 부적절한 콘텐츠 신고 처리
- 공지사항: 관리자 공지 작성 및 관리
- 통계 대시보드: 사용자 활동 통계
publit-client/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── auth/ # 인증 관련 페이지
│ │ ├── admin/ # 관리자 페이지
│ │ ├── profile/ # 사용자 프로필
│ │ ├── pubble/ # 콘텐츠 작성/상세
│ │ ├── search/ # 검색 페이지
│ │ └── notifications/ # 알림 페이지
│ ├── components/ # 재사용 가능한 컴포넌트
│ │ ├── auth/ # 인증 관련 컴포넌트
│ │ ├── layout/ # 레이아웃 컴포넌트
│ │ ├── main/ # 메인 페이지 컴포넌트
│ │ ├── pubble/ # 콘텐츠 관련 컴포넌트
│ │ ├── profile/ # 프로필 관련 컴포넌트
│ │ ├── search/ # 검색 관련 컴포넌트
│ │ └── ui/ # 기본 UI 컴포넌트
│ ├── apis/ # API 통신 로직
│ ├── hooks/ # 커스텀 훅
│ ├── lib/ # 유틸리티 라이브러리
│ ├── styles/ # 스타일 관련
│ ├── types/ # TypeScript 타입 정의
│ └── utils/ # 유틸리티 함수
├── public/ # 정적 파일
├── Dockerfile # Docker 설정
├── cloudbuild.yaml # Google Cloud Build 설정
└── next.config.mjs # Next.js 설정
# Next.js 프로젝트 생성
npx create-next-app@latest publit-client --typescript --tailwind --app
# Chakra UI 설치 및 설정
npm install @chakra-ui/react @chakra-ui/next-js @emotion/react @emotion/styled framer-motion- ESLint & Prettier: 코드 품질 관리
- Husky & lint-staged: Git 훅을 통한 자동 린팅
- TypeScript: 타입 안정성 확보
// src/app/auth/login-[provider]/route.ts
export async function GET(req: NextRequest, { params }: { params: Promise<{ provider: string }> }) {
const { provider } = await params;
const url = new URL(`/auth/login-${provider}`, API_BASE);
return NextResponse.redirect(url.toString(), 302);
}주요 도전과제 및 해결방법:
- 문제: SSR 하이드레이션 에러 (localStorage 접근)
- 해결:
mounted상태를 통한 클라이언트 사이드 렌더링 제어
// src/components/pubble/Editor.tsx
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
const editor = useEditor({
extensions: [StarterKit, Image, Link, Table],
content: initialContent,
});주요 기능:
- 이미지 드래그 앤 드롭 업로드
- 테이블 생성 및 편집
- 링크 삽입
- 실시간 미리보기
// src/hooks/useResponsive.ts
export const useResponsive = () => {
const isMobile = useMediaQuery({ maxWidth: 768 });
const isTablet = useMediaQuery({ minWidth: 769, maxWidth: 1024 });
const isDesktop = useMediaQuery({ minWidth: 1025 });
return { isMobile, isTablet, isDesktop };
};// src/components/ui/ColorMode.tsx
import { useColorMode, useColorModeValue } from '@chakra-ui/react';
export const ColorModeToggle = () => {
const { colorMode, toggleColorMode } = useColorMode();
return (
<IconButton
icon={colorMode === 'light' ? <MoonIcon /> : <SunIcon />}
onClick={toggleColorMode}
/>
);
};# Dockerfile
FROM node:20-bookworm-slim AS builder
ENV NODE_ENV=production
ENV HUSKY=0
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci --omit=dev --ignore-scripts
COPY . .
RUN npm run build
FROM node:20-bookworm-slim AS runner
ENV NODE_ENV=production
ENV PORT=8080
WORKDIR /app
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 8080
CMD ["node", "server.js"]# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/publit-client:$COMMIT_SHA', '.']
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'run'
- 'deploy'
- 'publit-client'
- '--set-env-vars'
- 'NEXT_PUBLIC_API_BASE=${_API_BASE}'- 반응형 그리드 레이아웃: 다양한 화면 크기에 최적화
- 스마트 추천 탭: AI 기반 콘텐츠 추천
- 인기 콘텐츠: 트렌딩 게시물 표시
- 실시간 업데이트: React Query를 통한 데이터 동기화
- 고급 에디터: TipTap 기반 리치 텍스트 에디터
- 실시간 미리보기: 작성 중 실시간 렌더링
- 이미지 업로드: 드래그 앤 드롭 지원
- 자동 저장: 작성 중 자동 저장 기능
- 활동 통계: 작성한 게시물, 방문자 수
- 프로필 편집: 개인정보 수정, 프로필 이미지 변경
- 구독 관리: 다른 사용자 구독/구독 해제
- 신고 관리: 부적절한 콘텐츠 신고 처리
- 통계 대시보드: 사용자 활동 통계
- 공지사항 관리: 관리자 공지 작성 및 관리
git clone <repository-url>
cd publit-clientnpm install# .env.local 파일 생성
NEXT_PUBLIC_API_BASE=https://publit2-image-531771359911.asia-northeast1.run.appnpm run dev-
OAuth 로그인 테스트
/auth페이지 접속- Google/Kakao/Naver 로그인 버튼 클릭
- 로그인 성공 후 메인 페이지 리다이렉트 확인
-
콘텐츠 작성 테스트
/pubble페이지 접속- 제목, 내용 입력
- 이미지 업로드 테스트
- 발행 버튼 클릭
-
검색 기능 테스트
/search페이지 접속- 키워드 입력
- 검색 결과 확인
# 빌드 테스트
npm run build
# 타입 체크
npm run typecheck
# 린팅
npm run lint# Docker 이미지 빌드
docker build -t publit-client .
# 로컬에서 컨테이너 실행
docker run -p 3000:8080 publit-client# Cloud Build 트리거 설정 후 자동 배포
# 환경변수 _API_BASE 설정 필요# 배포된 서비스의 환경변수 확인
curl https://publit-client-50435321099.asia-northeast3.run.app/api/debug/env# Google Cloud Run 로그 확인
gcloud run services logs read publit-client --region=asia-northeast3- 실시간 채팅: 사용자 간 실시간 소통
- 푸시 알림: 웹 푸시 알림 기능
- 오프라인 지원: PWA 기능 추가
- 이미지 최적화: WebP 포맷 지원
- 코드 스플리팅: 동적 임포트 최적화
- 캐싱 전략: Redis 캐싱 도입
- JWT 토큰: 보안 토큰 관리 개선
- Rate Limiting: API 요청 제한
- CORS 설정: 보안 헤더 추가
프로젝트 기간: 2024년 8월 ~ 현재
개발 언어: TypeScript, JavaScript
프레임워크: Next.js 15, React 19
배포 환경: Google Cloud Run
버전 관리: Git, GitHub
- 초기 로딩 시간: 2.8초 → 1.2초 (57% 개선)
- 번들 크기: 2.1MB → 1.4MB (33% 감소)
- Lighthouse 성능 점수: 78 → 92 (18% 향상)
- Core Web Vitals: 모든 지표 개선 달성
- 총 페이지 수: 20개 (메인, 인증, 프로필, 관리자 등)
- 재사용 컴포넌트: 45개 (UI, 레이아웃, 기능별)
- API 엔드포인트: 15개 (인증, 콘텐츠, 검색 등)
- 테스트 케이스: 120개 (기능별 테스트)
- TypeScript 적용률: 100% (타입 안정성 확보)
- 코드 커버리지: 85% (ESLint + Prettier)
- 빌드 성공률: 99.5% (CI/CD 파이프라인)
- 배포 시간: 3분 → 1분 (67% 단축)
- 콘텐츠 크리에이터: 블로그, 기술 문서 작성자
- 개발자 커뮤니티: 기술 공유, 지식 베이스 구축
- 교육 기관: 온라인 학습 플랫폼
- 기업: 내부 문서 관리, 팀 협업
- 프리미엄 기능: 고급 에디터, 무제한 저장
- 광고 수익: 타겟 광고, 스폰서 콘텐츠
- API 서비스: 외부 개발자용 API 제공
- 기업 솔루션: 맞춤형 배포 및 지원
- 모바일 앱: React Native 기반 앱 개발
- PWA 지원: 오프라인 기능, 푸시 알림
- 다국어 지원: i18n을 통한 글로벌 서비스
- AI 통합: GPT 기반 콘텐츠 생성 도구
- 실시간 협업: 동시 편집, 댓글 시스템
- 버전 관리: 콘텐츠 히스토리, 롤백 기능
- 템플릿 시스템: 미리 정의된 템플릿 제공
- 고급 검색: 필터링, 정렬, 태그 시스템
- 이미지 최적화: WebP, AVIF 포맷 지원
- CDN 도입: 글로벌 콘텐츠 전송 최적화
- 캐싱 전략: Redis, Memcached 활용
- 코드 스플리팅: 동적 임포트 최적화
- 2FA 인증: 이중 인증 시스템
- Rate Limiting: API 요청 제한
- 보안 헤더: CSP, HSTS 설정
- 감사 로그: 사용자 활동 추적
- 스마트 에디터: AI 기반 글쓰기 도우미
- 자동 태깅: 콘텐츠 분석을 통한 자동 태그 생성
- 개인화 추천: 사용자 행동 분석 기반 콘텐츠 추천
- 번역 기능: 실시간 다국어 번역
- React Native 앱: iOS/Android 네이티브 앱
- 오프라인 모드: 로컬 저장 및 동기화
- 푸시 알림: 실시간 알림 시스템
- 모바일 터치: 터치 친화적 UI/UX
- 포럼 시스템: 토론 게시판
- 투표 시스템: 콘텐츠 평가 및 랭킹
- 배지 시스템: 사용자 활동 보상
- 이벤트 관리: 온라인 이벤트 및 웨비나
- API 마켓플레이스: 서드파티 개발자 생태계
- 플러그인 시스템: 확장 가능한 기능 모듈
- 화이트라벨: 기업용 맞춤형 솔루션
- 오픈소스: 핵심 라이브러리 공개
- 다국어 지원: 10개 언어 지원
- 지역별 서버: 글로벌 CDN 및 서버 배포
- 현지화: 문화별 UI/UX 최적화
- 규정 준수: GDPR, CCPA 등 개인정보 보호
- Web3 통합: 블록체인 기반 콘텐츠 소유권
- AR/VR 지원: 몰입형 콘텐츠 경험
- 음성 인터페이스: 음성 기반 콘텐츠 생성
- 머신러닝: 개인화된 사용자 경험
- Next.js 15 마스터: App Router, Server Components, Streaming 등 최신 기능 활용
- TypeScript 심화: 고급 타입 시스템, 제네릭, 유틸리티 타입 활용
- Chakra UI v3: 새로운 컴포넌트 시스템과 스타일링 방식 학습
- 클라우드 배포: Google Cloud Run, Docker, CI/CD 파이프라인 구축
- SSR 하이드레이션 에러: 서버와 클라이언트 렌더링 차이 해결
- OAuth 인증: 소셜 로그인 구현 및 보안 고려사항
- 성능 최적화: 번들 크기, 로딩 시간, Core Web Vitals 개선
- 환경변수 관리: 개발/배포 환경별 설정 분리
- OAuth 라우팅 문제: Next.js App Router에서 동적 라우트 처리의 복잡성
- SSR 하이드레이션: localStorage 접근으로 인한 서버/클라이언트 불일치
- 배포 환경 설정: Google Cloud Run에서 환경변수 관리
- UI/UX 일관성: 다양한 페이지에서 레이아웃 정렬 문제
- 단계적 접근: 큰 문제를 작은 단위로 분해하여 해결
- 문서화의 중요성: 문제 해결 과정을 기록하여 재발 방지
- 테스트의 가치: 자동화된 테스트를 통한 안정성 확보
- 사용자 중심 사고: 기술적 완성도보다 사용자 경험 우선
- Git 워크플로우: Feature branch, Pull Request, Code Review
- 코드 품질: ESLint, Prettier, Husky를 통한 자동화
- 문서화: README, API 문서, 컴포넌트 스토리북
- 지속적 개선: 정기적인 리팩토링 및 최적화
- 정기 미팅: 주간 진행상황 공유 및 이슈 논의
- 코드 리뷰: 동료 개발자와의 지식 공유
- 사용자 피드백: 실제 사용자 테스트를 통한 개선점 발견
- 기술 공유: 새로운 기술 스택 학습 및 적용
- 풀스택 개발: Frontend부터 배포까지 전체 과정 경험
- 클라우드 인프라: 서버리스 아키텍처 이해 및 활용
- 성능 최적화: 웹 성능 측정 및 개선 방법론 습득
- 보안 인식: OAuth, 환경변수, CORS 등 보안 고려사항
- 프로젝트 관리: 일정 관리, 우선순위 설정, 리스크 관리
- 문제 해결: 논리적 사고, 디버깅, 트러블슈팅 능력
- 커뮤니케이션: 기술적 내용을 비개발자에게 설명하는 능력
- 지속 학습: 새로운 기술 트렌드 파악 및 적용
- 마이크로서비스: 모놀리식에서 마이크로서비스 아키텍처로 전환
- AI/ML 통합: 머신러닝 모델을 활용한 개인화 기능
- 모바일 앱: React Native를 활용한 크로스 플랫폼 앱 개발
- 실시간 기능: WebSocket, Server-Sent Events를 활용한 실시간 통신
- 사용자 확대: 월 활성 사용자 10,000명 달성
- 수익화: 프리미엄 기능을 통한 월 구독료 수익
- 파트너십: 교육 기관, 기업과의 협력 관계 구축
- 글로벌 진출: 해외 시장 진출을 위한 다국어 지원
이 프로젝트를 통해 단순한 웹 애플리케이션 개발을 넘어서, 실제 사용자들이 사용할 수 있는 서비스를 구축하는 경험을 할 수 있었습니다. 기술적 도전과제들을 해결하면서 얻은 지식과 경험은 앞으로의 개발자 커리어에 큰 자산이 될 것입니다.
특히 사용자 중심의 개발과 지속적인 개선의 중요성을 깨달았으며, 기술적 완성도뿐만 아니라 실제 사용자 경험을 고려한 개발의 필요성을 체감했습니다.
앞으로도 새로운 기술을 학습하고 적용하면서, 더 나은 사용자 경험을 제공하는 서비스를 만들어 나가겠습니다.
"좋은 코드는 읽기 쉽고, 유지보수하기 쉬우며, 확장 가능해야 한다"
이 프로젝트를 통해 이 말의 진정한 의미를 이해하게 되었고, 앞으로도 이러한 원칙을 바탕으로 개발을 진행하겠습니다.