Skip to content

Latest commit

 

History

History
586 lines (415 loc) · 18 KB

File metadata and controls

586 lines (415 loc) · 18 KB

Publit Client - 프로젝트 문서

1. 프로젝트 개요

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

2. 프로젝트 주요 기능 및 구조도

2.1 핵심 기능

🔐 인증 시스템

  • OAuth 소셜 로그인: Google, Kakao, Naver 지원
  • 자동 로그인: localStorage 기반 토큰 관리
  • 권한 관리: 사용자/관리자 역할 구분

✍️ 콘텐츠 관리

  • 리치 텍스트 에디터: TipTap 기반 고급 에디터
  • 이미지 업로드: 드래그 앤 드롭 지원
  • 실시간 미리보기: 작성 중 실시간 렌더링

🔍 검색 및 추천

  • 실시간 검색: 키워드 기반 검색
  • 스마트 추천: AI 기반 콘텐츠 추천
  • 인기 콘텐츠: 트렌딩 게시물 표시

👤 사용자 프로필

  • 프로필 관리: 개인정보 수정, 프로필 이미지 변경
  • 활동 내역: 작성한 게시물, 방문 통계
  • 구독 관리: 다른 사용자 구독/구독 해제

🛡️ 관리자 기능

  • 신고 관리: 부적절한 콘텐츠 신고 처리
  • 공지사항: 관리자 공지 작성 및 관리
  • 통계 대시보드: 사용자 활동 통계

2.2 프로젝트 구조도

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 설정

3. 개발 과정 (주요 단계와 방법)

3.1 초기 설정 및 환경 구성

1단계: 프로젝트 초기화

# 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

2단계: 개발 환경 설정

  • ESLint & Prettier: 코드 품질 관리
  • Husky & lint-staged: Git 훅을 통한 자동 린팅
  • TypeScript: 타입 안정성 확보

3.2 핵심 기능 구현

OAuth 인증 시스템 구현

// 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,
});

주요 기능:

  • 이미지 드래그 앤 드롭 업로드
  • 테이블 생성 및 편집
  • 링크 삽입
  • 실시간 미리보기

3.3 UI/UX 개선 과정

반응형 디자인 구현

// 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}
    />
  );
};

3.4 배포 및 DevOps

Docker 컨테이너화

# 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"]

Google Cloud Run 배포

# 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}'

4. 결과물에 대한 설명 및 화면

4.1 메인 페이지

  • 반응형 그리드 레이아웃: 다양한 화면 크기에 최적화
  • 스마트 추천 탭: AI 기반 콘텐츠 추천
  • 인기 콘텐츠: 트렌딩 게시물 표시
  • 실시간 업데이트: React Query를 통한 데이터 동기화

4.2 콘텐츠 작성 페이지

  • 고급 에디터: TipTap 기반 리치 텍스트 에디터
  • 실시간 미리보기: 작성 중 실시간 렌더링
  • 이미지 업로드: 드래그 앤 드롭 지원
  • 자동 저장: 작성 중 자동 저장 기능

4.3 사용자 프로필

  • 활동 통계: 작성한 게시물, 방문자 수
  • 프로필 편집: 개인정보 수정, 프로필 이미지 변경
  • 구독 관리: 다른 사용자 구독/구독 해제

4.4 관리자 대시보드

  • 신고 관리: 부적절한 콘텐츠 신고 처리
  • 통계 대시보드: 사용자 활동 통계
  • 공지사항 관리: 관리자 공지 작성 및 관리

5. 프로젝트 실행 및 테스트 방법

5.1 로컬 개발 환경 설정

1. 저장소 클론

git clone <repository-url>
cd publit-client

2. 의존성 설치

npm install

3. 환경변수 설정

# .env.local 파일 생성
NEXT_PUBLIC_API_BASE=https://publit2-image-531771359911.asia-northeast1.run.app

4. 개발 서버 실행

npm run dev

5.2 테스트 방법

기능 테스트

  1. OAuth 로그인 테스트

    • /auth 페이지 접속
    • Google/Kakao/Naver 로그인 버튼 클릭
    • 로그인 성공 후 메인 페이지 리다이렉트 확인
  2. 콘텐츠 작성 테스트

    • /pubble 페이지 접속
    • 제목, 내용 입력
    • 이미지 업로드 테스트
    • 발행 버튼 클릭
  3. 검색 기능 테스트

    • /search 페이지 접속
    • 키워드 입력
    • 검색 결과 확인

성능 테스트

# 빌드 테스트
npm run build

# 타입 체크
npm run typecheck

# 린팅
npm run lint

5.3 배포 테스트

Docker 빌드 테스트

# Docker 이미지 빌드
docker build -t publit-client .

# 로컬에서 컨테이너 실행
docker run -p 3000:8080 publit-client

