Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6b78a97
chore: ESLint, Prettier 등 팀 컨벤션 설정
adds9810 Aug 11, 2025
fe4b27b
refactor: FSD 아키텍처 기반 UI 컴포넌트 분리
adds9810 Aug 12, 2025
a421999
refactor: UI 컴포넌트를 shared/ui로 분리
adds9810 Aug 12, 2025
072b491
feat: 도메인별 entities 구조 구축 및 코드 분리
adds9810 Aug 13, 2025
182a0db
feat: Post 엔티티 FSD 구조로 분리 및 PostsManagerPage 리팩토링
adds9810 Aug 13, 2025
083d084
feat: PostsManagerPage 리팩토링
adds9810 Aug 14, 2025
47dc3e5
refactor: 컴포넌트 구조 재정리
adds9810 Aug 14, 2025
b6d9f33
refactor(types): User 타입을 shared layer로 이동
adds9810 Aug 14, 2025
af3a2c4
feat: User 스토어를 Zustand로 마이그레이션
adds9810 Aug 14, 2025
b9f0a0d
fix: 게시글 작성자 정보 누락 문제 해결 및 Zustand 마이그레이션
adds9810 Aug 14, 2025
87980f5
feat: Zustand를 활용한 댓글 관리 시스템 작업
adds9810 Aug 14, 2025
09304ff
refactor: 코드 정리 및 최적화 수정
adds9810 Aug 14, 2025
cdcc920
refactor: Phase 3 - feature/api 분리 및 UI 컴포넌트 분리 완료
adds9810 Aug 14, 2025
1a42483
feat: FSD 구조 정리, PostManager widget 도입
adds9810 Aug 14, 2025
f73e935
fix: 댓글기능 수정
adds9810 Aug 14, 2025
ade0964
refactor: PostManager 위젯을 개별 위젯들로 분리하여 FSD 아키텍처 개선
adds9810 Aug 15, 2025
2bf5d39
feat: Post 엔티티에 TanStack Query 적용
adds9810 Aug 15, 2025
c3855d1
feat: Comment 엔티티에 TanStack Query 적용
adds9810 Aug 15, 2025
90ac4d1
refactor: Comment, Post, User 엔티티 코드 정리 및 TanStack Query 최적화
adds9810 Aug 15, 2025
5445c2c
feat: 댓글 기능 TanStack Query 적용 및 코드 정리
adds9810 Aug 15, 2025
4aa8df7
feat: 댓글 시스템 TanStack Query 완성 및 에러 해결
adds9810 Aug 15, 2025
5c0c4f2
fix: 빌드 에러 해결 및 배포 준비 완료
adds9810 Aug 15, 2025
52fb278
feat: TanStack Query Devtools 설치 및 복원
adds9810 Aug 15, 2025
ebd6322
fix: GitHub Pages 배포를 위한 Vite 설정 최적화
adds9810 Aug 15, 2025
35939bb
feat: Vite 설정 및 HTTP 클라이언트 개선
adds9810 Aug 15, 2025
34b9f3f
fix: GitHub Pages 배포 환경에서 httpClient 환경 감지 개선
adds9810 Aug 15, 2025
5938492
fix: 모든 API 호출을 httpClient로 통일
adds9810 Aug 15, 2025
f115569
refactor: API 레이어 주석 정리 및 문서화 개선
adds9810 Aug 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Deploy to GitHub Pages

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write

jobs:
build-and-deploy:
if: github.event_name == 'push'
runs-on: ubuntu-latest
concurrency:
group: pages-deploy-${{ github.ref }}
cancel-in-progress: true

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Enable corepack (ensure pnpm shim)
run: corepack enable

- name: Setup pnpm
uses: pnpm/action-setup@v2
with:
version: 8
run_install: false

- name: Install dependencies
run: pnpm install --no-frozen-lockfile

- name: Build
run: pnpm run build

- name: Add 404.html (SPA fallback)
run: |
if [ -f "dist/index.html" ]; then
cp dist/index.html dist/404.html
echo "Added 404.html for SPA routing"
fi

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
force_orphan: true
publish_branch: gh-pages
8 changes: 8 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
node_modules
dist
build
coverage
*.log
pnpm-lock.yaml
package-lock.json
yarn.lock
14 changes: 8 additions & 6 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"semi": false,
"printWidth": 120,
"semi": true,
"singleQuote": true,
"jsxSingleQuote": true,
"tabWidth": 2,
"singleQuote": false,
"quoteProps": "consistent",
"trailingComma": "all",
"singleAttributePerLine": false
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "always",
"printWidth": 100,
"endOfLine": "auto"
}
140 changes: 121 additions & 19 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,130 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'

