Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
320b709
chore: next프로젝트
rklpoi5678 Oct 31, 2025
1fbc58a
Chore: prettier설정
rklpoi5678 Oct 31, 2025
92beaf8
Chore: eslint플러그인, jsconfig설정
rklpoi5678 Oct 31, 2025
31d6cad
chore: husky설정
rklpoi5678 Oct 31, 2025
460a723
chore: cn 유틸설정
rklpoi5678 Oct 31, 2025
c2e9e4c
chore: package.json 메타데이터 수정
rklpoi5678 Nov 1, 2025
e5304cd
chore: 프로젝트 설정 및 공통 스타일 오버라이드
rklpoi5678 Nov 1, 2025
72d87e2
fix: 오타 수정
rklpoi5678 Nov 1, 2025
19c374f
feat: Footer 컴포넌트 추가
rklpoi5678 Nov 1, 2025
238d8ba
rename: gray-900 오타수정
rklpoi5678 Nov 1, 2025
549aafb
feat: navigation 컴포넌트 추가 및 적용
rklpoi5678 Nov 1, 2025
258ebcf
chore: 기존 설정 수정
rklpoi5678 Nov 1, 2025
cb28fda
fix: 컨벤션에 맞게 수정
rklpoi5678 Nov 1, 2025
1f4e0a1
feat: 랜딩페이지 마이그레이션
rklpoi5678 Nov 1, 2025
f55285e
Chore: 폼 유효성 검사를 위한 라이브러리
rklpoi5678 Nov 1, 2025
9f54485
feat: 경로 설정
rklpoi5678 Nov 1, 2025
786a3ac
feat: 전역으로 사용할 not-found페이지
rklpoi5678 Nov 1, 2025
26a6ff2
Feat: 버튼 기본 스타일과 상태별 스타일분리 tw 클래스를 안전하고 쉽게 조립하게
rklpoi5678 Nov 2, 2025
5d981e3
Feat: path설정 아티클 서버 - 클라이언트 컴포넌트 추가
rklpoi5678 Nov 2, 2025
953a94c
feat: favicon.ico 변경
rklpoi5678 Nov 2, 2025
a1f1218
chore: prisma와 seeding을 위한 패키지
rklpoi5678 Nov 2, 2025
b17475b
feat: prisma 스키마 마이그레이션
rklpoi5678 Nov 2, 2025
8fc86d8
feat: prisma 설정, lib -> libs 폴더명 변경
rklpoi5678 Nov 2, 2025
5f8ad9f
feat: api article route 추가
rklpoi5678 Nov 2, 2025
383e222
feat: 추후에 사용할 포맷, 모달 추가
rklpoi5678 Nov 2, 2025
668fe66
feat: article, beatArticle 컴포넌트 생성
rklpoi5678 Nov 2, 2025
654847e
fix: truncateText 함수 오타 제거
rklpoi5678 Nov 2, 2025
8e81f72
chore: 이미지를 사용하기 위한next.config.mjs 리모트 패턴설정
rklpoi5678 Nov 2, 2025
a5c4600
feat: 컴포넌트 연결
rklpoi5678 Nov 2, 2025
7044296
feat: 전역 에러 핸들러 추가
rklpoi5678 Nov 2, 2025
8b0c1a6
chore: 추후 배포시 prisma generate 후 빌드 설정
rklpoi5678 Nov 2, 2025
342da32
feat: post 라우터 설정
rklpoi5678 Nov 2, 2025
5a08d20
fix: 등록페이지 등록api 추가
rklpoi5678 Nov 2, 2025
857d410
fix: 이미지 배열에 이미지 가 없을경우 디폴트 이미지로
rklpoi5678 Nov 2, 2025
64e9dd5
feat: 베스트 게시물을 위한 api 추가
rklpoi5678 Nov 2, 2025
13cf33a
feat: 아티클 상세페이지에 쓸 아이콘 추가
rklpoi5678 Nov 3, 2025
54b7cd1
feat: 아티클 상세페이지
rklpoi5678 Nov 3, 2025
f460ea4
feat: articles 페이지 디자인 수정 및 dropdown추가
rklpoi5678 Nov 4, 2025
3686621
fix: 버튼 cva 로직 수정
rklpoi5678 Nov 4, 2025
b391914
feat: article페이지 검색기능, 드롭다운
rklpoi5678 Nov 4, 2025
9e05819
remove: aritlceDetail페이지 컴포넌트 분리
rklpoi5678 Nov 4, 2025
5c05e3c
feat: 댓글 서버액션 및 간단한 suspend 효과
rklpoi5678 Nov 4, 2025
f6d1e01
fix: 네비게이션 바 로고 이미지 반응형에 용이하게 변경
rklpoi5678 Nov 4, 2025
9dae86d
feat: 정적 처리를 명시적으로
rklpoi5678 Nov 4, 2025
09f67b2
feat: 네비게이션 컴포넌트 반응형
rklpoi5678 Nov 4, 2025
7d8f534
feat: 베스트 게시글 반응형(브래이크 포인트마다 카드 갯수변경)
rklpoi5678 Nov 4, 2025
b9bf004
feat: 푸터 반응형
rklpoi5678 Nov 4, 2025
18ce2c1
design: dropdown 반응형
rklpoi5678 Nov 4, 2025
8fadf75
design: 게시물 쓰기 반응형
rklpoi5678 Nov 4, 2025
cd4ae30
design: 디테일 페이지 반응형
rklpoi5678 Nov 4, 2025
39c6a64
feat: 날짜형식을 자르기위한 유틸함수추가
rklpoi5678 Nov 4, 2025
5c98a75
feat: 서버액션 revalidateTag
rklpoi5678 Nov 4, 2025
44d9117
feat: 서버액션 revalidateTag
rklpoi5678 Nov 4, 2025
e4923be
feat: 드롭다운컨텐트 컴포넌트 생성
rklpoi5678 Nov 4, 2025
24c2c39
rename: 서치 및 다른 컴포넌트 임포트시 이름 변경
rklpoi5678 Nov 4, 2025
f377154
feat: 환경변수 예시
rklpoi5678 Nov 4, 2025
054fa58
fix: dropdown 코드 최적화
rklpoi5678 Nov 4, 2025
9d62fef
fix: server action 함수 캐시 만료후 즉시 업데이트
rklpoi5678 Nov 4, 2025
530fe8b
rename: 보기 불편한 코드 정리
rklpoi5678 Nov 4, 2025
d30d0b3
fix: 이클립스 이미지 클릭반경 수정
rklpoi5678 Nov 4, 2025
5fcaae5
docs: 중복되는 설정코드 제거 및 next lint removal
rklpoi5678 Nov 5, 2025
7ed1747
feat: 검색기능, 드롭다운 정렬기능
rklpoi5678 Nov 5, 2025
897e70e
feat: 댓글 수정기능
rklpoi5678 Nov 5, 2025
44d56bb
fix: 이미지(svg) unoptimize
rklpoi5678 Nov 5, 2025
fdcb512
refator: 하드코딩된 도메인 주소 수정
rklpoi5678 Nov 5, 2025
4f6c068
fix: 404에러 사용하지않는 articleId -> id로 변경
rklpoi5678 Nov 5, 2025
8e483bc
fix: 'use cache'로 변경
rklpoi5678 Nov 5, 2025
b9f3d87
fix: 캐싱 요구사항 변경
rklpoi5678 Nov 5, 2025
47a1c0f
feat: 게시물 수정기능
rklpoi5678 Nov 5, 2025
4cd3ed6
feat: 게시글 삭제 기능 추가
rklpoi5678 Nov 5, 2025
79c9506
feat: 댓글 삭제 기능추가
rklpoi5678 Nov 5, 2025
031b1f4
docs: 주석이 좀 이상한 부분 수정
rklpoi5678 Nov 5, 2025
94f4992
feat: 백엔드 유효성 검사
rklpoi5678 Nov 7, 2025
f9a8a84
refator: api헬퍼함수 로 리스폰스 재사용
rklpoi5678 Nov 7, 2025
7bdd97d
fix: DELETE 라우트 성공 응답 누락 수정
rklpoi5678 Nov 7, 2025
d7bde3f
refator: comment schema 분리 및 정리
rklpoi5678 Nov 7, 2025
14c376c
docs: 굳이 필요없는 항목 깃 캐시 취소 (로컬0 - 원격x)
rklpoi5678 Nov 7, 2025
5f9d093
Feat: 미션9시작 로그인/회원가입 페이지 마이그레이션을 위한 사전준비
rklpoi5678 Nov 10, 2025
ad6dc25
remove: lint 안쓰는 zod 임포트 코드 삭제
rklpoi5678 Nov 10, 2025
ec883f4
Feat: 기존 로그인 코드 마이그레이션
rklpoi5678 Nov 10, 2025
da2afee
Feat: 자주 사용하는 소셜 기능 프레젠테이션 컴포넌트 분리
rklpoi5678 Nov 10, 2025
27f5d88
remove: 폴더이동
rklpoi5678 Nov 10, 2025
2986822
Feat: PKJ-5 로그인 마이그레이션 완료
rklpoi5678 Nov 10, 2025
fbe327a
Feat: PKJ-6 회원가입 페이지 마이그레이션
rklpoi5678 Nov 10, 2025
2eca5c6
Merge pull request #1 from rklpoi5678/feat/PKJ-5-login-migration
rklpoi5678 Nov 11, 2025
16d6365
Merge pull request #2 from rklpoi5678/PRJ-6-
rklpoi5678 Nov 11, 2025
e2f39c6
Feat:[PRJ-9] 로그인, 회원가입 메타데이터 설정
rklpoi5678 Nov 11, 2025
1d63c4a
Feat: [PRJ-9] 기본 패치 클라이언트 인증 필요 없는 요청용
rklpoi5678 Nov 11, 2025
64853fc
Feat: [PRJ-9] 쿠키 인증용 패치 클라이언트
rklpoi5678 Nov 11, 2025
bc46d25
Feat: [PRJ-9] user-service formData용 패치
rklpoi5678 Nov 11, 2025
623a39d
Feat: [PRJ-9] 유저 서비스
rklpoi5678 Nov 11, 2025
a590a79
Fix: [PRJ-9] layout 시안대로 수정
rklpoi5678 Nov 11, 2025
4d86de5
Feat: [PRJ-9] 로그인, 회원가입 서비스 로직 추가
rklpoi5678 Nov 11, 2025
2bd4915
Feat: [PRJ-9] 내려줄 프로바이더 생성
rklpoi5678 Nov 11, 2025
c782584
Feat: [PRJ-9] 인증용프로바이더 추가
rklpoi5678 Nov 11, 2025
9943675
!BREAKING CHANGE: [PRJ-9] 백엔드 유저 기능을 위한 스키마 변경
rklpoi5678 Nov 11, 2025
a49d8ed
Merge pull request #3 from rklpoi5678/PRJ-9-accesstoken - mission 9
rklpoi5678 Nov 12, 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
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
NODE_ENV="<production || development || test>"
DATABASE_URI="<your accelerate prisma key>"

