|
1 | | -# React + TypeScript + Vite |
| 1 | +# 36.5 (온라인 편지 교환 플랫폼) |
2 | 2 |
|
3 | | -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. |
| 3 | +36.5는 사용자들이 익명으로 편지를 주고받을 수 있는 소셜 플랫폼입니다. 온라인에서 따뜻한 인간 관계를 형성하고 소통할 수 있는 공간을 제공합니다. |
4 | 4 |
|
5 | | -Currently, two official plugins are available: |
| 5 | + |
| 6 | + |
6 | 7 |
|
7 | | -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh |
8 | | -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh |
| 8 | +- 프로젝트 기간 : 2025.02.07 ~ 2025.03.14 |
| 9 | +- 배포 URL : https://www.ddasum.kr/ |
9 | 10 |
|
10 | | -## Expanding the ESLint configuration |
| 11 | +## 구성원 |
| 12 | +| [한승연](https://github.com/tiffanyhansy) | [안지원](https://github.com/wldnjs990) | [김세빈](https://github.com/nirii00) | [안민하](https://github.com/AAminha) | |
| 13 | +| --- | --- | --- | --- | |
| 14 | +| <a href="https://github.com/tiffanyhansy"><img src="https://avatars.githubusercontent.com/u/125551867?v=4" width="100px;" alt=""/></a> | <a href="https://github.com/wldnjs990"><img src="https://avatars.githubusercontent.com/u/139528356?v=4" width="100px;" alt=""/></a> | <a href="https://github.com/nirii00"><img src="https://avatars.githubusercontent.com/u/108220388?v=4" width="100px;" alt=""/></a> | <a href="https://github.com/AAminha"><img src="https://avatars.githubusercontent.com/u/87255791?v=4" width="100px;" alt=""/></a> | |
| 15 | +| Team-Lead | Clerk | Clerk | Clerk |
| 16 | +| 홈, 공유 로직, <br/> 임시저장,<br/> 퍼블리싱, <br/> 프로젝트 관리 | 편지 작성,<br/> 관리자, 알림,<br/> 퍼블리싱 <br/> 배포관리 | 디자인, 게시판,<br/> 내 편지함,<br/> 로그인, CI | 퍼블리싱,<br/> 롤링페이퍼,<br/> 랜딩 | |
11 | 17 |
|
12 | | -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: |
| 18 | +## 📋 프로젝트 개요 |
13 | 19 |
|
14 | | -- Configure the top-level `parserOptions` property like this: |
| 20 | +- **모바일 기반의 편지 웹앱 서비스** |
15 | 21 |
|
16 | | -```js |
17 | | -export default tseslint.config({ |
18 | | - languageOptions: { |
19 | | - // other options... |
20 | | - parserOptions: { |
21 | | - project: ['./tsconfig.node.json', './tsconfig.app.json'], |
22 | | - tsconfigRootDir: import.meta.dirname, |
23 | | - }, |
24 | | - }, |
25 | | -}) |
26 | | -``` |
| 22 | +### 핵심 기능 |
| 23 | +- **랜덤 편지 작성 및 답장**: 자신의 고민과 사연을 나누고 편지를 받거나, 랜덤한 사용자에게 답장을 보낼 수 있음 |
| 24 | +- **편지 공유 게시판**: 상대방과 나눈 편지를 허락을 받아 코멘트를 추가해 게시판에 공유 가능, 사용자들이 올린 편지를 확인하고 신고할 수 있음 |
| 25 | +- **롤링페이퍼**: 관리자가 배너에 이벤트를 게시하면, 사용자들이 해당 게시판에 들어와서 메시지를 남길 수 있음 |
| 26 | +- **편지 필터링**: |
| 27 | + - 관리자가 금칙어를 등록하여 편지, 공유 게시물, 롤링페이퍼 편지를 1차 필터링 |
| 28 | + - 사용자가 편지, 롤링페이퍼, 게시물을 신고하는 경우 관리자 확인 전 AI로 1차 필터링하여 자동으로 편지를 검열함 |
| 29 | + |
| 30 | +### 개발 주안점 |
| 31 | +- **모바일 반응형과 애니메이션**: |
| 32 | + - 모바일 기반의 서비스로 다양한 디바이스로 QA를 진행함 |
| 33 | + - 디바이스 별로 지원되는 애니메이션의 범위가 달라 QA를 여러번 진행 |
| 34 | +- **탄스택 쿼리를 사용하여 API 호출최적화** |
| 35 | + - 무한 스크롤 구현 |
| 36 | + - 프론트엔드 캐싱 적용 |
| 37 | +- **SSE와 axios api 호출 중앙화** |
| 38 | + - 두가지 방식의 api 가 토큰 재발급시 충돌 -> api 중앙화 |
| 39 | + |
| 40 | +## 🛠 기술 스택 |
| 41 | + |
| 42 | +### 프론트엔드 |
| 43 | +- **언어 및 프레임워크**: TypeScript, React, Vite |
| 44 | +- **스타일링**: Tailwind CSS, Emotion |
| 45 | +- **상태관리**: Zustand, Tanstack Query |
| 46 | +- **라우팅**: Axios |
| 47 | +- **애니메이션**: GSAP |
| 48 | + |
| 49 | +### 품질 관리 |
| 50 | +- **Linting & Formatting**: ESLint, Prettier |
27 | 51 |
|
28 | | -- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` |
29 | | -- Optionally add `...tseslint.configs.stylisticTypeChecked` |
30 | | -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: |
31 | | - |
32 | | -```js |
33 | | -// eslint.config.js |
34 | | -import react from 'eslint-plugin-react' |
35 | | - |
36 | | -export default tseslint.config({ |
37 | | - // Set the react version |
38 | | - settings: { react: { version: '18.3' } }, |
39 | | - plugins: { |
40 | | - // Add the react plugin |
41 | | - react, |
42 | | - }, |
43 | | - rules: { |
44 | | - // other rules... |
45 | | - // Enable its recommended rules |
46 | | - ...react.configs.recommended.rules, |
47 | | - ...react.configs['jsx-runtime'].rules, |
48 | | - }, |
49 | | -}) |
| 52 | +### 배포 |
| 53 | +- **배포**: AWS S3 + CloudFront |
| 54 | +- **도메인 관리**: AWS Route 53 |
| 55 | +- **CICD**: GitHub Actions |
| 56 | + |
| 57 | +## 📂 프로젝트 구조 |
| 58 | + |
| 59 | +페이지 및 도메인 중심 구조로 설계 |
| 60 | + |
| 61 | +``` |
| 62 | +public // |
| 63 | +src |
| 64 | +├─apis/ // API 관리 |
| 65 | +│ ├─client.ts // axios client 설정 |
| 66 | +│ └─domain.ts // 도메인별로 파일 분리 |
| 67 | +├─assets/ // 이미지, 폰트 |
| 68 | +│ └─icons/ // 아이콘 폴더 (주로 svg 형식) |
| 69 | +│ │ ├─icon-icon.svg // (kebab-case) |
| 70 | +│ │ └─index.ts // svg들 한번에 export |
| 71 | +│ └─images/ // 그 외 이미지 (png, webp, jpg 등) |
| 72 | +│ │ └─img-image.png // (kebab-case) |
| 73 | +├─components/ // 공통 컴포넌트 |
| 74 | +│ └─Component.tsx |
| 75 | +├─constants/ // 공통 상수 모음 |
| 76 | +│ └─example.ts // (내부 상수 UPPER_CASE) |
| 77 | +├─hooks/ // 커스텀 훅 |
| 78 | +│ └─useExample.ts // 파일명과 동일 |
| 79 | +├─layouts/ // 공통 레이아웃 |
| 80 | +│ └─Header.tsx |
| 81 | +├─pages/ // 페이지 모음 |
| 82 | +│ ├─Home/ |
| 83 | +│ │ ├─components/ // 해당 페이지에서만 사용하는 컴포넌트 |
| 84 | +│ │ │ └─Component.tsx |
| 85 | +│ │ ├─constants/ // 해당 페이지에서만 사용하는 상수 |
| 86 | +│ │ │ └─index.ts |
| 87 | +│ │ └─index.tsx // 실제 페이지 컴포넌트. 폴더명과 동일 |
| 88 | +├─stores/ // 전역 상태 관리 |
| 89 | +│ └─exampleStore.ts // useExample (camelCase) |
| 90 | +├─styles/ // 스타일 관련 |
| 91 | +│ ├─tailwind.css |
| 92 | +│ └─index.css // 여러 css 파일 모음 |
| 93 | +├─types/ // 타입 모음 |
| 94 | +│ └─type.d.ts // 도메인별로 파일 분리 |
| 95 | +├─utils/ // 공통으로 사용되는 함수 |
| 96 | +│ └─utils.ts |
| 97 | +└─.env // 환경변수 관리 파일 (내부 변수 UPPER_CASE) |
50 | 98 | ``` |
0 commit comments