export default tseslint.config(
{ ignores: ['dist'] },
import typescript from "@typescript-eslint/eslint-plugin"
import typescriptParser from "@typescript-eslint/parser"
import { defineConfig } from "eslint/config"
import prettier from "eslint-config-prettier"
import compat from "eslint-plugin-compat"
import importPlugin from "eslint-plugin-import"
import eslintPluginPrettier from "eslint-plugin-prettier"
import react from "eslint-plugin-react"
import reactHooks from "eslint-plugin-react-hooks"
import reactRefresh from "eslint-plugin-react-refresh"

export default defineConfig([
{
ignores: ["**/node_modules/**", "dist/**", ".eslintrc.cjs"],
},
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
files: ["**/*.{js,jsx,ts,tsx}"],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
ecmaVersion: "latest",
sourceType: "module",
parser: typescriptParser,
parserOptions: {
ecmaFeatures: {
jsx: true,
},
tsconfigRootDir: ".",
},
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
"prettier": eslintPluginPrettier,
react,
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
"@typescript-eslint": typescript,
compat,
"import": importPlugin,
},
settings: {
react: {
version: "detect",
},
browsers: "> 0.5%, last 2 versions, not op_mini all, Firefox ESR, not dead",
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
// 기존 규칙 유지
"react-refresh/only-export-components": ["warn", { allowConstantExport: true }],

// Prettier 통합 규칙
"comma-dangle": [
"error",
{
arrays: "always-multiline",
objects: "always-multiline",
imports: "always-multiline",
exports: "always-multiline",
functions: "never",
},
],

// React 관련 규칙
"react/prop-types": "off",
"react/react-in-jsx-scope": "off",
"react-hooks/rules-of-hooks": "error",

// TypeScript 관련 규칙
"@typescript-eslint/no-explicit-any": "warn",

// 팀 컨벤션 - var 사용 금지
"no-var": "error",
"@typescript-eslint/no-unused-vars": "error",

// 팀 컨벤션 - 동등 연산자 (==, !=) 금지
"eqeqeq": ["error", "always", { null: "ignore" }],

// 팀 컨벤션 - 얼리 리턴 권장
"consistent-return": "error",
"no-else-return": ["error", { allowElseIf: false }],

// 팀 컨벤션 - 템플릿 리터럴 규칙
"prefer-template": "error",

// 팀 컨벤션 - 상수는 대문자
"camelcase": [
"error",
{
properties: "never",
ignoreDestructuring: false,
ignoreImports: false,
ignoreGlobals: false,
allow: ["^[A-Z][A-Z0-9_]*$"],
},
],

// 팀 컨벤션 - 구조분해할당 권장
"prefer-destructuring": [
"error",
{
array: true,
object: true,
},
{
enforceForRenamedProperties: false,
},
],

// 기본 코드 품질 규칙
"prefer-const": "error",
"object-shorthand": "error",
"no-multiple-empty-lines": ["error", { max: 1, maxEOF: 0 }],
"no-console": ["warn", { allow: ["warn", "error"] }],
"no-debugger": "warn",
"no-undef": "off",

// import 순서 규칙
"import/order": [
"error",
{
"groups": ["builtin", "external", ["parent", "sibling"], "index"],
"alphabetize": {
order: "asc",
caseInsensitive: true,
},
"newlines-between": "always",
},
],
"import/extensions": "off",
},
},
)
prettier,
])
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,20 @@
"coverage": "vitest run --coverage"
},
"dependencies": {
"@tanstack/react-query": "^5.85.0",
"react": "^19.1.1",
"react-dom": "^19.1.1"
"react-dom": "^19.1.1",
"zustand": "^5.0.7"
},
"devDependencies": {
"@eslint/js": "^9.33.0",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-select": "^2.2.5",
"@tanstack/react-query-devtools": "^5.85.3",
"@testing-library/jest-dom": "^6.6.4",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/node": "^24.2.1",
"@types/react": "^19.1.9",
"@types/react-dom": "^19.1.7",
"@vitejs/plugin-react": "^5.0.0",
Expand Down
Loading