Skip to content

Commit 61cfdba

Browse files
authored
Merge pull request #134 from codeit-maso/develop
🚀 deloy: 롤링 프로젝트 완성 및 main 브랜치 배포 준비
2 parents 6ddd08a + b896fab commit 61cfdba

File tree

105 files changed

+6221
-35
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+6221
-35
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text=auto eol=lf
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
name: 이슈 템플릿
3+
about: issue
4+
title: ''
5+
labels: ''
6+
assignees: ''
7+
8+
---
9+
10+
## 📝 설명
11+
<!-- 이슈에 대한 간략한 설명을 작성해주세요 -->
12+
13+
## ✅ 작업 내용
14+
<!-- 해결해야 할 작업 목록을 작성해주세요 -->
15+
- [ ]
16+
17+
## 🖼️ 관련 스크린샷/디자인
18+
<!-- 관련 디자인이나 스크린샷이 있다면 첨부해주세요 -->
19+
20+
## 📎 참고사항
21+
<!-- 참고할 내용이나 스크린샷이 있다면 첨부해주세요 -->

.github/PULL_REQUEST_TEMPLATE/pull_request_template.md renamed to .github/pull_request_template.md

File renamed without changes.

.github/workflows/sync-fork.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: CI/CD Pipeline
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- develop
8+
pull_request:
9+
branches:
10+
- main
11+
- develop
12+
workflow_dispatch:
13+
14+
jobs:
15+
build-test:
16+
runs-on: ubuntu-22.04
17+
steps:
18+
- name: Checkout
19+
uses: actions/checkout@v3
20+
21+
- name: Setup Node.js
22+
uses: actions/setup-node@v3
23+
with:
24+
node-version: '20'
25+
26+
- name: Install dependencies
27+
run: npm ci
28+
29+
- name: Build
30+
run: npm run build
31+
32+
sync-fork:
33+
needs: build-test
34+
runs-on: ubuntu-22.04
35+
if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop')
36+
steps:
37+
- name: Checkout
38+
uses: actions/checkout@v3
39+
with:
40+
fetch-depth: 0
41+
42+
- name: Setup SSH Agent
43+
uses: webfactory/[email protected]
44+
with:
45+
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
46+
47+
- name: Add known hosts
48+
run: ssh-keyscan github.com >> ~/.ssh/known_hosts
49+
50+
- name: Push to fork
51+
run: |
52+
git remote add fork [email protected]:LeeCh0129/Rolling.git
53+
git push fork ${GITHUB_REF#refs/heads/}

.prettierignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# 빌드 결과물
2+
dist
3+
build
4+
5+
# 의존성
6+
node_modules
7+
8+
# 기타 제외 파일
9+
coverage
10+
.github

.prettierrc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"semi": true,
3+
"singleQuote": true,
4+
"jsxSingleQuote": false,
5+
"trailingComma": "all",
6+
"useTabs": false,
7+
"tabWidth": 2,
8+
"printWidth": 80,
9+
"arrowParens": "always",
10+
"bracketSpacing": true,
11+
"bracketSameLine": false,
12+
"endOfLine": "auto"
13+
}

README.md

