From 6d8c3a23c1f35217add33a54f045a7131b2816d6 Mon Sep 17 00:00:00 2001 From: JeonDogyun <81916309+JeonDoGyun@users.noreply.github.com> Date: Sat, 11 Nov 2023 00:12:37 +0900 Subject: [PATCH] =?UTF-8?q?=08docs:=20=EC=B5=9C=EC=A2=85=EB=B3=B8=20?= =?UTF-8?q?=EC=A0=9C=EC=B6=9C=EC=9D=84=20=EC=9C=84=ED=95=9C=20README.md=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이슈에 적힌 내용을 바탕으로 최종본 관련 내용 작성했습니다. --- README.md | 462 ++++++++++++++++++++++-------------------------------- 1 file changed, 188 insertions(+), 274 deletions(-) diff --git a/README.md b/README.md index cdf368e2..10f67026 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@
## 🔗 목차 +- [📰 최종 기획서 제출](#-최종-기획서-제출) - [👨‍💻👩‍💻 FE 팀원 소개](#-fe-%ED%8C%80%EC%9B%90-%EC%86%8C%EA%B0%9C) - [💻 프로젝트 소개](#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%86%8C%EA%B0%9C) - [📚 기술 스택](#-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D) @@ -11,7 +12,146 @@ - [⌨️ 네이밍 컨벤션](#%EF%B8%8F-네이밍-컨벤션) - [📑 페이지별 기능 소개](#-%ED%8E%98%EC%9D%B4%EC%A7%80%EB%B3%84-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C) - [📝 요구사항 명세서](https://github.com/Step3-kakao-tech-campus/Team16_BE/wiki/%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD-%EB%AA%85%EC%84%B8) -- [📒 카카오 테크 캠퍼스 3단계 진행 커리큘럼 안내 사항](#-%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%85%8C%ED%81%AC-%EC%BA%A0%ED%8D%BC%EC%8A%A4-3%EB%8B%A8%EA%B3%84-%EC%A7%84%ED%96%89-%EB%B3%B4%EB%93%9C) +
+ +## 📰 최종 기획서 제출 +### 1️⃣ 팀 내 배포 링크 모음 + +
+ +### 2️⃣ 최신 ERD 이미지 파일 +![ERD 최종](https://github.com/Step3-kakao-tech-campus/Team16_BE/assets/81916309/f6221f50-1c04-4de0-9d55-d951573c2594) +
+ +### 3️⃣ 각 트랙별 코딩에 대한 간략한 설명 +### 기획 주안점 및 서비스 기획 의도 +``` +- 저희는 보호소에 입양된 동물들에 대한 사회적 인식을 개선시키고, 사용자에게 접근성이 좋은 컨텐츠를 제공하는 것을 초점에 두고 서비스를 기획, 개발했습니다. +- 동영상 숏폼을 통해 사용자의 진입 장벽을 낮춰 컨텐츠를 이용할 수 있게 만들었습니다. +``` +### 세부적인 개발 내용 +- 메인 페이지 +``` +- 주요 기능 + - 자동재생 / 클릭을 통한 일시정지, 음소거 컨트롤 / 드래그를 통한 페이지 이동의 기능을 가진 숏폼을 사용자에게 제공합니다. + - 영상을 기다리는 동안 로더가 동작하도록 만들었습니다. +- 개발 주안점 + - 데스크톱의 크롬과 사파리, 모바일의 크롬과 사파리 등 브라우저의 영상 정책에 맞게 동영상이 의도한대로 동작하도록 개발했습니다. + - 유튜브 shorts, 틱톡과 같은 슬라이더 형태의 숏폼을 만들었습니다. +``` +- 내 주변 보호소 찾기 페이지 +``` +- 주요 기능 + - 카카오 맵 api를 연결하여, 애니모리에 등록된 보호소를 포함한 주변 동물 보호소를 보여주도록 개발했습니다. + - 보호소 리스트에서 등록된 보호소를 클릭하면, 해당 보호소 페이지로 이동할 수 있습니다. + - 등록되지 않은 보호소의 경우, 페이지 이동을 할 수 없음을 사용자에게 보여주도록 했습니다. +- 개발 주안점 + - 카카오맵 api를 리액트에서 사용하기 위해서 useEffect 안에 모든 코드를 집약시켜야 하는 문제가 있었고, 이를 해결하기 위해 커스텀 훅을 만들어 개발했습니다. + - 애니모리에 등록된 보호소는 구분할 수 있도록 만들었습니다. +``` +- 동물 상세 정보 페이지 +``` +- 주요 기능 + - 해당 동물의 사진을 비롯한 상세정보를 조회할 수 있습니다. + - 보호소 정보 하단에 있는 "정보 보기"를 통해 해당 동물이 등록된 보호소 페이지로 이동할 수 있습니다. +- 개발 주안점 + - 반응형을 고려하여 UI가 변경되도록 구현했습니다. +``` +- 프로필 리스트(홈, 신규, 긴급) 페이지 +``` +- 주요 기능 + - 유기 동물의 사진과 간단한 정보를 리스트 형태로 보여줍니다. + - "더보기"를 누르면 신규, 긴급으로 묶인 유기 동물의 리스트 페이지로 이동합니다. +- 개발 주안점 + - 비슷한 구조가 반복되는 부분이라서 컴포넌트 재사용을 신경써서 구현했습니다. + - 긴급의 경우, 사용자가 더 많이 접할 수 있도록 신규 리스트보다 상단에 위치시켰습니다. +``` +- 보호소 프로필 페이지 +``` +- 주요 기능 + - 유기 동물의 사진과 간단한 정보를 리스트 형태로 보여줍니다. + - "더보기"를 누르면 신규, 긴급으로 묶인 유기 동물의 리스트 페이지로 이동합니다. +- 개발 주안점 + - 비슷한 구조가 반복되는 부분이라서 컴포넌트 재사용을 신경써서 구현했습니다. + - 긴급의 경우, 사용자가 더 많이 접할 수 있도록 신규 리스트보다 상단에 위치시켰습니다. +``` +- 보호소 정보 수정 페이지 +``` +- 주요 기능 + - 보호소 회원 정보를 수정할 수 있습니다. + - 보호소 정보를 가져오는 동안 스켈레톤을 보여줍니다. +- 개발 주안점 + - get, put 방식의 api fetch를 코드의 가독성을 높이기 위해 custom hook으로 만들어 구현했습니다. + - "정보 수정하기" 버튼을 통해 api가 동작하는 동안 로더를 통해 동작 중임을 보여줍니다. +``` +- 등록하기, 수정하기 페이지 +``` +- 주요 기능 + - 사용자가 업로드한 사진과 동영상을 formData로 관리하여 서버 api와 연결합니다. + - input, radio button group을 통해 동물의 상세 정보를 입력받을 수 있습니다. + - 안락사 일자를 고를 수 있는 Calendar를 직접 구현했습니다. + - 등록, 수정 과정을 보여주는 모달을 만들었습니다. +- 개발 주안점 + - json 데이터, 이미지, 동영상을 한꺼번에 보내기 위해 formData 사용 + - input 방식이 다른 값들을 모아서 필수정보에 대한 autoComplete 값을 제어하는 부분을 신경썼습니다. + - 필수 정보(안락사 일자, 동물 특성 점수 선택을 제외한 정보) 중 일부가 입력되지 않았을 때에는 안내 텍스트를 통해 사용자에게 알려줍니다. + - api status code에 따라 적절한 에러 메시지를 사용자에게 보여줍니다. + - 민간 동물 보호소의 경우 안락사 예정 일자가 지난 동물도 데리고 있을 수 있기 때문에, Calendar에서 과거 날짜도 설정할 수 있도록 했습니다. + - 모달에서 api가 동작하는 동안 로딩의 과정을 보여주어 UX가 끊기지 않게 만들었습니다. +``` +- 로그인 페이지 +``` +- 주요 기능 + - 이메일, 비밀번호를 입력하여 로그인을 요청할 수 있습니다. + - 로그인 api가 진행되는 동안 로더를 보여주도록 만들었습니다. +- 개발 주안점 + - 이메일 형식을 프론트에서 확인하고, 로그인 결과를 백에서 확인하여 사용자에게 에러를 보여줄 수 있도록 구현했습니다. + - 사용자의 편의성을 고려하여 로그인 완료 시 바로 메인 페이지로 이동하도록 했습니다. +``` +- 회원가입 페이지 +``` +- 주요 기능 + - 이메일, 비밀번호, 비밀번호 입력 등 회원 정보를 입력하여 회원 가입을 요청할 수 있습니다. + - react-daum-postcode를 통해 주소를 검색하여 입력 받을 수 있도록 만들었습니다. + - 회원가입 api가 진행되는 동안 로더를 보여주도록 만들었습니다. +- 개발 주안점 + - api를 통해 이메일이 중복되었는지 확인하고, 적절한 안내 텍스트가 나오도록 만들었습니다. + - 비밀번호 확인의 경우, 값을 입력할 때 바로 비밀번호와 일치하는지 확인할 수 있도록 구현했습니다. + - 적절한 에러 텍스트를 사용자에게 보여주는 부분을 신경 썼습니다. + - 사용자의 편의성을 고려하여 회원가입 완료 시 바로 로그인 페이지로 이동하도록 했습니다. +``` +- 레이아웃 +``` +- 주요 기능 + - GNB: 메인 로고, 카테고리, 내 주변 보호소 찾기, 로그인 상태를 담고 있는 GNB를 만들었습니다. + - ValidationCheckLayout: 로그인 정보를 담고 있는 토큰의 유무에 따라 나타나는 ValidationCheckLayout을 만들었습니다. + - ValidationCheckLayout: 해당 레이아웃을 통해 로그인 페이지로 이동하거나, 로그아웃을 유지한 채로 서비스를 이용할 수 있습니다. +- 개발 주안점 + - GNB: 로그인 상태에 따라 GNB에 보이는 컨텐츠가 다르도록 구현했습니다. + - GNB: 반응형을 고려하여 구현했습니다. + - ValidationCheckLayout: 로그인 토큰이 만료된 후 로그인 상태에서 접근할 수 있는 api 기능을 사용하기 전에, 사용자가 미리 파악할 수 있도록 구현했습니다. + - ValidationCheckLayout: useLocation을 통해 url이 변경이 되었을 때, 가지고 있는 쿠키 정보를 활용하여 판단하도록 구현했습니다. + - ValidationCheckLayout: 속도 개선을 위해 로그인 안내 모달이 미리 랜더링 되지 않도록 lazy loading을 적용했습니다. +``` +- 공통 모달 컴포넌트 +``` +- 주요 기능 + - 카테고리: 동영상의 지역과 동물을 고를 수 있는 카테고리 선택 모달을 만들었습니다. + - 로그인 확인 모달: 토큰 만료에 따라 로그아웃된 사용자가 api에 접근하기 전 안내하는 모달을 만들었습니다. +- 개발 주안점 + - 카테고리: DOM 분리 및 스타일링을 위해서 react portal을 이용했습니다. + - 로그인 확인 모달: 쿠키를 세션으로 저장하는 방식을 이용해서 "첫 화면 로딩 시", "로그아웃을 유지" 했을 때 모달이 나오지 않는 것에 신경 썼습니다. +``` +- 라우터 관리 +``` +- 주요 기능 + - page를 감싸는 layout tree를 관리하도록 createBrowserRouter를 사용해 구현했습니다. +- 개발 주안점 + - "layout의 props로 children을 넣는 구조 => createBrowserRouter를 사용하는 구조"로 + 레이아웃이 필요한 부분과 필요하지 않은 부분을 구별하여 사용하기 용이한 방법을 선택해 구현했습니다. + - react-router-dom에서 지원하는 lazy 방식을 사용하여 속도 부분 개선을 고려했습니다. + (메인 페이지의 경우, 영상을 받는 방식에 문제가 있어 lazy 방식을 사용하지 않았습니다. ) +```
### 💻 프로젝트 소개 @@ -51,7 +191,7 @@
-### ▶️ 디자인 패턴 설명 [변경 후] +### ▶️ 디자인 패턴 설명 [1차 변경] - 기존 방식의 문제점 1. `Component의 Level`을 정하는 기준이 모호하다는 문제점이 있었습니다. 2. 재사용할 수 있는 컴포넌트가 한정적이어서 모든 컴포넌트를 나누는 것에 어려움이 있었습니다. @@ -61,45 +201,73 @@
-디렉토리 구조 -- 아래의 구조는 디자인 패턴을 고려하여 작성한 가이드라인입니다. -- `Atomic Design Pattern`의 문제로 인해 변경 사항이 반영된 구조입니다. -- 폴더명은 바뀌지 않지만, 내부 파일의 이름은 변경될 수 있습니다. +- 디렉토리 구조 + - 아래의 구조는 디자인 패턴을 고려하여 작성한 가이드라인입니다. + - `Atomic Design Pattern`의 문제로 인해 변경 사항이 반영된 구조입니다. + - 폴더명은 바뀌지 않지만, 내부 파일의 이름은 변경될 수 있습니다. + +### ▶️ 디자인 패턴 설명 [2차 변경] +- 기존 방식의 문제점 + 1. page 디렉토리 내 컴포넌트의 수가 많아지면서 파일에 대한 가독성이 저하되는 문제가 있었습니다. + 2. Type, Interface를 작성하는 과정에서 중복되는 내용이 있었습니다. +- 변경된 방식 + 1. page 디렉토리 내 components 디렉토리를 만들어서 페이지 내 사용되는 컴포넌트를 정리했습니다. + 2. page에 대한 `pageType.d.ts` 파일을 만들어서 Type과 Interface를 관리하도록 했습니다. + +
``` ├── /public +│ ├── favicon.ico │ ├── index.html │ ├── /assets +│ │ ├── /fonts +│ │ │ └── font1 │ │ ├── /images -│ │ │ ├── image1 -│ │ │ └── image2 +│ │ │ └── image1 │ │ ├── /logos -│ │ │ ├── logo1 -│ └── └── └── logo2 +│ └── └── └── logo1 ├── /src │ ├── /commons +│ │ ├── apis +│ │ │ ├── useFetch.ts +│ │ │ ├── useGetFetch.ts +│ │ │ └── usePostFetch.ts +│ │ ├── components +│ │ │ ├── Input.tsx +│ │ │ ├── UserToggleBox.tsx +│ │ │ └── LogoButton.tsx +│ │ ├── cookie +│ │ │ └── cookie.ts +│ │ ├── modals +│ │ │ ├── AutoplayGuideModal.tsx +│ │ │ └── CategoryModal.tsx │ ├── /pages │ │ ├── home +│ │ │ ├── homeType.d.ts +│ │ │ ├── /components +│ │ │ │ ├── VHomeComponent.tsx +│ │ │ │ └── homeComponent.tsx │ │ │ └── Home.tsx -│ │ ├── login -│ │ │ ├── VLoginPage.tsx -│ │ │ └── LoginPage.tsx │ │ ├── map -│ │ │ ├── Map.tsx -│ ├── └── └── MapPage.tsx +│ │ │ ├── mapType.d.ts +│ │ │ ├── /components +│ │ │ │ ├── VMapComponent.tsx +│ │ │ │ └── mapComponent.tsx +│ │ │ └── Map.tsx │ ├── /layouts │ │ ├── VGNB.tsx │ │ └── GNB.tsx │ ├── /recoil │ │ ├── registerState.tsx -│ └── └── regionState.tsx +│ │ └── regionState.tsx │ ├── /hooks -│ └── └── useFetch.ts +│ │ └── useFetch.ts │ ├── App.css │ ├── App.tsx │ ├── App.test.tsx │ ├── index.css -├── └── index.tsx +│ └── index.tsx ├── .env ├── .eslintrc ├── .gitignore @@ -137,7 +305,8 @@
### 📑 페이지별 기능 소개 -- 기획 단계에서 `Figma`을 통해 UI에 대한 와이어프레임을 제작하였습니다. +- 기획 단계에서 `Figma`를 통해 UI에 대한 와이어프레임을 제작하였습니다. +- 사전 기획 상태와 개발 후 상태를 비교하기 위해 작성했습니다. - 아래 이미지는 페이지별 UI 설계 이미지와 사용되는 컴포넌트 및 기능에 대한 설명입니다. - 자세한 사항은 [TEAM-16-Wireframe](https://www.figma.com/file/A0w3m1DU5JJm2zzvo9lnGE/16%EC%A1%B0-%EC%83%88%EA%B8%B0%ED%9A%8D?type=design&node-id=684%3A1302&mode=design&t=OXljL8TPJH6AsihE-1)을 통해 확인하실 수 있습니다.
@@ -255,258 +424,3 @@ - 선택된 카테고리에 따라 홈 화면에서 보여지는 동물 숏폼 리스트가 변경됩니다.
- -*** - - -## 📒 카카오 테크 캠퍼스 3단계 진행 보드 - -
- -## 배포와 관련하여 - -``` - -최종 배포는 크램폴린으로 배포해야 합니다. - -하지만 배포 환경의 불편함이 있는 경우를 고려하여 - -임의의 배포를 위해 타 배포 환경을 자유롭게 이용해도 됩니다. (단, 금액적인 지원은 어렵습니다.) - -아래는 추가적인 설정을 통해 (체험판, 혹은 프리 티어 등)무료로 클라우드 배포가 가능한 서비스입니다. - -ex ) AWS(아마존), GCP(구글), Azure(마이크로소프트), Cloudtype - -``` -## Notice - -``` -필요 산출물들은 수료 기준에 영향을 주는 것은 아니지만, -주차 별 산출물을 기반으로 평가가 이루어 집니다. - -주차 별 평가 점수는 추 후 최종 평가에 최종 합산 점수로 포함됩니다. -``` - -![레포지토리 운영-001 (1)](https://github.com/Step3-kakao-tech-campus/practice/assets/138656575/acb0dccd-0441-4200-999a-981865535d5f) -![image](https://github.com/Step3-kakao-tech-campus/practice/assets/138656575/b42cbc06-c5e7-4806-8477-63dfa8e807a0) - -[git flowchart_FE.pdf](https://github.com/Step3-kakao-tech-campus/practice/files/12521045/git.flowchart_FE.pdf) - - -
- -## 필요 산출물 -
-Step3. Week-1 -
- -✅**1주차** - -``` - - 5 Whys - - 마켓 리서치 - - 페르소나 & 저니맵 - - 와이어 프레임 - - 칸반보드 -``` - -
-
- ---- - -
-Step3. Week-2 -
- -✅**2주차** - -``` - - ERD 설계서 - - - API 명세서 -``` - -
-
- ---- - -
-Step3. Week-3 -
- -✅**3주차** - -``` - - 최종 기획안 -``` - -
-
- ---- - -
-Step3. Week-4 -
- -✅**4주차** - -``` - - 4주차 github - - - 4주차 노션 -``` - -
-
- ---- -
-Step3. Week-5 -
- -✅**5주차** - -``` - - 5주차 github - - - 5주차 노션 -``` - -
-
- ---- - -
-Step3. Week-6 -
- -✅**6주차** - -``` - - 6주차 github - - - 중간발표자료 - - - 피어리뷰시트 -``` - -
-
- ---- - -
-Step3. Week-7 -
- -✅**7주차** - -``` - - 7주차 github - - - 7주차 노션 -``` - -
-
- ---- - -
-Step3. Week-8 -
- -✅**8주차** - -``` - - 중간고사 - -``` - -
-
- ---- - -
-Step3. Week-9 -
- -✅**9주차** - -``` - - 9주차 github - - - 9주차 노션 -``` - -
-
- ---- - -
-Step3. Week-10 -
- -✅**10주차** - -``` - - 10주차 github - - - 테스트 시나리오 명세서 - - - 테스트 결과 보고서 -``` - -
-
- ---- - -
-Step3. Week-11 -
- -✅**11주차** - -``` - - 최종 기획안 - - - 배포 인스턴스 링크 -``` - -
-
- ---- - -## **과제 상세 : 수강생들이 과제를 진행할 때, 유념해야할 것** - -``` -1. README.md 파일은 동료 개발자에게 프로젝트에 쉽게 랜딩하도록 돕는 중요한 소통 수단입니다. -해당 프로젝트에 대해 아무런 지식이 없는 동료들에게 설명하는 것처럼 쉽고, 간결하게 작성해주세요. - -2. 좋은 개발자는 디자이너, 기획자, 마케터 등 여러 포지션에 있는 분들과 소통을 잘합니다. -UI 컴포넌트의 명칭과 이를 구현하는 능력은 필수적인 커뮤니케이션 스킬이자 필요사항이니 어떤 상황에서 해당 컴포넌트를 사용하면 좋을지 고민하며 코드를 작성해보세요. - -``` - -
- -## **코드리뷰 관련: review branch로 PR시, 아래 내용을 포함하여 코멘트 남겨주세요.** - -**1. PR 제목과 내용을 아래와 같이 작성 해주세요.** - -> PR 제목 : 부산대_0조_아이템명_0주차 -> - -
- - - ----