NEXT_PUBLIC_BASE_URL="<DOMAIN_URL>"
NEXT_PUBLIC_API_URL="<https://panda-...>"

# GENERATEED WITH `openssl rand -base64 32`
JWT_SECRET="your-super-secret-key"
52 changes: 52 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
/e2e/.auth/

# next.js
/.next/
/out/

# prisma
/src/libs/generated

/prisma/schema/migrations

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*
!.env.example

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
4 changes: 4 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

npx lint-staged
10 changes: 10 additions & 0 deletions .lintstagedrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const path = require('path')

const buildEslintCommand = (filenames) =>
`eslint --fix ${filenames
.map((f) => `"${path.relative(process.cwd(), f)}"`)
.join(' ')}`

module.exports = {
'*.{js,jsx,ts,tsx}': [buildEslintCommand],
}
11 changes: 11 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"singleQuote": true,
"semi": true,
"trailingComma": "all",
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"plugins": [
"prettier-plugin-tailwindcss"
]
}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"editor.formatOnSave": true
}
1,088 changes: 1,088 additions & 0 deletions bun.lock

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions config/metadata.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export const rootMetadata = {
title: {
default: '판다마켓 Next프로젝트',
template: '%s | Next.js 프로젝트',
},
description: '판다마켓 넥스트 프로젝트 미션-8',
keywords: ['Next.js', ' React', 'Tailwind CSS'],
creator: 'Kim youn gi',
};