Google Cloud Run 배포

# Cloud Build 트리거 설정 후 자동 배포
# 환경변수 _API_BASE 설정 필요

5.4 모니터링 및 디버깅

환경변수 확인

# 배포된 서비스의 환경변수 확인
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

6. 향후 개선 계획

6.1 기능 개선

  • 실시간 채팅: 사용자 간 실시간 소통
  • 푸시 알림: 웹 푸시 알림 기능
  • 오프라인 지원: PWA 기능 추가

6.2 성능 최적화

  • 이미지 최적화: WebP 포맷 지원
  • 코드 스플리팅: 동적 임포트 최적화
  • 캐싱 전략: Redis 캐싱 도입

6.3 보안 강화

  • JWT 토큰: 보안 토큰 관리 개선
  • Rate Limiting: API 요청 제한
  • CORS 설정: 보안 헤더 추가

프로젝트 기간: 2024년 8월 ~ 현재
개발 언어: TypeScript, JavaScript
프레임워크: Next.js 15, React 19
배포 환경: Google Cloud Run
버전 관리: Git, GitHub

7. 기대 효과 및 활용 분야

7.1 정량적 성과

성능 개선 결과

  • 초기 로딩 시간: 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% 단축)

7.2 활용 분야

🎯 주요 타겟 사용자

  • 콘텐츠 크리에이터: 블로그, 기술 문서 작성자
  • 개발자 커뮤니티: 기술 공유, 지식 베이스 구축
  • 교육 기관: 온라인 학습 플랫폼
  • 기업: 내부 문서 관리, 팀 협업

💼 비즈니스 모델

  • 프리미엄 기능: 고급 에디터, 무제한 저장
  • 광고 수익: 타겟 광고, 스폰서 콘텐츠
  • API 서비스: 외부 개발자용 API 제공
  • 기업 솔루션: 맞춤형 배포 및 지원

🌐 확장 가능성

  • 모바일 앱: React Native 기반 앱 개발
  • PWA 지원: 오프라인 기능, 푸시 알림
  • 다국어 지원: i18n을 통한 글로벌 서비스
  • AI 통합: GPT 기반 콘텐츠 생성 도구

8. 향후 추진 계획

8.1 단기 계획 (3-6개월)

기능 개선

  • 실시간 협업: 동시 편집, 댓글 시스템
  • 버전 관리: 콘텐츠 히스토리, 롤백 기능
  • 템플릿 시스템: 미리 정의된 템플릿 제공
  • 고급 검색: 필터링, 정렬, 태그 시스템

성능 최적화

  • 이미지 최적화: WebP, AVIF 포맷 지원
  • CDN 도입: 글로벌 콘텐츠 전송 최적화
  • 캐싱 전략: Redis, Memcached 활용
  • 코드 스플리팅: 동적 임포트 최적화

보안 강화

  • 2FA 인증: 이중 인증 시스템
  • Rate Limiting: API 요청 제한
  • 보안 헤더: CSP, HSTS 설정
  • 감사 로그: 사용자 활동 추적

8.2 중기 계획 (6-12개월)

AI 기능 통합

  • 스마트 에디터: AI 기반 글쓰기 도우미
  • 자동 태깅: 콘텐츠 분석을 통한 자동 태그 생성
  • 개인화 추천: 사용자 행동 분석 기반 콘텐츠 추천
  • 번역 기능: 실시간 다국어 번역

모바일 최적화

  • React Native 앱: iOS/Android 네이티브 앱
  • 오프라인 모드: 로컬 저장 및 동기화
  • 푸시 알림: 실시간 알림 시스템
  • 모바일 터치: 터치 친화적 UI/UX

커뮤니티 기능

  • 포럼 시스템: 토론 게시판
  • 투표 시스템: 콘텐츠 평가 및 랭킹
  • 배지 시스템: 사용자 활동 보상
  • 이벤트 관리: 온라인 이벤트 및 웨비나

8.3 장기 계획 (1-2년)

플랫폼 확장

  • API 마켓플레이스: 서드파티 개발자 생태계
  • 플러그인 시스템: 확장 가능한 기능 모듈
  • 화이트라벨: 기업용 맞춤형 솔루션
  • 오픈소스: 핵심 라이브러리 공개

글로벌 진출

  • 다국어 지원: 10개 언어 지원
  • 지역별 서버: 글로벌 CDN 및 서버 배포
  • 현지화: 문화별 UI/UX 최적화
  • 규정 준수: GDPR, CCPA 등 개인정보 보호

기술 혁신

  • Web3 통합: 블록체인 기반 콘텐츠 소유권
  • AR/VR 지원: 몰입형 콘텐츠 경험
  • 음성 인터페이스: 음성 기반 콘텐츠 생성
  • 머신러닝: 개인화된 사용자 경험

9. 프로젝트 진행 소감 및 후기

