Ignis๋ ๊ธฐ๋ถ, ํ๋ฉ, ๋ด์ฌ ํ๋์ ํตํฉํ ์ฌํ์ ๊ฐ์น ์คํ ํ๋ซํผ์ ๋๋ค. ์ฌ์ฉ์๋ค์ด ๋ค์ํ ์ฌํ ๊ณตํ ํ๋์ ์ฐธ์ฌํ๊ณ , ์ปค๋ฎค๋ํฐ๋ฅผ ํ์ฑํ๋ฉฐ, ๊ธ์ ์ ์ธ ๋ณํ๋ฅผ ๋ง๋ค์ด๊ฐ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
- ์ฃผ์ ๊ธฐ๋ฅ
- ๊ธฐ์ ์คํ
- ์์คํ ์ํคํ ์ฒ
- ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ
- ์ค์น ๋ฐ ์คํ
- API ์๋ํฌ์ธํธ
- ํ๋ก์ ํธ ์ํฌํ๋ก์ฐ
- ๋ณด์ ๊ธฐ๋ฅ
- ๊ธฐ์ฌํ๊ธฐ
- ๊ธฐ๋ถ ํ๋ก์ ํธ ๋ฑ๋ก ๋ฐ ๊ด๋ฆฌ
- ์ค์๊ฐ ๊ธฐ๋ถ ํํฉ ์ถ์
- ๊ธด๊ธ ๊ธฐ๋ถ ํ๋ก์ ํธ ์ง์
- ๊ธฐ๋ถ ๋ด์ญ ์กฐํ ๋ฐ ๊ด๋ฆฌ
- ํฌ๋ผ์ฐ๋ํ๋ฉ ํ๋ก์ ํธ ์์ฑ
- ๋ฆฌ์๋ ์ ํ ๋ฐ ๊ฒฐ์ ์์คํ
- ํ๋ฉ ๋ชฉํ ๋ฌ์ฑ๋ฅ ์ถ์
- ๊ธด๊ธ ํ๋ฉ ํ๋ก์ ํธ ์ง์
- ๋ด์ฌ ํ๋ ๋ฑ๋ก ๋ฐ ์ ์ฒญ
- ์ฐธ๊ฐ์ ๊ด๋ฆฌ ์์คํ
- ๋ด์ฌ ์ผ์ ๋ฐ ์์น ๊ด๋ฆฌ
- ๊ธด๊ธ ๋ด์ฌ ํ๋ ์ง์
- ๊ณต์ง์ฌํญ ๊ฒ์ํ
- ์์ ๊ฒ์ํ
- ๋๊ธ ์์คํ
- ์ข์์ ๋ฐ ์กฐํ์ ๊ธฐ๋ฅ
- OAuth2 ์์ ๋ก๊ทธ์ธ
- ํ์๊ฐ์ ๋ฐ ์ธ์ฆ
- ๋ง์ดํ์ด์ง (๋์๋ณด๋, ํ๋กํ ์ค์ )
- ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ (์ด๋ฉ์ผ ์ธ์ฆ)
- ํตํฉ ๊ฒ์ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฒ์
- ์ธ๊ธฐ ํ๋ก์ ํธ ์ถ์ฒ
- ์กฐํ์ ๊ธฐ๋ฐ ์ถ์ฒ
- PortOne(Iamport) ๊ฒฐ์ ์ฐ๋
- ๊ธฐ๋ถ ๋ฐ ํ๋ฉ ๊ฒฐ์ ์ฒ๋ฆฌ
- ๊ฒฐ์ ๋ด์ญ ๊ด๋ฆฌ
- ํ๋ก์ ํธ ์น์ธ/๊ฑฐ๋ถ
- ์ฌ์ฉ์ ๊ด๋ฆฌ
- ํต๊ณ ๋ฐ ๋์๋ณด๋
- Java 17
- Spring Boot 3.4.4
- Spring Security (OAuth2 ํด๋ผ์ด์ธํธ)
- MyBatis 3.0.4
- Spring Data JPA
- MySQL 8.0
- Redis (์บ์ฑ)
- Spring Mail (์ด๋ฉ์ผ ์ธ์ฆ)
- PortOne API (๊ฒฐ์ ์์คํ )
- React 19.1.0
- Vite 7.0.0
- React Router DOM 7.9.6
- Ant Design 5.26.3
- jQuery 3.7.1
- Gradle (Backend)
- npm (Frontend)
graph TB
subgraph "Client Layer"
A[React Frontend<br/>Vite + React Router]
end
subgraph "API Gateway"
B[Spring Security<br/>OAuth2 + CORS]
end
subgraph "Application Layer"
C[Home Controller]
D[Donation Controller]
E[Funding Controller]
F[Volunteer Controller]
G[User Controller]
H[Payment Controller]
I[Search Controller]
J[Admin Controller]
end
subgraph "Business Logic Layer"
K[DonationBO]
L[FundingBO]
M[VolunteerBO]
N[UserBO]
O[PaymentBO]
P[SearchBO]
end
subgraph "Data Access Layer"
Q[MyBatis Mapper]
R[JPA Repository]
end
subgraph "Data Storage"
S[(MySQL Database)]
T[(Redis Cache)]
end
subgraph "External Services"
U[PortOne API<br/>๊ฒฐ์ ์์คํ
]
V[OAuth2 Provider<br/>์์
๋ก๊ทธ์ธ]
W[SMTP Server<br/>์ด๋ฉ์ผ ๋ฐ์ก]
end
A -->|HTTP/HTTPS| B
B --> C
B --> D
B --> E
B --> F
B --> G
B --> H
B --> I
B --> J
C --> K
D --> K
E --> L
F --> M
G --> N
H --> O
I --> P
K --> Q
L --> Q
M --> Q
N --> R
O --> U
P --> Q
Q --> S
R --> S
K --> T
L --> T
M --> T
N --> V
N --> W
style A fill:#61dafb
style B fill:#6db33f
style S fill:#4479a1
style T fill:#dc382d
style U fill:#ff6b6b
graph LR
subgraph "Backend Structure"
A[com.Ignis]
A --> B[admin<br/>๊ด๋ฆฌ์ ๊ธฐ๋ฅ]
A --> C[comment<br/>๋๊ธ ์์คํ
]
A --> D[common<br/>๊ณตํต ์ ํธ๋ฆฌํฐ]
A --> E[config<br/>์ค์ ํ์ผ]
A --> F[home<br/>ํ ๋ฐ ๋ฉ์ธ ๊ธฐ๋ฅ]
A --> G[notice<br/>๊ณต์ง์ฌํญ]
A --> H[payment<br/>๊ฒฐ์ ์ฒ๋ฆฌ]
A --> I[post<br/>๊ฒ์ํ]
A --> J[search<br/>๊ฒ์ ๊ธฐ๋ฅ]
A --> K[user<br/>์ฌ์ฉ์ ๊ด๋ฆฌ]
F --> F1[donation<br/>๊ธฐ๋ถ]
F --> F2[funding<br/>ํ๋ฉ]
F --> F3[mypage<br/>๋ง์ดํ์ด์ง]
F --> F4[volunteer<br/>๋ด์ฌ]
end
subgraph "Frontend Structure"
L[ignis-frontend]
L --> L1[src/components<br/>๊ณตํต ์ปดํฌ๋ํธ]
L --> L2[src/pages<br/>ํ์ด์ง ์ปดํฌ๋ํธ]
L --> L3[src/styles<br/>์คํ์ผ์ํธ]
L --> L4[src/hooks<br/>์ปค์คํ
ํ
]
L2 --> L2A[donation<br/>๊ธฐ๋ถ ํ์ด์ง]
L2 --> L2B[funding<br/>ํ๋ฉ ํ์ด์ง]
L2 --> L2C[volunteer<br/>๋ด์ฌ ํ์ด์ง]
L2 --> L2D[home<br/>ํ ํ์ด์ง]
L2 --> L2E[mypage<br/>๋ง์ดํ์ด์ง]
L2 --> L2F[noticeboard<br/>๊ณต์ง์ฌํญ]
L2 --> L2G[freeboard<br/>์์ ๊ฒ์ํ]
end
erDiagram
USER ||--o{ DONATION : creates
USER ||--o{ FUNDING : creates
USER ||--o{ VOLUNTEER : creates
USER ||--o{ POST : creates
USER ||--o{ NOTICE : creates
USER ||--o{ COMMENT : writes
DONATION ||--o{ DONATION_PRICE : has
FUNDING ||--o{ FUNDING_PRICE : has
VOLUNTEER ||--o{ VOLUNTEER_PEOPLE : has
DONATION {
bigint donation_id PK
bigint user_id FK
string title
text description
string account_info
int max_price
int current_price
string status
string image_path
boolean emergency
int view_count
int like_count
datetime created_at
datetime updated_at
}
FUNDING {
bigint funding_id PK
bigint user_id FK
string title
text description
int max_price
int current_price
string image_path
string sub_image_path
string status
boolean emergency
int view_count
int like_count
datetime created_at
datetime updated_at
}
VOLUNTEER {
bigint volunteer_id PK
bigint user_id FK
string title
text description
string location
string image_path
datetime start_time
datetime end_time
int max_participants
int current_people
string status
boolean emergency
int view_count
int like_count
datetime created_at
datetime updated_at
}
USER {
bigint user_id PK
string user_login_id UK
string password
string name
string email UK
string phone_number
string role
boolean email_verified
datetime email_sent
datetime created_at
}
POST {
bigint post_id PK
bigint user_id FK
string title
text content
string board_type
int view_count
int like_count
datetime created_at
datetime updated_at
}
NOTICE {
bigint notice_id PK
bigint user_id FK
string title
text content
int view_count
datetime created_at
datetime updated_at
}
COMMENT {
bigint comment_id PK
bigint user_id FK
bigint target_id
string target_type
text content
datetime created_at
datetime updated_at
}
DONATION_PRICE {
bigint donation_price_id PK
bigint donation_id FK
bigint user_id FK
int price
datetime created_at
}
FUNDING_PRICE {
bigint funding_price_id PK
bigint funding_id FK
bigint user_id FK
int price
datetime created_at
}
VOLUNTEER_PEOPLE {
bigint volunteer_people_id PK
bigint volunteer_id FK
bigint user_id FK
datetime created_at
}
- Java 17 ์ด์
- Node.js 18 ์ด์
- MySQL 8.0 ์ด์
- Redis (์ ํ์ฌํญ)
- ํ๋ก์ ํธ ํด๋ก
git clone <repository-url>
cd ignis1-
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
- MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
application.properties๋๋application.ymlํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด ์ค์
-
์์กด์ฑ ์ค์น ๋ฐ ์คํ
# Gradle Wrapper๋ฅผ ์ฌ์ฉํ์ฌ ์คํ
./gradlew bootRun
# Windows์ ๊ฒฝ์ฐ
gradlew.bat bootRun- ํ๋ก ํธ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd ignis-frontend- ์์กด์ฑ ์ค์น
npm install
npm i @ant-design/compatible
npm i react-router-dom- ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run devFrontend ๋น๋
cd ignis-frontend
npm run build๋น๋๋ ํ์ผ์ src/main/resources/static ๋๋ ํ ๋ฆฌ์ ์๋์ผ๋ก ๋ณต์ฌ๋ฉ๋๋ค.
GET /user/me- ํ์ฌ ์ฌ์ฉ์ ์ ๋ณด ์กฐํPOST /user/signup- ํ์๊ฐ์POST /user/login- ๋ก๊ทธ์ธPOST /user/logout- ๋ก๊ทธ์์GET /oauth2/authorization/{provider}- OAuth2 ๋ก๊ทธ์ธ
GET /api/donation/list- ๊ธฐ๋ถ ๋ชฉ๋ก ์กฐํGET /api/donation/{id}- ๊ธฐ๋ถ ์์ธ ์กฐํPOST /api/donation/create- ๊ธฐ๋ถ ํ๋ก์ ํธ ์์ฑPOST /api/donation/payment- ๊ธฐ๋ถ ๊ฒฐ์
GET /api/funding/list- ํ๋ฉ ๋ชฉ๋ก ์กฐํGET /api/funding/{id}- ํ๋ฉ ์์ธ ์กฐํPOST /api/funding/create- ํ๋ฉ ํ๋ก์ ํธ ์์ฑPOST /api/funding/payment- ํ๋ฉ ๊ฒฐ์
GET /api/volunteer/list- ๋ด์ฌ ๋ชฉ๋ก ์กฐํGET /api/volunteer/{id}- ๋ด์ฌ ์์ธ ์กฐํPOST /api/volunteer/create- ๋ด์ฌ ํ๋ ์์ฑPOST /api/volunteer/{id}/participate- ๋ด์ฌ ์ฐธ๊ฐ
GET /api/search?keyword={keyword}&type={type}- ํตํฉ ๊ฒ์
GET /api/home- ํ ํ์ด์ง ๋ฐ์ดํฐ ์กฐํGET /api/emergency/check- ๊ธด๊ธ ๊ณต์ง ํ์ธ
sequenceDiagram
participant U as User
participant F as Frontend
participant B as Backend
participant DB as Database
participant P as PortOne
U->>F: ํ๋ก์ ํธ ์์ฑ ์์ฒญ
F->>B: POST /api/{type}/create
B->>DB: ํ๋ก์ ํธ ์ ๋ณด ์ ์ฅ
DB-->>B: ์ ์ฅ ์๋ฃ
B-->>F: ํ๋ก์ ํธ ID ๋ฐํ
F-->>U: ์์ฑ ์๋ฃ
Note over B: ๊ด๋ฆฌ์ ์น์ธ ๋๊ธฐ
U->>F: ๊ฒฐ์ ์์ฒญ
F->>B: POST /api/{type}/payment
B->>P: ๊ฒฐ์ ์์ฒญ
P-->>B: ๊ฒฐ์ ์ ๋ณด
B->>DB: ๊ฒฐ์ ๋ด์ญ ์ ์ฅ
DB-->>B: ์ ์ฅ ์๋ฃ
B-->>F: ๊ฒฐ์ ์๋ฃ
F-->>U: ๊ฒฐ์ ์ฑ๊ณต ํ์ด์ง
- Spring Security๋ฅผ ํตํ ์ธ์ฆ/์ธ๊ฐ
- OAuth2 ์์ ๋ก๊ทธ์ธ ์ง์
- ๋น๋ฐ๋ฒํธ SHA-256 ํด์ฑ
- CORS ์ค์
- CSRF ๋ณดํธ
- ์ธ์ ๊ด๋ฆฌ
flowchart TD
A[์ฌ์ฉ์ ์ ์] --> B{๋ก๊ทธ์ธ ์ฌ๋ถ}
B -->|๋ฏธ๋ก๊ทธ์ธ| C[๋ก๊ทธ์ธ/ํ์๊ฐ์
]
B -->|๋ก๊ทธ์ธ| D[ํ ํ์ด์ง]
C --> E[OAuth2 ๋ก๊ทธ์ธ]
C --> F[์ผ๋ฐ ๋ก๊ทธ์ธ]
E --> D
F --> D
D --> G[๊ธฐ๋ถ ๋ชฉ๋ก]
D --> H[ํ๋ฉ ๋ชฉ๋ก]
D --> I[๋ด์ฌ ๋ชฉ๋ก]
D --> J[๊ฒ์ํ]
D --> K[๊ฒ์]
D --> L[๋ง์ดํ์ด์ง]
G --> M[๊ธฐ๋ถ ์์ธ]
H --> N[ํ๋ฉ ์์ธ]
I --> O[๋ด์ฌ ์์ธ]
M --> P[๊ธฐ๋ถ ๊ฒฐ์ ]
N --> Q[ํ๋ฉ ๊ฒฐ์ ]
O --> R[๋ด์ฌ ์ฐธ๊ฐ ์ ์ฒญ]
P --> S[๊ฒฐ์ ์๋ฃ]
Q --> S
R --> T[์ ์ฒญ ์๋ฃ]
S --> L
T --> L
L --> U[๋ด ๊ธฐ๋ถ ๋ด์ญ]
L --> V[๋ด ํ๋ฉ ๋ด์ญ]
L --> W[๋ด ๋ด์ฌ ๋ด์ญ]
L --> X[ํ๋กํ ์ค์ ]
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ๊ฐ๋ฐํ: Ignis Development Team
ํ๋ก์ ํธ ๊ด๋ จ ๋ฌธ์์ฌํญ์ด ์์ผ์๋ฉด ์ด์๋ฅผ ๋ฑ๋กํด์ฃผ์ธ์.
Ignis - ํจ๊ป ๋ง๋๋ ๋ฐ๋ปํ ์ธ์ ๐ฅ