diff --git a/README.md b/README.md index c6869cd..43b5109 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,71 @@ -# prisma 연결 +# 모바일 현장 조사 애플리케이션 (onsitesurvey) + +## 개요 + +Next.js와 TypeScript로 구축된 현장 조사용 모바일 애플리케이션입니다. + +## 기술 스택 + +- **프레임워크**: Next.js (App Router) +- **언어**: TypeScript +- **UI 컴포넌트**: Shadcn UI, Radix UI +- **스타일링**: Tailwind CSS +- **상태 관리**: React Query +- **데이터베이스**: Prisma ORM +- **인증**: 세션 기반 인증 + +## 시작하기 + +### 필수 요구사항 + +- Node.js (LTS 버전) +- npm 또는 yarn 또는 pnpm 또는 burn +- Prisma CLI + +### 설치 방법 + +```bash +# 의존성 설치 +npm install + +# 환경 변수 설정 +cp .env.example .env.local + +``` + +### 개발 서버 실행 + +```bash +# 개발 서버 실행 +npm run dev +``` + +### 프로덕션 빌드 + +```bash +# 애플리케이션 빌드 +npm run build + +# 프로덕션 서버 실행 +npm start +``` + +## 프로젝트 구조 + +[프로젝트 구조 Diagram](./diagram/mermaid.md) + +``` +├── app/ # Next.js 앱 디렉토리 +├── components/ # React 컴포넌트 +├── hooks/ # 커스텀 React 훅 +├── lib/ # 유틸리티 함수 및 설정 +├── prisma/ # 데이터베이스 스키마 및 마이그레이션 +└── public/ # 정적 자산 +``` + +## 참고 + +### prisma 연결 ``` npx prisma migrate dev @@ -11,38 +78,38 @@ npx prisma db push generate 를 진행해야 로컬에 연결 파일들이 생성이되고 pull push 를 사용할 수 있게 됨. -# react query cache data 가져오기 +### react query cache data 가져오기 ``` const cache = useQueryClient() const data = cache.getQueryData(['user', 'info']) as UserState ``` -# 팝업 컨트롤러 제어 +### 팝업 컨트롤러 제어 -### open +[open] -``` +```javascript const popupController = usePopupController() onClick={() => popupController.setMemberInformationPopup(true)} onClick={() => popupController.setZipCodePopup(true)} ``` -### close +[close] -``` +```javascript const popupController = usePopupController() onClick={() => popupController.setMemberInformationPopup(false)} onClick={() => popupController.setZipCodePopup(false)} ``` -# useEffect 정리 +### useEffect 정리 - client url pathname 변경시 -> @/components/ui/Header.tsx -# User Role 구분 +### User Role 구분 session에 있는 role 키로 구분한다 @@ -61,7 +128,7 @@ session에 있는 role 키로 구분한다 - 이외의 경우 -> 굳이 체크할 필요 없어보임\ session.role === 'User' -# 지붕재 적합성 TODO +### 지붕재 적합성 TODO ``` const suitableCheckIcon = (value: string): string => { @@ -82,3 +149,21 @@ const suitableCheckMemo = (value: string): string => { - src/hooks/useSuitable.ts > suitableCheckIcon(), suitableCheckMemo() - 추후 지붕재 적합성 데이터 CUD 구현 시 ×, ー 데이터 관리 필요 + +# 주의 + +## Prisma ORM 사용 시 주의사항 + +현재 프로젝트는 Prisma ORM을 통해 데이터베이스의 일부 테이블만 관리하고 있습니다. 이로 인해 `prisma db pull` 또는 `prisma db push` 명령어 사용 시 주의가 필요합니다. + +### 잠재적 위험성 + +- `schema.prisma` 파일에 정의된 모델이 의도치 않게 수정될 수 있습니다. +- 기존에 정의된 모델의 속성이나 관계가 손상될 수 있습니다. +- 데이터베이스 스키마와 Prisma 스키마 간의 불일치가 발생할 수 있습니다. + +### 권장 사항 + +- 데이터베이스 스키마 변경이 필요한 경우, 반드시 팀 내 논의 후 진행하시기 바랍니다. +- `prisma db pull` 실행 전 현재 `schema.prisma` 파일의 백업을 권장합니다. +- 변경 사항 적용 전 staging 환경에서 충분한 테스트를 진행하시기 바랍니다. diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f8424f6..2c353a4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -7,103 +7,65 @@ datasource db { url = env("DATABASE_URL") } -model MS_SUITABLE { - id Int @id @default(autoincrement()) - product_name String @db.VarChar(200) - manufacturer String? @db.VarChar(200) - roof_material String? @db.VarChar(100) - shape String? @db.VarChar(200) - support_roof_tile String? @db.VarChar(2) - support_roof_tile_memo String? @db.VarChar(500) - support_roof_bracket String? @db.VarChar(200) - support_roof_bracket_memo String? @db.VarChar(500) - yg_anchor String? @db.VarChar(200) - yg_anchor_memo String? @db.VarChar(500) - rg_roof_tile_part String? @db.VarChar(200) - rg_roof_tile_part_memo String? @db.VarChar(500) - dido_hunt_support_tile_2 String? @db.VarChar(200) - dido_hunt_support_tile_2_memo String? @db.VarChar(500) - takashima_power_base String? @db.VarChar(200) - takashima_power_base_memo String? @db.VarChar(500) - takashima_tile_bracket String? @db.VarChar(200) - takashima_tile_bracket_memo String? @db.VarChar(500) - slate_bracket_4 String? @db.VarChar(200) - slate_bracket_4_memo String? @db.VarChar(500) - slate_single_metal_bracket String? @db.VarChar(200) - slate_single_metal_bracket_memo String? @db.VarChar(500) - dido_hunt_short_rack_4 String? @db.VarChar(200) - dido_hunt_short_rack_4_memo String? @db.VarChar(500) - takashima_slate_bracket_slate_single String? @db.VarChar(200) - takashima_slate_bracket_slate_single_memo String? @db.VarChar(500) - df_metal_bracket String? @db.VarChar(200) - df_metal_bracket_memo String? @db.VarChar(500) - slate_metal_bracket String? @db.VarChar(200) - slate_metal_bracket_memo String? @db.VarChar(500) - takashima_slate_bracket_metal_roof String? @db.VarChar(200) - takashima_slate_bracket_metal_roof_memo String? @db.VarChar(500) - created_at DateTime @default(now()) - updated_at DateTime @updatedAt -} - model SD_SURVEY_SALES_BASIC_INFO { ID Int @id @default(autoincrement()) - SRL_NO String @db.VarChar(20) - REPRESENTATIVE String @db.VarChar(200) - STORE String? @db.VarChar(200) - CONSTRUCTION_POINT String? @db.VarChar(200) - INVESTIGATION_DATE String? @db.VarChar(10) - BUILDING_NAME String? @db.VarChar(200) - CUSTOMER_NAME String? @db.VarChar(200) - POST_CODE String? @db.VarChar(10) - ADDRESS String? @db.VarChar(200) - ADDRESS_DETAIL String? @db.VarChar(300) + SRL_NO String @db.NVarChar(20) + REPRESENTATIVE String @db.NVarChar(200) + STORE String? @db.NVarChar(200) + CONSTRUCTION_POINT String? @db.NVarChar(200) + INVESTIGATION_DATE String? @db.NVarChar(10) + BUILDING_NAME String? @db.NVarChar(200) + CUSTOMER_NAME String? @db.NVarChar(200) + POST_CODE String? @db.NVarChar(10) + ADDRESS String? @db.NVarChar(200) + ADDRESS_DETAIL String? @db.NVarChar(300) SUBMISSION_STATUS Boolean @default(false) SUBMISSION_DATE DateTime? @db.Date - SUBMISSION_TARGET_ID String? @db.VarChar(200) + SUBMISSION_TARGET_ID String? @db.NVarChar(200) REG_DT DateTime @default(now()) UPT_DT DateTime @updatedAt - REPRESENTATIVE_ID String? @db.VarChar(100) - STORE_ID String? @db.VarChar(100) + REPRESENTATIVE_ID String? @db.NVarChar(100) + STORE_ID String? @db.NVarChar(100) DETAIL_INFO SD_SURVEY_SALES_DETAIL_INFO? } model SD_SURVEY_SALES_DETAIL_INFO { ID Int @id @default(autoincrement()) - CONTRACT_CAPACITY String? @db.VarChar(20) - RETAIL_COMPANY String? @db.VarChar(100) - SUPPLEMENTARY_FACILITIES String? @db.VarChar(20) - SUPPLEMENTARY_FACILITIES_ETC String? @db.VarChar(200) - INSTALLATION_SYSTEM String? @db.VarChar(20) - INSTALLATION_SYSTEM_ETC String? @db.VarChar(200) - CONSTRUCTION_YEAR String? @db.VarChar(200) - CONSTRUCTION_YEAR_ETC String? @db.VarChar(200) - ROOF_MATERIAL String? @db.VarChar(20) - ROOF_MATERIAL_ETC String? @db.VarChar(200) - ROOF_SHAPE String? @db.VarChar(20) - ROOF_SHAPE_ETC String? @db.VarChar(200) - ROOF_SLOPE String? @db.VarChar(5) - HOUSE_STRUCTURE String? @db.VarChar(20) - HOUSE_STRUCTURE_ETC String? @db.VarChar(200) - RAFTER_MATERIAL String? @db.VarChar(20) - RAFTER_MATERIAL_ETC String? @db.VarChar(200) - RAFTER_SIZE String? @db.VarChar(20) - RAFTER_SIZE_ETC String? @db.VarChar(200) - RAFTER_PITCH String? @db.VarChar(20) - RAFTER_PITCH_ETC String? @db.VarChar(200) - RAFTER_DIRECTION String? @db.VarChar(20) - OPEN_FIELD_PLATE_KIND String? @db.VarChar(20) - OPEN_FIELD_PLATE_KIND_ETC String? @db.VarChar(200) - OPEN_FIELD_PLATE_THICKNESS String? @db.VarChar(5) + CONTRACT_CAPACITY String? @db.NVarChar(20) + RETAIL_COMPANY String? @db.NVarChar(100) + SUPPLEMENTARY_FACILITIES String? @db.NVarChar(20) + SUPPLEMENTARY_FACILITIES_ETC String? @db.NVarChar(200) + INSTALLATION_SYSTEM String? @db.NVarChar(20) + INSTALLATION_SYSTEM_ETC String? @db.NVarChar(200) + CONSTRUCTION_YEAR String? @db.NVarChar(200) + CONSTRUCTION_YEAR_ETC String? @db.NVarChar(200) + ROOF_MATERIAL String? @db.NVarChar(20) + ROOF_MATERIAL_ETC String? @db.NVarChar(200) + ROOF_SHAPE String? @db.NVarChar(20) + ROOF_SHAPE_ETC String? @db.NVarChar(200) + ROOF_SLOPE String? @db.NVarChar(5) + HOUSE_STRUCTURE String? @db.NVarChar(20) + HOUSE_STRUCTURE_ETC String? @db.NVarChar(200) + RAFTER_MATERIAL String? @db.NVarChar(20) + RAFTER_MATERIAL_ETC String? @db.NVarChar(200) + RAFTER_SIZE String? @db.NVarChar(20) + RAFTER_SIZE_ETC String? @db.NVarChar(200) + RAFTER_PITCH String? @db.NVarChar(20) + RAFTER_PITCH_ETC String? @db.NVarChar(200) + RAFTER_DIRECTION String? @db.NVarChar(20) + OPEN_FIELD_PLATE_KIND String? @db.NVarChar(20) + OPEN_FIELD_PLATE_KIND_ETC String? @db.NVarChar(200) + OPEN_FIELD_PLATE_THICKNESS String? @db.NVarChar(5) LEAK_TRACE Boolean? @default(false) - WATERPROOF_MATERIAL String? @db.VarChar(20) - WATERPROOF_MATERIAL_ETC String? @db.VarChar(200) - INSULATION_PRESENCE String? @db.VarChar(20) - INSULATION_PRESENCE_ETC String? @db.VarChar(200) - STRUCTURE_ORDER String? @db.VarChar(20) - STRUCTURE_ORDER_ETC String? @db.VarChar(200) - INSTALLATION_AVAILABILITY String? @db.VarChar(20) - INSTALLATION_AVAILABILITY_ETC String? @db.VarChar(200) - MEMO String? @db.VarChar(500) + WATERPROOF_MATERIAL String? @db.NVarChar(20) + WATERPROOF_MATERIAL_ETC String? @db.NVarChar(200) + INSULATION_PRESENCE String? @db.NVarChar(20) + INSULATION_PRESENCE_ETC String? @db.NVarChar(200) + STRUCTURE_ORDER String? @db.NVarChar(20) + STRUCTURE_ORDER_ETC String? @db.NVarChar(200) + INSTALLATION_AVAILABILITY String? @db.NVarChar(20) + INSTALLATION_AVAILABILITY_ETC String? @db.NVarChar(200) + MEMO String? @db.NVarChar(500) REG_DT DateTime @default(now()) UPT_DT DateTime @updatedAt BASIC_INFO_ID Int @unique @@ -171,20 +133,20 @@ model BC_COMM_L { } model MS_SUITABLE_ROOF_MATERIAL_GROUP { - ID Int @id @default(autoincrement()) - ROOF_MATERIAL_GROUP String @db.VarChar(200) - ROOF_MT_CD String @db.VarChar(200) - REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__creat__4F7CD00D") - UPT_DT DateTime? + ID Int @id @default(autoincrement()) + ROOF_MATL_GRP_CD String @db.NVarChar(200) + ROOF_MT_CD String @db.NVarChar(200) + REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__creat__4F7CD00D") + UPT_DT DateTime? } model MS_SUITABLE_DETAIL { ID Int @id @default(autoincrement()) MAIN_ID Int - TRESTLE_MFPC_CD String? @db.VarChar(200) - TRESTLE_MANUFACTURER_PRODUCT_NAME String? @db.VarChar(200) - MEMO String? @db.VarChar(500) - REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__creat__571DF1D5") + TRESTLE_MFPC_CD String? @db.NVarChar(200) + TRESTLE_MANUFACTURER_PRODUCT_NAME String? @db.NVarChar(200) + MEMO String? @db.NVarChar(500) + REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__REG_D__1332DBDC") UPT_DT DateTime? MS_SUITABLE_MAIN MS_SUITABLE_MAIN @relation(fields: [MAIN_ID], references: [ID], onUpdate: NoAction, map: "MS_SUITABLE_DETAIL_MS_SUITABLE_MAIN_FK") @@ -193,24 +155,25 @@ model MS_SUITABLE_DETAIL { model MS_SUITABLE_MAIN { ID Int @id @default(autoincrement()) - PRODUCT_NAME String @db.VarChar(200) - MANU_FT_CD String? @db.VarChar(200) - ROOF_MT_CD String? @db.VarChar(100) - ROOF_SH_CD String? @db.VarChar(200) - REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__creat__5441852A") + PRODUCT_NAME String @db.NVarChar(200) + MANU_FT_CD String? @db.NVarChar(200) + ROOF_MT_CD String? @db.NVarChar(100) + ROOF_SH_CD String? @db.NVarChar(200) + REG_DT DateTime @default(now(), map: "DF__MS_SUITAB__REG_D__10566F31") UPT_DT DateTime? + UPT_ID String? @db.NVarChar(50) + DEL_YN String? @db.NVarChar(1) MS_SUITABLE_DETAIL MS_SUITABLE_DETAIL[] @@index([PRODUCT_NAME], map: "MS_SUITABLE_MAIN_PRODUCT_NAME_IDX") @@index([ROOF_MT_CD, PRODUCT_NAME], map: "MS_SUITABLE_MAIN_ROOF_MT_CD_IDX") } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model MS_USR_TRK { ID Int @id @default(autoincrement()) - OWNER String @db.VarChar(100) - TYPE String @db.VarChar(50) - URL String? @db.VarChar(200) + OWNER String @db.NVarChar(100) + TYPE String @db.NVarChar(50) + URL String? @db.NVarChar(200) REG_DT DateTime @default(now()) - DATA String? @db.VarChar(200) + DATA String? @db.NVarChar(200) }