export const loginMetadata = {
title: '판다마켓 로그인',
description: '판다마켓 로그인 페이지',
};

export const signupMetadata = {
title: '판다마켓 회원가입',
description: '판다마켓 회원가입 페이지',
};
23 changes: 23 additions & 0 deletions config/paths.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export const paths = {
home: {
getHref: () => '/',
},

app: {
articles: {
getHref: () => '/articles',
},
registration: {
getHref: () => '/articles/registration',
},
},

auth: {
login: {
getHref: () => '/login',
},
signup: {
getHref: () => '/signup',
},
},
};
109 changes: 109 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import { defineConfig, globalIgnores } from 'eslint/config';
import nextVitals from 'eslint-config-next/core-web-vitals';
import prettierConfig from 'eslint-config-prettier';
// 파일/폴더명 정렬 플러그인 - 캐밥케이스
import checkFilePlugin from 'eslint-plugin-check-file';
// 파일/폴더명 정렬 플러그인
import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort';
import globals from 'globals';

/**
* @see https://nextjs.org/docs/app/api-reference/config/eslint
* @see https://en.wikipedia.org/wiki/Glob_(programming)
*/
// 기본 설정 (모든 파일에 적용)
const baseConfig = [
{
files: ['**/**.{js,mjs,cjs,jsx}'],
languageOptions: {
globals: {
...globals.browser, // window. document 브라우저 전역변수 허용
...globals.node, // process, require 노드.js 전역 변수
},
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
},
// var금지, const우선
rules: {
'prefer-const': 'error',
'no-var': 'error',
},
},
];

