-
ํ๋ก์ ํธ ๋ช ์นญ
- Ticketing - ๋ฌธํ ์์ฝ ์๋น์ค ์ฑ
-
ํ๋ก์ ํธ ์๊ฐ
-
โTicketingโ์ ์์ธ์์ ์ด์ํ๋ ๋ฌธํ ์ํ๋ค์ ๋ํ ์์ฝ์ ๋๋ ์ฌ์ดํธ ์ ๋๋ค.
์์ธ์์์ ์ด์ํ๋ ๋ฌธํ ์ํ ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฒ์์ด ๊ฐ๋ฅํ๋ฉฐ, ์ํ๋ ํฐ์ผ์ ๋ํ ์์ฝ๊ณผ ๊ฒฐ์ ํ์ธ์ด ๊ฐ๋ฅํ ์๋น์ค ์ ๋๋ค.
-
-
ํ๋ก์ ํธ ์ ์ ์ด์
- ๋ฌธํ ์ํ์ ๋ํ ์์ฝ ์ฌ์ดํธ ๊ตฌํ ๋ฐ ๊ฒฐ์ , ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๊ณ ์ ๊ตฌ์ํ๊ฒ ๋์๋ค.
- ๊ฒฐ์ ์ฌ์ดํธ์ ๊ฒฝ์ฐ ์ค์ ๊ฒฐ์ ๊น์ง ๊ตฌํํ๊ธฐ์๋ ๋ค์ ์๊ฐ๊ณผ backend ์ง์์ด ๋ถ์กฑํ์ฌ ๊ฒฐ์ ํ์ด์ง ๋ฐ ๊ฒฐ์ ๋ฐ์ดํฐ ์ ์ฅ์ผ๋ก๋ง ๊ตฌ์.
-
๐ํ๋ก์ ํธ ๋ชฉํ
1. ๊ณต๊ณต ๋ฐ์ดํฐ API ๋ฅผ ์ฐ๊ฒฐํด ์์ธ์ ๋ฌธํ ๋ฐ์ดํฐ ์ถ๋ ฅ.
2. ์นดํ
๊ณ ๋ฆฌ ๋ณ ๊ฒ์ ๋ฐ ๋ฐ์ดํฐ ๋ ์ง์ ๋ฐ๋ฅธ ์งํ ์ค, ์งํ ์ข
๋ฃ ํ์ ์ถ๋ ฅ.
3. ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ๊ณผ ๊ฒฐ์ ์ฐฝ(์ค์ ๊ฒฐ์ ๊ฐ ์๋ ์ ํ ๊ธฐ๋ฅ๋ง ๊ฐ๋ฅ) ๊ธฐ๋ฅ ๊ตฌํ.
4. ๊ฒฐ์ ์ ๊ฒฐ์ ๋ด์ญ๊ณผ ์์ฝ๋ ํฐ์ผ ํ์ธ ํ์ด์ง๋ก ๋ฐ์ดํฐ ์ ์ก.
- ๊ณ ๋ ค์ฌํญ
| ๊ธฐ์ | ๋ด์ฉ |
|---|---|
| Frontend | - ์ธ์ด: JavaScript (React) - ํ๋ ์์ํฌ: React.js - ๋ชจ๋ํ๋ CSS์ธ module.css ์ฌ์ฉ - ๋ผ์ฐํ : React Router ์ฌ์ฉ |
| Backend | - Node.js, Express, Axios ํ์ฉํ ์๋ฒ ๊ฐ๋ฐ - ์๋ํฌ์ธํธ, GET ๋ฐ POST ๋ฉ์๋ ์ดํด |
| Data-Base | - mongoDB ์ฐ๊ฒฐ์ ํตํ ๋ฐ์ดํฐ ์ ์ฅ - CORS ์ด์ ํด๊ฒฐ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํต์ ์ํํ๊ฒ - Open API ์ฌ์ฉ๋ฒ ์์ง ๋ฐ ๋ฐ์ดํฐ ๊ฐ๊ณต ํ ๋ด๋ณด๋ด๊ธฐ ๊ณํ |
- ํ์ด์ง๋ณ ํต์ฌ๊ธฐ๋ฅ
| ํ์ด์ง | ๊ธฐ๋ฅ |
|---|---|
| ๋ก๊ทธ์ธ | - ํ์๊ฐ์
- ๋ก๊ทธ์ธ ํ์ธ - mongoDB ์ฐ๊ฒฐ |
| ๋ฉ์ธ | - ์์ธ์ ๊ณต๊ณต ๋ฌธํ ๋ฐ์ดํฐ ์ถ๋ ฅ - ์นดํ ๊ณ ๋ฆฌ ๋ณ ํํฐ ์ ์ฉ - ํ์ฌ ๋ ์ง ๊ธฐ์ค ์งํ์์ , ์งํ์ค, ์งํ ์ข ๋ฃ ํ์ธ - ๊ฒ์ ๊ธฐ๋ฅ - ์์ฝ ๊ฐ๋ฅ, ์ข ๋ฃ ์ด๋ฒคํธ ์ฒดํฌ ์ ํด๋น ๋ฆฌ์คํธ ์ถ๋ ฅ - ์ข ๋ฃ๋ ์ด๋ฒคํธ ์์ฝ ๋ฒํผ ๋นํ์ฑ |
| ์ฅ๋ฐ๊ตฌ๋ | - ์ ์ฅ๋ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ - ์ญ์ ๋ฒํผ - ๊ฒฐ์ ๋ฒํผ ํด๋ฆญ ์ ๊ฒฐ์ ์ฐฝ ์ด๋ - ๊ฒฐ์ ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ์๋ ์ญ์ |
| ๊ฒฐ์ ํ์ด์ง | - mongoDB์ ์ ์ฅ๋ ํด๋น ๋ฐ์ดํฐ ์ถ๋ ฅ - ํ์ ์์ฑ์นธ(์ด๋ฆ, ํด๋์ ํ, ์ด๋ฉ์ผ) ๋ฏธ์ ๋ ฅ ์ ๊ฒฝ๊ณ ์๋ฆผ - ๊ฒฐ์ ๋ฐฉ์ ์ ํ - ๊ฒฐ์ ๋ฒํผ ํด๋ฆญ ์ ๊ฒฐ์ ์๊ฐ ๋ฐ ๊ฒฐ์ ๋ฐฉ์ ์ ์ฅ |
| ๋ง์ดํ์ด์ง | - ํ๋กํ ์ด๋ฏธ์ง ์ ํ ๋ฐ ์์ - ๋ก๊ทธ์์ - ๊ฒฐ์ ๋ด์ญ ํ์ธ - ์์ฝ ๋ด์ญ ํ์ธ - ๋ด๊ฐ ์์ฑํ ๋ฆฌ๋ทฐ ํ์ธ(๋ฏธ์์ ) |
| ๊ธฐ์ | ๊ฐ๋ฐํ๊ฒฝ |
|---|---|
| FrontEnd | |
| BackEnd | |
| Design | |
| Tools |
- ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ
- ๋ฌธํ ๋ฐ์ดํฐ ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฒ์ ๋ฐ ์งํ๋ณ ์ํ ํ์ธ
- ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ ๊ตฌํ
- ๊ฒฐ์ ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ฒฐ์ ์ ๋ณด, ์์ฝ ํฐ์ผ ํ์ธ
- ๋ฆฌ๋ทฐ ์์ฑ ( ๋ฏธ์์ )
| ๋ก๊ทธ์ธ | ๋ฉ์ธ |
|---|---|
![]() |
![]() |
| ์ฅ๋ฐ๊ตฌ๋ ๋ฐ ๊ฒฐ์ | ๋ง์ดํ์ด์ง |
![]() |
![]() |
- ์ธ๋ถ API ๋ณ๊ฒฝ
-
๊ธฐ์กด ๋ฐ์ดํฐ
- ๋ฌธํ ๊ณต๊ณต ๋ฐ์ดํฐ ๊ด์ฅ - ์์ ์์ ๋น_์ข ํฉ ๊ณต์ฐ์ ๋ณด(์ ์ฒด ์ฅ๋ฅด)
- JSON ํ์
-
๊ธฐ์กด ์ฐ๊ฒฐ ๋ฐ์ดํฐ ๋ฌธ์ ์ฌํญ
- ๋ค์ํ ์ถ๋ ฅ ๊ฐ์ด ๋ง์ง๋ง ๋น์นธ์ผ๋ก ์์ฑ ๋์ด์๋ ์นธ์ด ๋งค์ฐ ๋ง์
- ์ด๋ฏธ์ง url ์ฐ๊ฒฐ์ด ๋์ง ์๋ ๋ฌธ์ ๋ฐ์ (์์ธ x)
- ๋ค์ํ ์ ๋ณด๊ฐ ์๋ ์์ ์ ์ ๋น ํ์ ๋ฐ์ดํฐ๋ง ์ถ์ถ๋์ด ์ ๋ณด๊ฐ ํ์ ์ ์
- ์ ๋ฐ์ดํธ ์๋๊ฐ ๋๋ ค ์ด๋ฏธ ์ข ๋ฃ๋ ์ด๋ฒคํธ๊ฐ ๋ง์
-
๋ณ๊ฒฝ ๋ฐ์ดํฐ
- ์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ ๊ด์ฅ - ์์ธ์ ๋ฌธํ ํ์ฌ ์ ๋ณด
- JSON ํ์
-
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ด์
- ๋ค์ํ ์ถ๋ ฅ ๊ฐ๊ณผ ์ถ์ถ๋๋ ๋ฐ์ดํฐ์์ ๋๋ฝ์ด ์ ์
- ์ด๋ฏธ์ง url ์ถ๋ ฅ์ ์ด์ ์ฌํญ์ด ์๋ค
- ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋ถ๋ฅ๊ฐ ์ ์ ๋ฆฌ๋์ด ์์
- ์์ธ์ ์ ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ฐ์ดํฐ ์ถ๋ ฅ ๊ฐ๋ฅ
- ์ ๋ฐ์ดํธ ์๋๊ฐ ๋น๊ต์ ๋น ๋ฅธํธ
-
- API ์ฐ๊ฒฐ
- ํด๋น ๋ฐ์ดํฐ ํ์ด์ง์์ ์ธ์ฆํค ์ ์ฒญ
- ๋ก๊ทธ์ธ ํ ์ธ์ฆํค ์ ์ฒญ ์์ฑ โ ์ด๋ฉ์ผ๋ก ์ ์ฒญํค ๋ฐ๊ธฐ
-
node.js ํ๊ฒฝ์์ Express๋ฅผ ์ฌ์ฉํด ๋ฐฑ์๋ ์๋ฒ ๊ตฌ์ถ ํ ๋ฐ์ดํฐ ๋ฐ์์ค๊ธฐ
a. axios๋ฅผ ์ฌ์ฉํด ์๋ฒ์ http ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ์์ด
const axios = require("axios")b. ๋น๋๊ธฐ ํจ์๋ก ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์์ฒญ(
req)๊ณผ ์๋ฒ๋ก์ ์๋ต(res)์ ์ฒ๋ฆฌ. Express์ ๋ผ์ฐํฐ์์ ์ฌ์ฉ๋จc. ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด url ๊ฐ๊ณผ ํ์ ์์ฒญ ๊ฐ ์์ฑ - ์ธ์ฆํค๋ .env๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๊ฐ๋ ค์ค - .env ์ ์ ์ฅํ ๊ฐ์ ๊ฐ์ ธ์ฌ ๋๋
process.env.APPKEYํํ๋ก ์์ฑํ๋คd. cors ์๋ฌ 1.
const cors = require("cors");2.app.options("*", cors());3. front file โ package.json โproxy์ถ๊ฐ
const response = await axios.get(
`http://openapi.seoul.go.kr:8088/${process.env.APPKEY}/json/culturalEventInfo/1/500/`,
{
params: {
Type: "json",
Service: "culturalEventInfo",
StartIndex: 1,
EndIndex: 5, //๋ฐ์์ฌ ๋ฐ์ดํฐ
searchValue: searchValue,
}-
ํ๋ก ํธ์์ ๊ฐ์ ์ถ๋ ฅ
a.
useStateํ ์ ์ฌ์ฉํ์ฌ ์ํ ๋ณ์๋ค(data,searchTerm,selectedCategory)์ ์ด๊ธฐํb.
useEffectํ ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋fetchDataํจ์๋ฅผ ํธ์ถc. **
axios.get('/ex/twoculture')**๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์/ex/twoculture์๋ํฌ์ธํธ๋ก GET ์์ฒญ์ ๋ณด๋.d.
filteredData.map๋กfilteredData๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๊ฐ์ ธ์์ ํด๋น ์์๋ฅผ ๋ํ๋ด๋ JSX ์ฝ๋๋ฅผ ์์ฑํด ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์์๋ฅผ ๋ ๋๋ง
-
๋ฌธ์ ๋ฐ์
- ๊ฒ์ ํ์ด์ง์์ ์์ฝํ๊ธฐ ๋ฒํผ ํด๋ฆญ ์ ์์ฝ ์ฐฝ์ผ๋ก ๋์ด๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋์ง ์์.
- ๋ฌธ์ ์ฝ๋
<Link to={{ pathname: `/reserve/${encodeURIComponent(item.TITLE)}`, state: { eventData: item } }} onClick={() => console.log('Link clicked', item.TITLE, item)}> <button>์์ฝํ๊ธฐ</button> </Link> -
๋ฌธ์ ์์ธ
- Link ์ปดํฌ๋ํธ์
to์์ฑ์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์์state์์ฑ์to์์ฑ ์์ ๋ฃ์ผ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋์ง ์๋ ์ค๋ฅ ๋ฐ์ - ๋ฒ์ ์ด ์
๊ทธ๋ ์ด๋ ๋๋ฉฐ
to์์ฑ ์์pathname์ ๋ ฅ ์state๊ฐ ๋น ๊ฐ์ฒด๋ก ์ ๋ฌ
- Link ์ปดํฌ๋ํธ์
-
ํด๊ฒฐ ๊ณผ์
- Link ์ฝ๋์ ๋ํ ์ดํด๋ฅผ ์ ํํ ํ๊ณ ์ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ๊ณต์๋ฌธ์ ์ฐธ๊ณ ๋ฐ ๊ตฌ๊ธ๋ง
to์์ฑ๊ณผstate์์ฑ์ ๋ฐ๋ก ์์ฑํ์ฌ ์์ฑ ์ค์ฒฉ ๋ฐฉ์ง- pathname ์์ฑ ์์ ๊ธฐ
<Link to={`/reserve/${encodeURIComponent(item.TITLE)}`} state={{ eventData: item }} onClick={() => console.log('Link clicked', item.TITLE, item)}> <button>์์ฝํ๊ธฐ</button> </Link>
- ๋ฌธ์ ๋ฐ์
- ๊ฒฐ์ ํ์ด์ง์ ์๋ ๊ฒฐ์ ๋ฒํผ ํด๋ฆญ ์ ๊ฒฐ์ ์๊ฐ ๋ฐ ๊ฒฐ์ ๋ฐฉ์์ mongoDB์ ์ ์ฅํ๋ ค ํ๋๋ฐ ๊ณ์ํด์ undefined๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์์
- ๋ฌธ์ ์์ธ
- node.js์์ mongoose์ ์คํค๋ง ์ ์ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒฐ์ ์๊ฐ๊ณผ ๊ฒฐ์ ๋ฐฉ์์ ๋ํ ์ ์๊ฐ ์๋ชป๋จ
- PaymentTime โ number / PaymentMethod โ object
- node.js์์ mongoose์ ์คํค๋ง ์ ์ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒฐ์ ์๊ฐ๊ณผ ๊ฒฐ์ ๋ฐฉ์์ ๋ํ ์ ์๊ฐ ์๋ชป๋จ
- ํด๊ฒฐ ๊ณผ์
- ์คํค๋ง ์ ์์ ๊ฐ์ ์์ ํด ๋ฐ์ดํฐ์ ๋ง๋ ์ฝ๋๋ก ์
๋ ฅ
- PaymentTime โ Date / PaymentMethod โ String
- ์คํค๋ง ์ ์์ ๊ฐ์ ์์ ํด ๋ฐ์ดํฐ์ ๋ง๋ ์ฝ๋๋ก ์
๋ ฅ
-
๋ฌธ์ ๋ฐ์
- ๊ฒฐ์ ํ์ด์ง์์ ๊ฒฐ์ ๋ฒํผ ํด๋ฆญ ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ์ ์ ์ฅ๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ์๋ ์ญ์ ๋์ด์ผ ํ๋๋ฐ ๊ณ์ํด์
Axios์๋ฌ๊ฐ ๋ฐ์
- ๊ฒฐ์ ํ์ด์ง์์ ๊ฒฐ์ ๋ฒํผ ํด๋ฆญ ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ์ ์ ์ฅ๋ ํด๋น ๋ฐ์ดํฐ๊ฐ ์๋ ์ญ์ ๋์ด์ผ ํ๋๋ฐ ๊ณ์ํด์
-
๋ฌธ์ ์์ธ
- node.js์์ ์ ์ํ save delete ์ฝ๋๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ํด๋น ๋ฐ์ดํฐ์ id ๊ฐ์ด ์ ๋๋ก ์ ์๋์ง ์์ ๊ณ์๋ ์๋ฌ ๋ฐ์
-
ํด๊ฒฐ ๊ณผ์
const *reserveIdToDelete* = *location.state.id*;์ฝ๋๋ฅผ ์์ฑํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ณผ์ ์ ์์ด ํ์ฌ ์์ฝ ์ ๋ณด์ ๊ณ ์ ํ ์๋ณ์๋ฅผ ์ง์ ํด์ฃผ์ด Axios ์๋ฌ๋ฅผ ํด๊ฒฐ
const reserveIdToDelete = location.state.id; const deleteResponse = await axios.delete(`/save/delete/${reserveIdToDelete}`); if (deleteResponse.status === 200) { console.log('์์ฝ ์ ๋ณด ์ญ์ ์ฑ๊ณต'); } else { console.error('์์ฝ ์ ๋ณด ์ญ์ ์คํจ'); } if (response.status === 200) { console.log('Reservation successful!'); } } catch (error) { console.error('Reservation error:', error);
-
๋ฌธ์ ๋ฐ์
activeStartDate์์ฑ์ ์ฌ์ฉํด ๋ฐ์ดํฐ์ ์์์ผ์ด ํด๋น๋๋ ๋ฌ์ด ๊ฐ์ฅ ๋จผ์ ๋ํ๋๊ฒ ์์ ํ๋ ค ํ์ผ๋, ํด๋น ๋ฌ์ด ๊ฐ์ฅ ๋จผ์ ๋ํ๋์ง๋ง ๋ค์๋ฌ๋ก ๋์ด๊ฐ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์
-
ํด๊ฒฐ ๊ณผ์
Project site: click๐
ID : 111
PW : 111






