이 기사에서는 데이터베이스 지원, Vercel AI SDK를 통한 AI 지원 및 Tolgee를 통한 현지화를 통해 WebSocket을 사용하여 Next.js에서 실시간 Kanban 보드를 구축할 것입니다.
배울 내용: ✨
Tolgee 저장소에 별표 표시 ⭐
AI 및 현지화 지원을 통해 독특한 Kanban 보드를 구축할 준비가 되셨나요? ?
다음 명령을 사용하여 새 Next.js 애플리케이션을 초기화합니다.
ℹ️ 원하는 패키지 관리자를 사용할 수 있습니다. 이번 프로젝트에서는 npm을 사용하겠습니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
다음으로 새로 생성된 Next.js 프로젝트로 이동하세요.
cd kanban-ai-realtime-localization
몇 가지 종속성이 필요합니다. 프로젝트에 필요한 모든 종속성을 설치하려면 다음 명령을 실행하세요.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
UI 구성 요소의 경우 shadcn/ui를 사용합니다. 다음 명령을 사용하여 기본 설정으로 초기화하세요.
npx shadcn@latest init -d
이제 나중에 애플리케이션에서 사용할 UI 구성 요소를 추가해 보겠습니다. shadcn/ui에서 재사용 가능한 구성 요소를 추가하려면 다음 명령을 실행하세요.
npx shadcn@latest add button card input label select textarea toast
app/comComponents/ui 디렉토리 내에는 이러한 구성 요소에 대한 몇 가지 추가 파일이 추가되며, 이는 애플리케이션용 UI를 구축할 때 사용할 것입니다.
다음 명령을 사용하여 Prisma를 초기화하세요.
npx prisma init
이 명령을 실행한 후에는 프로젝트 루트의 prisma 디렉터리에 새 Schema.prisma 파일이 생성되어야 합니다.
PostgreSQL을 데이터베이스로 사용하고 사용자 및 작업 모델을 포함하도록 새로 생성된 Schema.prisma 파일을 수정하세요.
// ? prisma/schema.prisma // This is your Prisma schema file, // learn more about it in the docs: <https://pris.ly/d/prisma-schema> // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? // Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init> generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique password String tasks Task[] @relation("UserTasks") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Task { id String @id @default(cuid()) title String description String? userId String column Int order Int createdBy User @relation("UserTasks", fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }
모델은 간단합니다. 각 사용자는 여러 작업을 가질 수 있으며 각 작업은 특정 사용자에게 연결됩니다. 작업에는 해당 상태(0은 진행 중, 1은 보류 중, 2는 완료)를 나타내는 정수 열 값이 있습니다. 순서 값은 할당된 열 내에서 각 작업의 위치를 결정합니다.
이제 모델이 준비되었으므로 이를 데이터베이스에 푸시해야 합니다. 이를 위해서는 연결 URL이 필요합니다.
이미 Neon이나 다른 서비스를 통해 데이터베이스에 액세스할 수 있다면 좋습니다. .env 파일을 연결 URL로 채웁니다. docker를 사용하여 로컬로 데이터베이스를 설정할 필요가 없습니다.
따라서 Docker를 사용하여 로컬 PostgreSQL 데이터베이스로 프로젝트를 시도하려면 이 연결 문자열 값이 포함된 DATABASE_URL이라는 새 변수를 .env 파일에 추가하세요.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
데이터베이스를 로컬에서 실행하려면 Docker가 설치되어 있는지 확인하세요. 프로젝트 루트에 scripts라는 새 디렉터리를 만들고 다음 코드 줄을 사용하여 start-local-db-docker.sh라는 파일을 추가합니다.
cd kanban-ai-realtime-localization
이 스크립트는 기본적으로 DATABASE_URL 변수에 대한 .env 파일을 읽고 사용자 이름, 비밀번호, 데이터베이스 이름과 같은 모든 관련 데이터를 추출하고 존재하지 않는 경우 컨테이너를 만듭니다. 이미 실행 중인 경우 기존 컨테이너를 회전시키기만 하면 됩니다.
이 스크립트를 실행하여 애플리케이션의 모든 사용자 데이터를 호스팅할 PostgreSQL 컨테이너를 생성하고 실행합니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
이제 PostgreSQL이 포함된 컨테이너가 실행 중이어야 합니다. 다음 명령을 실행하여 해당 여부를 확인할 수 있습니다.
npx shadcn@latest init -d
이제 데이터베이스와 상호 작용하기 위해 Prisma 클라이언트를 인스턴스화하는 방법이 필요합니다.
src/db 디렉터리에 index.ts라는 새 파일을 만들고 다음 코드 줄을 추가하세요.
npx shadcn@latest add button card input label select textarea toast
우리는 애플리케이션 전체에서 하나의 인스턴스만 생성 및 재사용되도록 PrismaClient의 싱글톤 인스턴스를 설정했습니다. 이는 특히 개발 모드에서 유용합니다.
이제 내보낸 상수 DB를 사용하여 애플리케이션의 데이터베이스와 상호 작용할 수 있습니다.
다음 명령을 실행하여 스키마 변경 사항을 데이터베이스에 푸시하세요.
npx prisma init
이제 업데이트된 유형이 IDE에서 작동하도록 하려면 다음 명령을 실행하여 업데이트된 스키마를 기반으로 새 유형을 생성하세요.
// ? prisma/schema.prisma // This is your Prisma schema file, // learn more about it in the docs: <https://pris.ly/d/prisma-schema> // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? // Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init> generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique password String tasks Task[] @relation("UserTasks") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Task { id String @id @default(cuid()) title String description String? userId String column Int order Int createdBy User @relation("UserTasks", fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }
이것이 애플리케이션 데이터베이스를 설정하는 데 필요한 전부입니다. ?
Tolgee를 사용하여 Next.js 애플리케이션에서 현지화를 활성화하려면 다음 단계를 따르세요.
이 파일은 언어 감지 및 쿠키 관리를 처리합니다.
// ? .env # If you are using local DB with docker DATABASE_URL=postgresql://postgres:password@localhost:5432/kanban-board
setLanguage 기능은 선택한 언어(로케일)를 1년 동안 만료되는 쿠키로 저장하여 앱이 세션 전반에 걸쳐 사용자의 언어 기본 설정을 기억할 수 있도록 합니다.
getLanguage 함수는 쿠키에 저장된 언어를 확인합니다. 유효한 언어가 발견되면 이를 반환합니다. 그렇지 않으면 브라우저에서 실행 중인 경우 브라우저 헤더에서 언어를 감지하려고 시도합니다. 감지에 실패하거나 환경이 브라우저가 아닌 경우 기본값은 DEFAULT_LANGUAGE입니다.
이 파일에는 번역을 위한 정적 데이터 가져오기를 포함하여 현지화 처리를 위한 공유 상수와 함수가 포함되어 있습니다
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
getStaticData 함수는 현지화된 콘텐츠를 미리 가져오기 위해 특정 언어 및 네임스페이스에 대한 번역을 로드하는 역할을 합니다. 메시지 디렉터리에서 언어 및 네임스페이스별로 JSON 파일을 가져온 다음 모든 것을 단일 객체로 묶어 반환합니다.
애플리케이션의 언어 선택을 위해 사용자에게 네 가지 언어 선택(영어, 체코어, 프랑스어, 독일어)을 제공합니다. 원하는 경우 다른 언어에 대한 지원을 추가할 수 있습니다.
프로젝트 루트에 있는 메시지 디렉토리에는 다양한 단어와 문장에 대한 다양한 정적 데이터가 저장됩니다.
ℹ️ 내 저장소에서 이러한 정적 번역 파일에 대한 링크를 찾을 수 있습니다. 그 파일에는 다른 언어로 번역된 문장들이 잔뜩 들어있어서 설명할 것이 없습니다.
TolgeeBase 기능은 번역 처리를 위한 도구로 Tolgee를 설정합니다. ICU 메시지 형식화(FormatIcu)에 대한 지원을 추가하고 디버깅을 위한 DevTools를 포함합니다. 이 함수는 환경 변수의 API 키와 URL을 사용하고 영어(en)를 대체 언어로 설정합니다.
우리는 두 가지 다른 env 변수를 사용하고 있으며 이러한 API 키로 .env 파일을 채웁니다. Tolgee에 계정을 등록하고 TOLGEE_API_KEYS에 액세스하세요. 하지만 이 애플리케이션의 경우 해당 API 키가 필요하지 않습니다.
cd kanban-ai-realtime-localization
이 파일은 서버 측 렌더링을 위해 Tolgee 인스턴스를 구성하고 번역 처리를 설정합니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
이 코드는 서버측 번역 처리를 위한 Tolgee 인스턴스를 생성합니다. 먼저 사용자가 선호하는 언어를 검색하는 getLanguage 함수를 사용하도록 getLocale을 설정합니다. 그런 다음 createTolgee에서 getStaticData를 통해 지원되는 모든 언어에 대한 번역 데이터로 Tolgee를 초기화합니다.
또한 제공된 언어(getLanguage에서)를 사용하도록 Tolgee를 설정하고 revalidate: 0을 설정하여 번역 요청 캐싱을 방지함으로써 항상 새로운 데이터를 로드하도록 사용자 정의 가져오기 기능을 구성합니다.
클라이언트측 렌더링을 위한 Tolgee 공급자를 설정합니다.
npx shadcn@latest init -d
이 코드는 번역을 위한 클라이언트측 Tolgee 공급자를 설정합니다. TolgeeProviderClient는 언어, staticData 및 하위 항목을 props로 사용하고 지정된 언어 및 데이터로 Tolgee를 초기화합니다. useEffect 내부에서는 PermanentChange로 언어 변경을 수신하고, 언어가 업데이트될 때마다 router.refresh()를 통해 페이지를 새로 고칩니다.
마지막으로 TolgeeProvider는 ssr 옵션을 사용하여 번역을 미리 로드하고 번역이 즉시 준비되지 않은 경우 "로드 중..."을 표시하여 하위 항목을 렌더링합니다.
마지막으로
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
여기서 먼저 헤더나 함수에서 설정한 쿠키를 기반으로 사용자의 로케일에 액세스합니다. 그런 다음 해당 로케일을
태그.Next.js 애플리케이션에서 Tolgee를 설정하는 데 필요한 전부입니다. ✨이것은 모든 Next.js 애플리케이션에서 Tolgee를 사용하여 위치를 구현하기 위해 수행해야 하는 표준 프로세스가 될 것입니다.
우리는 애플리케이션에서 인증을 위해 NextAuth를 사용할 것입니다. 먼저, 사용자가 전달한 데이터의 유효성을 검사하는 데 사용할 새로운 Zod 스키마를 정의하는 것부터 시작하겠습니다.
로그인 및 등록 중에 이메일 및 비밀번호에 대한 사용자 입력을 검증하기 위해 Zod 스키마(AuthSchema)를 정의합니다. 이렇게 하면 이메일 형식이 정확하고 비밀번호가 지정된 길이 요구 사항을 충족하는지 확인할 수 있습니다.
cd kanban-ai-realtime-localization
이메일 필드는 다른 문자열이 아닌 정확한 이메일이어야 하며, 비밀번호 필드는 최소 8자, 최대 20자여야 합니다. 우리는 로그인/등록 양식에서 사용자가 전달한 데이터를 검증하여 기준을 충족하는지 확인하기 위해 여러 위치에서 이 검증 스키마를 사용할 것입니다.
인증을 위해 CredentialsProvider를 사용하여 src/app/api/auth/[...nextauth] 아래의 Route.ts에서 NextAuth를 설정합니다. 승인 기능은 자격 증명의 유효성을 검사하고, 사용자의 존재를 확인하고, 비밀번호를 확인합니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
인증 함수 로직은 사용자 로그인 여부를 담당합니다. 이 설정의 기능은 제공된 이메일 및 비밀번호가 데이터베이스의 기존 사용자와 일치하는지 확인합니다.
Credential 기반 인증만을 사용하고 있습니다. 먼저 필드 유효성 검사를 위해 AuthSchema를 사용하여 자격 증명의 유효성을 검사합니다. 유효성 검사가 성공하면 데이터베이스에서 이메일로 사용자를 조회합니다. 사용자가 발견되면 데이터베이스의 해시된 비밀번호와 입력된 비밀번호를 비교합니다. 두 검사를 모두 통과하면 사용자 데이터(비밀번호 제외)가 반환됩니다.
짐작할 수 있듯이 여기서는 .env 파일 내에 NEXTAUTH_SECRET 변수를 정의해야 합니다. .env 파일을 다음 두 변수로 채웁니다.
npx shadcn@latest init -d
src/app/api/auth/register/route.ts에서 비밀번호를 해시하고 데이터베이스에 사용자 데이터를 저장하는 사용자 등록용 엔드포인트를 생성합니다. 그런 다음 검증 성공에 따라 적절한 응답을 반환합니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
여기에서는 클라이언트로부터 받은 데이터를 구문 분석하고 앞서 작성한 AuthSchema로 유효성을 검사합니다. 그런 다음 회전 값이 12인 해시를 생성합니다. 이는 데이터베이스에 저장할 암호화된 텍스트를 생성하고 마지막으로 사용자를 반환합니다.
이제 애플리케이션을 더욱 견고하게 만들기 위해 사용자가 특정 경로를 방문할 때마다 userSession을 확인하고 인증되지 않으면 해당 경로를 방문할 수 없도록 하는 미들웨어를 추가해 보겠습니다.
인증되지 않은 사용자의 /kanban 경로에 대한 액세스를 제한하기 위해 미들웨어를 추가합니다.
cd kanban-ai-realtime-localization
여기서는 사용자가 인증되지 않은 경우 "/kanban" 경로를 방문할 수 없어야 한다는 의미입니다.
인증 처리를 위한 백엔드 로직이 완료되었습니다. 몇 가지 클라이언트측 로직을 작업해 보겠습니다.
Navbar 구성 요소도 몇 가지 작은 구성 요소로 구성될 예정입니다. 로그인, 등록, 로그아웃 버튼과 사용자가 언어를 전환할 수 있는 선택 태그가 있습니다.
이러한 구성 요소 작업을 시작하겠습니다!
src/app/comComponents 디렉토리 내에 다음 코드 줄을 사용하여 새 파일 lang-selector.tsx를 만듭니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
구성요소는 설명이 매우 명확해야 합니다. 우리는 우리가 선택할 수 있는 모든 언어를 매핑하기 위해 shadcn/ui에서 제공하는 구성 요소입니다. 사용자 선택에 따라 앞서 Language.ts 파일에서 작업한 setLanguage 함수를 사용하여 해당 언어로 설정했습니다.
? 참고: 코드의 텍스트를 어떻게 하드코딩하지 않는지 확인하세요. 대신 Tolgee의 구성 요소를 사용하여 텍스트를 렌더링하고 있습니다. 이렇게 하면 사용자가 언어를 전환할 때 텍스트가 그에 따라 변경됩니다. 텍스트를 하드코딩하면 번역을 구현하는 것이 효과적이지 않습니다. 우리는 앞으로도 이 접근 방식을 계속 사용할 것입니다.
저희는
마찬가지로 이 구성 요소 디렉터리 내에 다음 코드 줄을 사용하여 logout-btn.tsx라는 새 파일을 만듭니다.
npx shadcn@latest init -d
이전과 유사하게 사용자가 버튼을 클릭하면 사용자 로그아웃을 시도하는 handlerLogout 함수가 트리거되고 오류가 발생하면 번역된 오류 메시지와 함께 토스트 알림이 표시됩니다.
사용자가 로그아웃할 때 로딩 상태를 사용하여 로더 아이콘을 표시합니다.
마지막으로 필요한 작은 구성요소를 모두 사용할 수 있으므로
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
이 Navbar 구성 요소는 애플리케이션에 대한 탐색 모음을 생성합니다. getServerSession을 사용하여 사용자가 로그인했는지 확인합니다. 사용자가 인증되면 로그아웃 버튼이 표시됩니다. 그렇지 않은 경우 사용자에게 로그인하고 등록할 수 있는 링크가 표시됩니다.
이제 인증을 위한 백엔드 로직 처리가 완료되었고 애플리케이션에 Tolgee 구현도 완료되었습니다. 클라이언트 측 로직을 작업하고 UI를 구축해 보겠습니다.
app/comComponents 디렉토리 내에 다음 코드 줄을 사용하여 login.tsx라는 새 파일을 만듭니다.
cd kanban-ai-realtime-localization
이 로그인 구성 요소는 이메일 및 비밀번호에 대한 로그인 양식을 표시하며 두 입력 필드가 모두 제어 구성 요소로 작동합니다. 양식을 제출하면 next-auth에서 signIn을 호출하여 인증을 처리합니다. 로그인에 실패하면 토스트 알림을 통해 번역된 오류 메시지가 표시됩니다. 로그인에 성공하면 사용자가 홈페이지로 리디렉션됩니다.
또한 사용자가 애플리케이션에 로그인하는 동안 로딩 애니메이션 아이콘을 표시하는 데 사용하는 별도의 로딩 상태 변수도 있습니다.
현재 이것은 우리가 만든 구성 요소일 뿐입니다. 아직 우리 애플리케이션에는 표시되지 않습니다. 그러기 위해서는 애플리케이션의 앱 디렉토리에 이 구성요소를 렌더링해야 합니다.
src/app/login 디렉터리 내에 다음 코드 줄을 사용하여 page.tsx라는 새 파일을 만듭니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
로그인 페이지에서는 먼저 사용자에게 활성 세션이 있는지 확인합니다. 사용자에게 활성 세션이 있는 경우 간단히 "/kanban" 경로(곧 구현할 예정)로 리디렉션합니다. 사용자에게 활성 세션이 없으면 이전
이제 로그인 페이지 구현이 완료되었습니다. 마찬가지로 등록 페이지를 만들어 보겠습니다.
app/comComponents 디렉터리 내에서 다음 코드 줄을 사용하여 새로운 파일 Register.tsx를 만듭니다.
npx shadcn@latest init -d
이 구성 요소의 이메일 및 비밀번호 입력은 로그인 페이지의 입력과 유사하게 제어되는 구성 요소로 작동합니다. 여기서는 React Query를 사용하여 POST 요청 프로세스를 단순화합니다. 이 접근 방식을 사용하면 로드 또는 오류 처리를 위해 별도의 상태를 관리할 필요가 없습니다.
사용자가 양식에서 제출 버튼을 클릭하면 이전에 작업한 데이터베이스에 사용자를 등록하기 위해 API 경로에 POST 요청이 이루어집니다. 등록이 성공하면 사용자는 로그인 페이지로 리디렉션됩니다. 그렇지 않은 경우 번역된 오류 메시지와 함께 토스트 메시지가 표시됩니다.
사용자가 제출 버튼을 클릭하면 이전에 설정한 데이터베이스에 사용자를 등록하기 위해 POST 요청이 API 경로로 전송됩니다. 성공적으로 등록되면 사용자는 로그인 페이지로 리디렉션됩니다. 등록에 실패하면 관련 키를 사용하여 번역된 오류 메시지와 함께 토스트 메시지가 표시됩니다.
src/app/register 디렉토리 내에 다음 코드 줄을 사용하여 page.tsx라는 새 파일을 만듭니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
이 페이지 설정으로 애플리케이션 인증 흐름이 완료되었습니다. 이제 현지화를 지원하는 인증 지원 애플리케이션이 작동할 것입니다.
이 섹션에서는 애플리케이션용 WebSocket 서버를 설정합니다. 먼저 소켓에 액세스하는 데 도움이 되는 함수를 만들어 보겠습니다.
src/config 디렉터리 내에서 다음 코드 줄을 사용하여 새 파일 소켓.ts를 만듭니다.
cd kanban-ai-realtime-localization
이 코드는 환경 변수 NEXT_PUBLIC_APP_URL에 지정된 URL에 대한 Socket.IO 클라이언트 연결을 초기화하여 소켓이 한 번만 생성되도록 하는 getSocket 함수를 정의합니다. 소켓이 이미 초기화된 경우 기존 소켓 인스턴스를 반환합니다.
이제 소켓.io 연결을 관리하고 구성 요소가 소켓 인스턴스에 액세스할 수 있는 방법을 제공해야 합니다. src/providers 디렉터리 내에서 다음 코드 줄을 사용하여 새 파일 소켓 제공자.tsx를 만듭니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
이 코드는 Socket.IO 연결을 관리하기 위한 React 컨텍스트를 생성하고 소켓 인스턴스에 액세스하기 위한 useSocket 후크를 제공합니다. SocketProviderClient는 getSocket 함수를 사용하여 소켓을 초기화하고 연결한 다음 컨텍스트 공급자에 하위 항목을 래핑하여 애플리케이션 전체에서 소켓 인스턴스를 공유합니다.
이제 데이터 전송 및 수신을 위해 WebSocket을 사용하는 데 액세스하려면 이 소켓 공급자로 애플리케이션을 래핑해야 합니다.
동일한 디렉터리 내에서 @tanstack/react-query의 QueryClientProvider와 새로 생성된 SocketProviderClient로 하위 구성 요소를 래핑하는 데 사용할 새 파일 공급자.tsx를 만듭니다.
파일에 다음 코드 줄을 추가합니다.
npx shadcn@latest init -d
이제 우리가 해야 할 일은 애플리케이션을 이
다음 코드 줄을 사용하여 프로젝트 루트의 레이아웃.tsx를 수정합니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
이제 자체 Socket.io 서버를 만들 준비가 되었습니다. 새 파일 server.ts를 만들고 다음 코드 줄을 추가합니다.
cd kanban-ai-realtime-localization
이제 이 server.ts 파일이 애플리케이션의 진입점이 됩니다. express.js와 같은 백엔드 프레임워크를 사용하면 Socket.io 서버에서 할 수 있는 거의 모든 작업을 수행할 수 있습니다.
이제 여기에서 '연결' 및 '연결 끊김' 수신과 유사한 이벤트를 수신할 수 있습니다. 앞으로 이 파일을 수정하여 맞춤 이벤트를 들을 수 있도록 하겠습니다.
이제 서버 관련 설정을 저장할 새 파일 tsconfig.server.json을 만듭니다. 다음 코드 줄을 추가합니다:
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
이 tsconfig.server.json 파일은 tsconfig.json에 있는 기본 TypeScript 구성을 확장하고 프로젝트에 대한 일부 사용자 정의 설정을 지정합니다. 모듈 출력에 CommonJS를 사용하고 컴파일된 파일을 dist 디렉터리로 보냅니다. isolatedModules 옵션은 false로 설정되어 자체 포함되지 않을 수 있는 파일을 허용하고, noEmit는 false로 설정되어 출력 파일이 생성되도록 합니다. 마지막으로 컴파일 과정에는 server.ts 파일만 포함됩니다.
개발 서버로는 nodemon을 사용할 예정이며 현재는 server.ts 파일을 서버로 사용하고 있습니다. 따라서 package.json 파일의 스크립트를 다음과 같이 수정하세요.
npx shadcn@latest init -d
또한 server.ts 파일의 변경 사항을 확인하고 실행 명령을 변경하려면 nodemon 구성을 조정해야 합니다.
다음 구성을 사용하여 프로젝트 루트에 nodemon.json이라는 새 파일을 만듭니다.
npx shadcn@latest add button card input label select textarea toast
드디어 이제 이사회의 모든 사전 작업이 완료되었습니다. 우리 보드에 작업을 표시하고 생성하는 작업을 해보세요.
src/comComponents 디렉터리 내에 다음 코드 줄을 사용하여 task.tsx라는 새 파일을 만듭니다.
npx prisma init
이를 사용하여 애플리케이션에 작업을 표시합니다. 여기서 우리는 기본적으로 작업 개체를 소품으로 받아들이고 카드 구성 요소를 사용하여 카드와 같은 방식으로 작업 콘텐츠를 표시합니다. 보다 읽기 쉬운 방식으로 날짜 형식을 지정하기 위해 date-fns 패키지를 사용하고 있습니다.
이제 보드에 작업을 추가하는 데 사용할 수 있는 구성 요소를 만들어 보겠습니다. src/comComponents 디렉터리 내에서 다음 코드 줄을 사용하여 새 파일 add-task.tsx를 만듭니다.
// ? prisma/schema.prisma // This is your Prisma schema file, // learn more about it in the docs: <https://pris.ly/d/prisma-schema> // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? // Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init> generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique password String tasks Task[] @relation("UserTasks") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Task { id String @id @default(cuid()) title String description String? userId String column Int order Int createdBy User @relation("UserTasks", fields: [userId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt }
이 구성요소에는 많은 일이 진행됩니다. 두 개의 입력 필드가 있으며 둘 다 제어되는 구성 요소입니다. 그러나 텍스트 영역은 사용자가 아닌 AI에 의해 채워지도록 되어 있으므로 readOnly로 설정됩니다. 제목과 설명 필드를 관리하기 위해 두 가지 상태 변수인 제목과 설명을 사용합니다.
사용자가 제출 버튼을 클릭하면 작업 생성 엔드포인트에 API 요청이 이루어지며, 이는 데이터베이스에 사용자를 위한 새 작업을 추가하고 이를 반환합니다. 오류가 발생하면 번역된 오류 메시지가 토스트에 표시됩니다. 성공하면 입력 필드를 재설정하고 서버가 선택하는 이벤트를 내보내 보드 구성 요소에 대한 업데이트를 트리거하여 모든 작업을 표시합니다.
Vercel의 AI SDK에서 액세스하는 useChat 후크는 여기서 특히 흥미롭습니다. AI의 응답이 아직 로드 중인지 추적하는 isPending 변수와 함께 메시지 기록 및 현재 입력 메시지와 같은 필드에 대한 액세스를 제공합니다.
사용자가 생성 버튼을 클릭하면 제목이 AI에 제출됩니다. 응답을 받으면 useEffect 후크를 사용하여 메시지 필드를 확인합니다. 어시스턴트의 메시지가 업데이트되면 이 새 메시지에 설명을 설정합니다.
이제 작업 생성 이벤트도 수신하도록 server.ts 파일을 업데이트하겠습니다. 다음 코드 줄을 사용하여 프로젝트 루트에 있는 server.ts 파일을 수정합니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
여기서 해당 이벤트를 수신하고 일단 수신되면 연결된 모든 소켓으로 방출합니다. 그런 다음
이제
사용자와 AI의 입력을 검증하기 위한 스키마 파일을 만들어 보겠습니다. src/lib/validators 디렉터리 내에서 다음 코드 줄을 사용하여 message.ts라는 새 파일을 만듭니다.
cd kanban-ai-realtime-localization
이제 이러한 스키마를 사용하여 AI의 응답 유형을 추론하여 API 경로에서 유형 유효성을 검사할 수 있습니다.
마지막으로 src/api/chat 디렉터리 내에 다음 코드 줄을 사용하여 새 파일인 Route.ts를 만듭니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
이 API 경로에서는 먼저 입력의 유효성을 검사하여 각 객체에 역할과 콘텐츠 필드가 있는 메시지 배열이 포함되어 있는지 확인합니다. 다음으로, 이 배열에서 최신 사용자 메시지(즉, AI에 대한 가장 최근 질문 또는 요청)를 추출합니다. 이 메시지를 streamText 함수에 전달하여 AI가 메시지 내용을 기반으로 작업 설명을 생성하도록 합니다.
마지막으로 응답을 데이터 스트림으로 반환하여 클라이언트가 메시지 배열을 실시간으로 업데이트할 수 있도록 합니다. 이 스트리밍 응답은 설명 필드를 업데이트하는 useEffect 후크를 트리거하여 AI 생성 설명을 텍스트 영역에 직접 표시합니다.
src/lib/validators 디렉터리 내에서 다음 코드 줄을 사용하여 create-task.ts라는 새 파일을 만듭니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
CreateTaskSchema 스키마는 작업 생성을 위한 구조를 정의합니다. 1~50자 사이의 제목이 필요하며 선택적 설명이 포함됩니다.
추론된 유형인 TCreateTaskSchema는 이 구조에 대한 유형 안전성을 제공하므로 클라이언트측 코드와 서버측 코드 모두에서 일관적인 입력에 사용할 수 있습니다.
이제 작업 생성 엔드포인트(예: /api/tasks/[userId]/create)에 대해 작업해 보겠습니다.
이 경로를 사용하여 새 디렉터리를 만들고 다음 코드 줄을 사용하여 파일 내부에 Route.ts를 만듭니다.
cd kanban-ai-realtime-localization
이 API 경로는 새 작업을 생성합니다. 먼저 getServerSession을 사용하여 유효한 사용자 세션을 확인합니다. 활성 세션이 없으면(사용자가 로그인하지 않은 경우) 401 Unauthorized 오류가 반환됩니다. 다음으로 CreateTaskSchema를 사용하여 요청 본문의 유효성을 검사하고 유효성 검사에 실패하면 422 상태 및 오류 세부 정보로 응답합니다.
입력이 유효하면 주문을 위해 기본 열(0 - 진행 중)의 작업을 계산한 다음 제공된 제목, 선택적 설명, 사용자 ID, 열 및 주문 값을 사용하여 데이터베이스에 새 작업을 생성합니다. 배열의 길이입니다. 성공하면 새 작업이 반환됩니다. 그렇지 않으면 내부 서버 오류가 반환됩니다.
? 여기에서는 보드의 작업을 업데이트하기 위한 기본 UI 구성 요소와 일부 API를 구축합니다
이제 <보드 /> 애플리케이션에 대해 다양한 작업을 렌더링하는 구성 요소입니다.
src/comComponents 디렉터리 내에 다음 코드 줄을 사용하여 새 파일 Board.tsx를 만듭니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
칸반보드의 주요 기능인 드래그 앤 드롭 항목을 활용하게 될 컴포넌트입니다. 이를 위해 이전에 설치한 React-beautiful-dnd 패키지를 사용하겠습니다. 구성 요소는 먼저 getSession을 사용하여 사용자 세션을 가져와서 상태로 설정합니다. 세션을 사용할 수 있게 되면 로그인한 사용자에 대한 작업을 가져오는 API 호출을 수행하고 이를 작업에 저장합니다.
작업 목록을 업데이트하는 task-updated와 현재 작업 목록에 새 작업을 추가하는 task-created 등 2소켓 이벤트를 수신합니다.
작업은 taskByStatus 함수를 사용하여 열 상태(0은 '진행 중', 1은 '보류 중', 2는 '완료')별로 그룹화됩니다. 구성 요소는 이러한 상태를 매핑하여 각 열을 해당 작업으로 렌더링합니다.
DragDropContext 래퍼는 드래그 앤 드롭 기능을 활성화합니다. 작업이 이동되면 handlerDragEnd는 동기화를 위해 소켓 이벤트를 통해 새 작업 순서를 서버에 보냅니다.
각 열은 드래그 가능한 작업 구성 요소가 포함된 놓기 가능한 영역으로, 사용자가 열 내에서 작업 순서를 변경할 수 있습니다.
이제 데이터베이스에서 사용자 작업 목록을 반환하는 /api/tasks 경로에 대해 작업해 보겠습니다.
app/api/tasks 내에서 다음 코드 줄을 사용하여 Route.ts 파일을 만듭니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
이 API 경로의 GET 함수는 작업을 포함한 사용자 정보를 가져옵니다. getServerSession을 사용하여 인증을 검증하는 것부터 시작됩니다. 세션이 없으면 401 Unauthorized 상태가 반환됩니다.
경로는 요청 URL의 쿼리 매개변수에서 이메일과 userId를 추출합니다. userId가 누락되었거나 세션의 사용자 이메일이 제공된 이메일과 일치하지 않는 경우 403 Forbidden 상태가 반환됩니다.
다음으로 지정된 이메일과 ID를 가진 사용자에 대한 데이터베이스를 쿼리하여 사용자의 ID와 작업만 선택합니다. 사용자를 찾을 수 없으면 404 Not Found 상태가 반환됩니다. 사용자가 존재하는 경우 해당 데이터가 응답으로 전송됩니다.
이제 거의 완료되었습니다.
다음 코드 줄을 사용하여 프로젝트 루트에 있는 server.ts 파일을 수정합니다.
cd kanban-ai-realtime-localization
작업 드래그 이벤트는 Kanban 보드 내 작업의 드래그 앤 드롭 기능을 처리합니다. 작업이 한 위치에서 다른 위치로 드래그되면 이 이벤트가 트리거되어 서버가 데이터베이스에서 작업 상태와 위치를 업데이트할 수 있습니다.
클라이언트가 'task-drag' 이벤트를 발생시키면 드래그되는 작업의 소스 및 대상 위치와 사용자의 이메일 주소가 포함된 페이로드를 보냅니다. 서버는 이 이벤트를 수신합니다.
그런 다음 서버는 사용자의 이메일, 소스 및 대상을 인수로 전달하여 handlerTaskDrag 함수를 호출합니다. 이 기능은 이메일 주소를 사용하여 데이터베이스에서 사용자를 가져와 작업 업데이트가 올바른 사용자와 연결되도록 하는 역할을 합니다.
handleTaskDrag 내에서 함수는 데이터베이스에서 사용자의 작업을 검색한 다음 작업 업데이트 로직을 처리하는 updateTasksInDB를 호출합니다. 이 기능은 드래그 앤 드롭 작업을 기반으로 작업의 열과 순서를 업데이트하여 작업이 데이터베이스에서 올바르게 다시 정렬되도록 합니다.
작업이 성공적으로 업데이트되면 업데이트된 작업이 io.sockets.emit를 사용하여 연결된 모든 클라이언트에 다시 내보내지고 사용자 인터페이스가 실시간으로 업데이트될 수 있도록 변경 사항이 브로드캐스팅됩니다.
이제
src/app/kanban 디렉터리 내에 다음 코드 줄을 사용하여 새 파일 page.tsx를 만듭니다.
npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm
getServerSession으로 사용자 세션을 확인하는 것으로 시작하고, 세션이 없으면 로그인 페이지로 리디렉션됩니다. /kanban으로 시작하는 모든 경로는 인증되지 않은 사용자가 액세스할 수 없음을 명시하는 middleware.ts 파일을 src 디렉터리의 앞부분에 구축했기 때문에 이 명령문은 절대 실행되지 않을 것입니다.
그러나 Next.js는 유사한 중복 요청을 중복 제거하므로 유효성 검사 계층을 추가하는 것이 결코 나쁠 것은 없습니다. 세션을 확인한 후 데이터베이스에서 사용자 ID를 검색합니다. 사용자를 찾을 수 없으면 등록 페이지로 리디렉션됩니다.
마지막으로 사용자 ID를 prop으로 전달하여 AddTask 및 Board 구성 요소를 렌더링합니다.
마지막으로 남은 일이 하나 있습니다. 눈치채셨다면 <작업 /> 이전 구성 요소에서는 사용자가 /kanban/[taskId]에 대한 링크를 통해 설명을 볼 수 있는 방법이 있었습니다.
src/app/kanban/[taskId] 디렉터리 내에서 다음 코드 줄을 사용하여 새 파일 page.tsx를 만듭니다.
cd kanban-ai-realtime-localization
여기서도 마찬가지입니다. 먼저 세션을 검증합니다. 앞서 언급한 바와 같이 이미 존재하는 미들웨어 때문에 이 작업은 절대 실행되어서는 안 됩니다.
그런 다음 prop으로 받은 taskId를 사용하여 데이터베이스에서 작업을 가져옵니다. 작업이 존재하지 않으면 사용자를 /kanban 페이지로 리디렉션합니다. 존재하는 경우 작업의 제목과 설명을 표시합니다.
마지막으로 애플리케이션(/ 경로)의 루트 홈 페이지에서 작업해 보겠습니다. 다음 코드 줄을 사용하여 src/app/page.tsx를 수정합니다.
npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd
여기에서는 사용자가 인증되었는지 간단히 확인합니다. 그렇다면 /kanban 경로로 전송됩니다. 그렇지 않은 경우 로그인 페이지로 리디렉션됩니다.
말 그대로 Kanban 보드를 완벽하게 실행하기 위해 해야 할 일은 이것이 전부입니다. 이제 인증, 현지화 및 실시간 지원을 통해 완벽하게 작동하는 Kanban 보드를 갖게 되었습니다. ?
와! ?? 오늘 우리는 함께 많은 것을 성취했습니다.
여기까지 완료했다면 블로그 게시물의 도움을 받아 처음부터 AI 및 현지화 기반 Kanban 보드를 성공적으로 구축한 것입니다. 자신의 등을 칭찬해 주세요!
Tolgee 저장소에 별표 표시 ⭐
이런 콘텐츠를 더 보려면 Tolgee를 팔로우하세요.
아래 댓글 섹션에서 여러분의 생각을 공유해 주세요! ?
읽어주셔서 정말 감사합니다! ? ?
위 내용은 Next.js, Vercel AI 및 Tolgee를 사용하여 Kanban 보드 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!