Lines changed: 204 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,204 @@
1-
# 롤링 프로젝트
1+
# Rolling
2+
마음을 종이비행기에 담아 전하세요. 부담 없이, 따뜻하게.
3+
4+
## 🚀 배포 주소
5+
[롤링 바로가기](https://rolling-gamma.vercel.app/)
6+
7+
## 📝 프로젝트 소개
8+
Rolling은 소중한 사람들에게 마음을 전할 수 있는 롤링 페이퍼 서비스입니다. 이름, 배경, 색삭을 설정하여 롤링 페이퍼를 만들고, 메시지와 이모지 반응을 남겨보세요.
9+
10+
## 📚 기술 스택
11+
### Language
12+
<img src="https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E">
13+
14+
### FrontEnd
15+
<img src="https://img.shields.io/badge/react-61DAFB?style=for-the-badge&logo=react&logoColor=black"><img src="https://img.shields.io/badge/React_Router-CA4245?style=for-the-badge&logo=react-router&logoColor=white">
16+
17+
### Style
18+
<img src="https://img.shields.io/badge/SCSS-CC6699?style=for-the-badge&logo=sass&logoColor=white"><img src="https://img.shields.io/badge/CSS_Modules-000000?style=for-the-badge&logo=css-modules&logoColor=white">
19+
20+
### 도구 및 유틸리티
21+
<img src="https://img.shields.io/badge/vite-%23646CFF.svg?style=for-the-badge&logo=vite&logoColor=white">
22+
23+
### API
24+
<img src="https://img.shields.io/badge/axios-5A29E4?style=for-the-badge&logo=axios&logoColor=white">
25+
26+
### 코드 포매터 및 검사 도구
27+
<img src="https://img.shields.io/badge/ESLint-4B32C3?style=for-the-badge&logo=eslint&logoColor=white"><img src="https://img.shields.io/badge/Prettier-F7B93E?style=for-the-badge&logo=prettier&logoColor=black">
28+
29+
### 협업툴
30+
<img src="https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white"><img src="https://img.shields.io/badge/Notion-%23000000.svg?style=for-the-badge&logo=notion&logoColor=white"><img src="https://img.shields.io/badge/Discord-%235865F2.svg?style=for-the-badge&logo=discord&logoColor=white">
31+
32+
### 배포 및 CI/CD
33+
<img src="https://img.shields.io/badge/vercel-%23000000.svg?style=for-the-badge&logo=vercel&logoColor=white"><img src="https://img.shields.io/badge/GitHub_Actions-2088FF?style=for-the-badge&logo=github-actions&logoColor=white">
34+
35+
36+
## 👥 팀원 소개 및 역할 분담
37+
<table width="100%">
38+
<tr align="center" bgcolor="#f8f8f8">
39+
<th width="20%">박광민</th>
40+
<th width="20%">이찬호</th>
41+
<th width="20%">이승민</th>
42+
<th width="20%">전지윤</th>
43+
<th width="20%">윤진우</th>
44+
</tr>
45+
<tr align="center">
46+
<td><img src="https://github.com/user-attachments/assets/167246c7-9218-4208-a6ef-fcac9f3851e0" width="180" height="180"></td>
47+
<td><img src="https://github.com/user-attachments/assets/b7b784fc-30c3-4a1a-8b2f-14f899e1042c" width="180" height="180"></td>
48+
<td><img src="https://github.com/user-attachments/assets/d688f02f-f451-4364-b9a4-326f953d8206" width="180" height="180"></td>
49+
<td><img src="https://github.com/user-attachments/assets/4ea665ec-37f8-4068-aede-b3cbd62642f6" width="180" height="180"></td>
50+
<td><img src="https://github.com/user-attachments/assets/b106db3e-240f-4f58-814c-8c2171b2ba10" width="180" height="180"></td>
51+
</tr>
52+
<tr align="center">
53+
<td style="text-align:center"><a href="https://github.com/minimo-9"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white"/></a> </td>
54+
<td style="text-align:center"><a href="https://github.com/LeeCh0129"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white"/></a> </td>
55+
<td style="text-align:center"><a href="https://github.com/dltmdals3929"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white"/> </a></td>
56+
<td style="text-align:center"><a href="https://github.com/dkslel1225"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white"/></a> </td>
57+
<td style="text-align:center"><a href="https://github.com/Yun-Jinwoo"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white"/></a></td>
58+
</tr>
59+
</table>
60+
61+
## 🔨 역할 분담
62+
### 박광민
63+
- 공용 컴포넌트(Button, Input) 개발 및 버튼 중복 클릭 방지 처리
64+
- Axios 통신 모듈화 및 API 관리, 에러 발생 시 사용자 알림(Alert) 처리
65+
- 메시지 작성 페이지 반응형 구현 및 메타태그를 활용한 미리보기 설정
66+
- 전체 폰트 스타일 적용 (에디터 및 렌더링 결과물에 클래스 기반 반영)
67+
- 홈 페이지 및 메시지 작성 페이지 애니메이션 효과 구현
68+
- 메시지 작성 페이지(`/post/:id/message`) 구현
69+
- 드롭다운 컴포넌트 개발
70+
- Rich Text Editor(Quill) 커스텀 툴바 구성 (링크, 색상, 리스트 등 포함)
71+
- 프로필 이미지 업로드 기능 및 기본 이미지 클릭 시 초기화 처리
72+
- 폼/에디터 유효성 검사 및 버튼 비활성화 처리
73+
- 프로필 이미지 GET 요청 시 Skeleton UI 적용
74+
- 기존 API 연동(GET) 및 게시글 작성(POST) 기능 구현
75+
- 작성 완료 후 해당 카드 페이지(`/post/:id`)로 이동 처리
76+
- 로컬스토리지 임시 저장 및 관리 기능 개발
77+
- 작성 중 임시 저장
78+
- 제출 시 임시 저장 삭제
79+
- 저장 후 24시간 경과 시 자동 삭제
80+
- 초기 상태 세팅 처리 (기본 이미지, 기본 폰트 등)
81+
82+
### 이찬호
83+
- 프로젝트 초기 세팅
84+
- ESLint, Prettier 등 도구 설정
85+
- 깃허브 프로젝트 관리
86+
- PR 템플릿 설정
87+
- 브랜치 전략 수립 및 관리
88+
- Fork Repository 자동 동기화 워크플로우 구축
89+
- CI/CD 파이프라인 구축
90+
- GitHub Actions 워크플로우 설정
91+
- Vercel 자동배포 환경 구성
92+
- Production/Preview 환경 분리
93+
- 헤더 서비스 구현
94+
- 이모지 리액션 기능 (추가/조회/카운팅)
95+
- Optimstic UI 패턴 적용
96+
- 중복 클릭 방지
97+
- 카카오톡 공유 기능
98+
- URL 클립보드 복사 기능
99+
- 토스트 알림
100+
- 반응형 UI/UX 구현
101+
102+
### 이승민
103+
- 메인 화면 구현
104+
- 반응형 UI/UX 구현
105+
106+
### 전지윤
107+
- 공통 헤더 컴포넌트 구현
108+
- /list 페이지 캐러셀 구현
109+
- 슬라이드 기능: 화면 크기에 따라 버튼, 터치, 드래그 입력 방식으로 동작
110+
- 캐러셀 끝 도달 시 Bounce 애니메이션 적용
111+
- Skeleton UI와 이미지 Preload 처리로 초기 로딩 시 사용자 경험 개선
112+
113+
114+
### 윤진우
115+
- 롤링 페이퍼 생성 페이지 (`/post`) 구현
116+
- 배경 색상 및 이미지 선택 기능 제공
117+
- 배경 이미지 업로드 기능 추가 구현
118+
- 입력된 데이터를 기반으로 API에 POST 요청 후, 생성된 페이지로 이동
119+
- 이미지 로딩 중 스켈레톤 UI를 적용해 사용자 경험 향상
120+
121+
- 롤링 페이퍼 페이지 (`/post/{id}`) 구현
122+
- `IntersectionObserver`를 활용한 무한 스크롤 기능 구현 (메시지를 일정 개수씩 반복 호출)
123+
- 사용자 입력값에 대해 XSS 방지를 위해 `DOMPurify` 적용
124+
- 메시지 클릭 시 상세 내용을 모달 창으로 출력
125+
- 메시지 내용이 길 경우 `...`으로 처리하여 레이아웃 균형 유지
126+
- 뒤로 가기 버튼 추가로 페이지 탐색 편의성 제공
127+
128+
- 롤링 페이퍼 편집 페이지 (`/post/{id}/edit`) 구현
129+
- 메시지 삭제 기능 구현
130+
- 페이지 삭제 기능 구현 (**실수 방지를 위해 2단계 확인창을 적용하여 안전성 강화**)
131+
- 편집 모드에서는 "추가하기" 버튼이 숨겨지므로, 메시지 개수를 조정해 레이아웃의 시각적 균형을 유지
132+
133+
- 사용자 경험(UX) 최적화
134+
- 뒤로 가기 버튼에 지속적인 색상 변화 애니메이션을 적용해, 특정 배경 이미지 위에서도 눈에 띄도록 개선
135+
- 모달 창 등장 및 종료에 부드러운 애니메이션을 적용해 사용자 몰입도 향상
136+
- 메시지 삭제 버튼에 hover 애니메이션 추가로 조작 피드백 제공
137+
138+
## 📂 폴더 구조
139+
``` bash
140+
project-root/
141+
├── src/
142+
│ ├── api/
143+
│ ├── assets/
144+
│ │ ├── images/
145+
│ │ └── styles/
146+
│ ├── components/
147+
│ │ ├── common/
148+
│ │ └── layout/
149+
│ ├── context/
150+
│ ├── hooks/
151+
│ ├── pages/
152+
│ ├── utils/
153+
│ ├── App.jsx
154+
│ └── main.jsx
155+
└── ...
156+
```
157+
158+
## 📝 컨벤션
159+
160+
### 🧐 Commit Type & Emoji Guide
161+
162+
| **commit type** | **description** |
163+
|---------------|----------------|
164+
| feat | ✨ 기능 추가 |
165+
| feat | 🖼️ 아이콘 추가 |
166+
| fix | 🐛 버그 수정 |
167+
| docs | 📝 문서 수정 |
168+
| style | 🎨 UI, 스타일 관련 추가 및 수정 |
169+
| refactor | ♻️ 리팩토링 |
170+
| chore | 🔧 설정, 빌드 변경 |
171+
| chore | 📁 폴더 구조 변경 또는 디렉토리 작업 |
172+
| remove | 🔥 불필요한 코드/파일 제거 |
173+
| deploy | 🚀 프로젝트 배포 |
174+
175+
176+
177+
### 📂 폴더/파일명 네이밍 컨벤션
178+
179+
| **대상** | **규칙** | **예시** |
180+
|------|------|--------|
181+
| 폴더명 | 케밥케이스 (kebab-case) | components, user-profile |
182+
| 컴포넌트 파일명 | 파스칼케이스 (PascalCase) | UserProfile.jsx |
183+
| 스타일 파일명 | 케밥케이스 + .styles.js | user-profile.styles.js |
184+
| 이미지/아이콘 파일명 | 케밥케이스 | logo-icon.png, profile-default.png |
185+
| 함수명/변수명 | 카멜케이스 (camelCase) | fetchUserData, userList |
186+
| 환경변수 | 대문자+스네이크케이스 | VITE_API_URL |
187+
| 클래스명 | BEM 방식 | .block__element--modifier |
188+
189+
### 🖊️ Git Flow
190+
191+
| **브랜치명** | **설명** |
192+
|------------|---------|
193+
| main | 배포 브랜치 |
194+
| develop | 통합 개발 브랜치 |
195+
| feature/* | 기능 개발 브랜치 |
196+
197+
### 🌿 브랜치 네이밍 컨벤션
198+
199+
| **브랜치 종류** | **네이밍 규칙** | **예시** |
200+
|------|------|--------|
201+
| 기능 개발 | feature/{이름} | feature/park |
202+
| 버그 수정 | fix/{버그-설명} | fix/login-button-bug |
203+
| 문서 수정 | docs/{문서-설명} | docs/readme-update |
204+

eslint.config.js

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@ import globals from 'globals';
33
import reactHooks from 'eslint-plugin-react-hooks';
44
import reactRefresh from 'eslint-plugin-react-refresh';
55

6-
export default [
7-
{ ignores: ['dist'] },
6+
import prettier from 'eslint-plugin-prettier';
7+
import importPlugin from 'eslint-plugin-import';
8+
9+
const config = [
10+
{ ignores: ['dist', 'eslint.config.js'] },
11+
812
{
913
files: ['**/*.{js,jsx}'],
1014
languageOptions: {
1115
ecmaVersion: 2020,
12-
globals: globals.browser,
16+
17+
globals: {
18+
...globals.browser,
19+
...globals.node,
20+
},
21+
1322
parserOptions: {
1423
ecmaVersion: 'latest',
1524
ecmaFeatures: { jsx: true },
@@ -19,15 +28,52 @@ export default [
1928
plugins: {
2029
'react-hooks': reactHooks,
2130
'react-refresh': reactRefresh,
31+
32+
prettier: prettier,
33+
import: importPlugin,
34+
2235
},
2336
rules: {
2437
...js.configs.recommended.rules,
2538
...reactHooks.configs.recommended.rules,
26-
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
39+
40+
41+
'no-unused-vars': ['warn', { varsIgnorePattern: '^[A-Z_]' }],
42+
'no-console': 'warn',
43+
'prefer-const': 'warn',
44+
45+
2746
'react-refresh/only-export-components': [
2847
'warn',
2948
{ allowConstantExport: true },
3049
],
50+
51+
'react-hooks/rules-of-hooks': 'warn',
52+
53+
'prettier/prettier': ['warn', {}, { usePrettierrc: true }],
54+
55+
'import/no-anonymous-default-export': [
56+
'error',
57+
{
58+
allowArrowFunction: true,
59+
allowAnonymousFunction: false,
60+
allowAnonymousClass: false,
61+
},
62+
],
63+
64+
'func-style': ['warn', 'declaration', { allowArrowFunctions: true }],
65+
},
66+
settings: {
67+
react: {
68+
version: '18.2.0',
69+
},
70+
'import/resolver': {
71+
node: {
72+
extensions: ['.js', '.jsx'],
73+
},
74+
},
3175
},
3276
},
3377
];
78+
79+
export default config;

0 commit comments

Comments
 (0)