// react, reactHooks setting
/**
* @see https://mariais.tistory.com/entry/Eslint-reactreact-in-jsx-scope-off%EA%B0%80-%EC%9E%91%EB%8F%99%EC%9D%B4-%EC%95%88%EB%90%98%EB%8A%94-%EA%B2%BD%EC%9A%B0
*/
const reactConfig = {
files: ['**/*.{jsx}'],
// 플러그인 권장규칙으로
rules: {
'react/react-in-jsx-scope': 'off', // ! 최신버전에서 import React 필요 없음
},
};

const ImportSortConfig = {
plugins: {
'simple-import-sort': simpleImportSortPlugin,
},
rules: {
'simple-import-sort/imports': 'error', // import 순서 강제
'simple-import-sort/exports': 'error', // export 순서 강제
},
};

/**
* @see https://www.reddit.com/r/nextjs/comments/1i23e46/kebabcase_or_pascalcase_for_nextjs_file_names/#:~:text=According%20to%20a%20Reddit%20user%2C%20kebab%2Dcase%20is,renaming%20a%20file%20with%20a%20capitalization%20change
* @see https://www.piyushgambhir.com/blogs/next-js-naming-conventions#:~:text=%EC%9D%B4%20%EA%B7%9C%EC%B9%99%EC%9D%80%20%EA%B2%BD%EB%A1%9C%20URL%EC%9D%84%20%EC%98%88%EC%B8%A1%20%EA%B0%80%EB%8A%A5%ED%95%98%EA%B3%A0%20SEO%20%EC%B9%9C%ED%99%94%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%A7%8C%EB%93%AD%EB%8B%88%EB%8B%A4.%20%EC%98%88%EB%A5%BC%20%EB%93%A4%EC%96%B4%2C%20%EB%9D%BC%EB%8A%94%20%ED%8E%98%EC%9D%B4%EC%A7%80%20%ED%8C%8C%EC%9D%BC%EC%9D%80%20%ED%95%98%EC%9D%B4%ED%94%88%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%98%EB%8A%94%EB%8D%B0%2C%20%EC%9D%B4%EB%8A%94%20%EA%B2%80%EC%83%89%20%EC%97%94%EC%A7%84%EC%97%90%EC%84%9C%20%EC%BA%90%EB%A9%9C%EC%BC%80%EC%9D%B4%EC%8A%A4%EB%82%98%20%EB%B0%91%EC%A4%84%EB%B3%B4%EB%8B%A4%20%EC%9D%BD%EA%B8%B0%20%EC%89%BD%EA%B3%A0%20%EC%84%A0%ED%98%B8%ED%95%A9%EB%8B%88%EB%8B%A4.%20%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%20%EC%A0%84%EC%B2%B4%EC%97%90%EC%84%9C%20%EC%9D%BC%EA%B4%80%EB%90%9C%20%EC%86%8C%EB%AC%B8%EC%9E%90%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%98%EB%A9%B4%20%ED%8C%80%EC%9D%98%20%ED%83%90%EC%83%89%EC%9D%B4%20%ED%96%A5%EC%83%81%EB%90%98%EA%B3%A0%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EA%B0%80%EC%A0%B8%EC%98%AC%20%EB%95%8C%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EC%A4%84%EC%96%B4%EB%93%AD%EB%8B%88%EB%8B%A4(%EC%A0%95%ED%99%95%ED%95%9C%20%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90%EA%B0%80%20%EC%9D%BC%EC%B9%98%ED%95%B4%EC%95%BC%20%ED%95%98%EA%B8%B0%20%EB%95%8C%EB%AC%B8%EC%97%90)
*/
const fileNamingConventionConfig = {
files: ['src/**/*'],
plugins: {
'check-file': checkFilePlugin,
},
rules: {
// file-name
'check-file/filename-naming-convention': [
'error',
{ '**/*.{js,jsx}': 'KEBAB_CASE' },
{ ignoreMiddleExtensions: true }, // .module.css 같은 경우 예외로 중간 확장자를 무시하게
],
// folder-name
'check-file/folder-naming-convention': [
'error',
{ '!(src/app)/**/*': 'KEBAB_CASE' },
{
errorMessage:
'The folder "{{ target }}" does not match the "{{ pattern }}" pattern, see eslint-pattern for details',
},
],
},
};

const eslintConfig = defineConfig([
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
'.next/**',
'out/**',
'build/**',
'next-env.d.ts',
'node_modules/**',
// 여기서 무시할 파일/폴더 추가
]),

// config export
...baseConfig,
...nextVitals,
reactConfig,
ImportSortConfig,
fileNamingConventionConfig,

// Prettier와 충돌하는 모든 린팅 규칙을 비활성화
prettierConfig,
]);

export default eslintConfig;
29 changes: 29 additions & 0 deletions jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"compilerOptions": {
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"target": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"paths": {
"@/*": [
"./src/*"
],
"#/*": [
"./*"
]
}
}
}
24 changes: 24 additions & 0 deletions next.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
/* config options here */
reactCompiler: true,
// cacheComponents: true,
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'picsum.photos',
},
{
protocol: 'https',
hostname: 'i.pravatar.cc',
},
{
protocol: 'https',
hostname: 'panda-market-api.vercel.app',
},
],
},
};

export default nextConfig;
Loading