9.1 개발 과정에서의 학습

기술적 성장

  • Next.js 15 마스터: App Router, Server Components, Streaming 등 최신 기능 활용
  • TypeScript 심화: 고급 타입 시스템, 제네릭, 유틸리티 타입 활용
  • Chakra UI v3: 새로운 컴포넌트 시스템과 스타일링 방식 학습
  • 클라우드 배포: Google Cloud Run, Docker, CI/CD 파이프라인 구축

문제 해결 능력 향상

  • SSR 하이드레이션 에러: 서버와 클라이언트 렌더링 차이 해결
  • OAuth 인증: 소셜 로그인 구현 및 보안 고려사항
  • 성능 최적화: 번들 크기, 로딩 시간, Core Web Vitals 개선
  • 환경변수 관리: 개발/배포 환경별 설정 분리

9.2 도전과 극복

가장 어려웠던 부분

  1. OAuth 라우팅 문제: Next.js App Router에서 동적 라우트 처리의 복잡성
  2. SSR 하이드레이션: localStorage 접근으로 인한 서버/클라이언트 불일치
  3. 배포 환경 설정: Google Cloud Run에서 환경변수 관리
  4. UI/UX 일관성: 다양한 페이지에서 레이아웃 정렬 문제

해결 과정에서의 깨달음

  • 단계적 접근: 큰 문제를 작은 단위로 분해하여 해결
  • 문서화의 중요성: 문제 해결 과정을 기록하여 재발 방지
  • 테스트의 가치: 자동화된 테스트를 통한 안정성 확보
  • 사용자 중심 사고: 기술적 완성도보다 사용자 경험 우선

9.3 팀워크 및 협업

개발 방법론

  • Git 워크플로우: Feature branch, Pull Request, Code Review
  • 코드 품질: ESLint, Prettier, Husky를 통한 자동화
  • 문서화: README, API 문서, 컴포넌트 스토리북
  • 지속적 개선: 정기적인 리팩토링 및 최적화

소통 및 피드백

  • 정기 미팅: 주간 진행상황 공유 및 이슈 논의
  • 코드 리뷰: 동료 개발자와의 지식 공유
  • 사용자 피드백: 실제 사용자 테스트를 통한 개선점 발견
  • 기술 공유: 새로운 기술 스택 학습 및 적용

9.4 개인적 성장

기술적 역량

  • 풀스택 개발: Frontend부터 배포까지 전체 과정 경험
  • 클라우드 인프라: 서버리스 아키텍처 이해 및 활용
  • 성능 최적화: 웹 성능 측정 및 개선 방법론 습득
  • 보안 인식: OAuth, 환경변수, CORS 등 보안 고려사항

소프트 스킬

  • 프로젝트 관리: 일정 관리, 우선순위 설정, 리스크 관리
  • 문제 해결: 논리적 사고, 디버깅, 트러블슈팅 능력
  • 커뮤니케이션: 기술적 내용을 비개발자에게 설명하는 능력
  • 지속 학습: 새로운 기술 트렌드 파악 및 적용

9.5 향후 목표

기술적 목표

  • 마이크로서비스: 모놀리식에서 마이크로서비스 아키텍처로 전환
  • AI/ML 통합: 머신러닝 모델을 활용한 개인화 기능
  • 모바일 앱: React Native를 활용한 크로스 플랫폼 앱 개발
  • 실시간 기능: WebSocket, Server-Sent Events를 활용한 실시간 통신

비즈니스 목표

  • 사용자 확대: 월 활성 사용자 10,000명 달성
  • 수익화: 프리미엄 기능을 통한 월 구독료 수익
  • 파트너십: 교육 기관, 기업과의 협력 관계 구축
  • 글로벌 진출: 해외 시장 진출을 위한 다국어 지원

9.6 마무리

이 프로젝트를 통해 단순한 웹 애플리케이션 개발을 넘어서, 실제 사용자들이 사용할 수 있는 서비스를 구축하는 경험을 할 수 있었습니다. 기술적 도전과제들을 해결하면서 얻은 지식과 경험은 앞으로의 개발자 커리어에 큰 자산이 될 것입니다.

특히 사용자 중심의 개발지속적인 개선의 중요성을 깨달았으며, 기술적 완성도뿐만 아니라 실제 사용자 경험을 고려한 개발의 필요성을 체감했습니다.

앞으로도 새로운 기술을 학습하고 적용하면서, 더 나은 사용자 경험을 제공하는 서비스를 만들어 나가겠습니다.


"좋은 코드는 읽기 쉽고, 유지보수하기 쉬우며, 확장 가능해야 한다"

이 프로젝트를 통해 이 말의 진정한 의미를 이해하게 되었고, 앞으로도 이러한 원칙을 바탕으로 개발을 진행하겠습니다.