๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ“š [2024-11-14] 3์ฃผ์ฐจ ๋ฐœํ‘œ ์ž๋ฃŒ

๐Ÿ“ย ์ฃผ์ œ ์š”์•ฝโ€‹

์ค‘์žฅ๋…„์ธต ๋Œ€์ƒ ๊ธธ์•ˆ๋‚ด ์›น์„œ๋น„์Šคโ€‹

  • ์„ค๋ช… : ์กฐ๋ถ€๋ชจ๋‹˜์ด ์˜ฌ๋ผ์˜ค์‹ค๋•Œ ์–ด๋””๋งŒํผ ์˜ค์…จ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ธธ์„ ์ง€๋„์— ๊ทธ๋ ค๋“œ๋ ค์„œ ๊ธธ์•ˆ๋‚ด๋ฅผ ํ•ด๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ
  • ์ฃผ์š” ๊ธฐ๋Šฅ
    • ์กฐ๋ถ€๋ชจ๋‹˜์˜ ์œ„์น˜ ์‹ค์‹œ๊ฐ„ ์ถ”์ 
    • ๊ธธ์•ˆ๋‚ด๋ฅผ ์œ„ํ•œ ์ €์ž‘๋„๊ตฌ
    • ์ง€๋„์™€ ์บ”๋ฒ„์Šค ๋™๊ธฐํ™”

๐Ÿ“ย ํŒ€ ๊ฐœ๋ฐœ ๋ฌธํ™” ์š”์•ฝโ€‹

ํŒ€4๋ช…์ด FE โ†’ ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹คโ€‹

  • PR์€ ์ตœ์†Œ 2๋ช…์ด approve ํ•ด์•ผํ•œ๋‹ค

โ†’ ๊นƒํ—ˆ๋ธŒ ์•ก์…˜์„ ํ†ตํ•ด PR์ด ๋“ค์–ด์˜ค๋ฉด, ํ™•์ธ์š”์ฒญ ๋ผ๋ฒจ๊ณผ ํ•จ๊ป˜ ๋žœ๋ค์œผ๋กœ ๋ฆฌ๋ทฐ์–ด 2๋ช…์”ฉ ํ• ๋‹น

์ด๋ฏธ์ง€ 1;

๋ฌธ์„œํ™”์— ์‹ ๊ฒฝ์“ฐ์žโ€‹

  • ๋ฌธ์„œ๋ฅผ ์•„์˜ˆ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜์ž. โ‡’ ์ถ”ํ›„ TypeDoc, Storybook, Swagger, JSDoc ๋“ฑ๋„ ์ด์— ํ†ตํ•ฉ ๊ณ„ํš

์„ ๋”ฐ๋ผ๊ธธ๋”ฐ๋ผ

  • storybook ์ž‘์„ฑ
  • TSDoc
  // BottomSheet TSDoc

/**
* `BottomSheet` ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‹จ์—์„œ ์˜ฌ๋ผ์˜ค๋Š” ์‹œํŠธ ํ˜•ํƒœ์˜ UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
*
* @param {IBottomSheetProps} props - `children`์„ ํฌํ•จํ•œ ์ปดํฌ๋„ŒํŠธ ์†์„ฑ
* @param {number} props.minHeight - Bottom Sheet์˜ ์ตœ์†Œ ๋†’์ด๋ฅผ ํ™”๋ฉด ๋น„์œจ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (0.0 - 1.0).
* @param {number} props.maxHeight - Bottom Sheet์˜ ์ตœ๋Œ€ ๋†’์ด๋ฅผ ํ™”๋ฉด ๋น„์œจ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (0.0 - 1.0).
* @param {ReactNode} props.children - Bottom Sheet ๋‚ด๋ถ€์— ๋ Œ๋”๋งํ•  ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค.
* @returns {ReactNode} - ํ•˜๋‹จ ์‹œํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
*
* @remarks
* - ๋“œ๋ž˜๊ทธ ๋™์ž‘์„ ํ†ตํ•ด ์‹œํŠธ๋ฅผ ์—ด๊ณ  ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* - `useBottomSheet` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์น˜ ๋ฐ ๋“œ๋ž˜๊ทธ ๋™์ž‘์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
* - `minHeight`๋Š” Bottom Sheet๊ฐ€ ๋‹ซํžŒ ์ƒํƒœ์˜ ๋†’์ด ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
* - `maxHeight`๋Š” Bottom Sheet๊ฐ€ ์—ด๋ฆฐ ์ƒํƒœ์˜ ์ตœ๋Œ€ ๋†’์ด ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
*
* @example
* ```tsx
* <BottomSheet minHeight={0.5} maxHeight={0.85}>
* <div className="p-4">
* <h2>์˜ˆ์‹œ ์ฝ˜ํ…์ธ </h2>
* <p>BottomSheet์˜ children</p>
* </div>
* </BottomSheet>
* ```
*/
/**
* ์‚ฌ์šฉ์ž ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ปค์Šคํ…€ Hook์ž…๋‹ˆ๋‹ค.
*
* @returns {IGetUserLocation} ์‚ฌ์šฉ์ž ์œ„์น˜ (์œ„๋„, ๊ฒฝ๋„)์™€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
*
* @remarks
* - Geolocation API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
* - ์œ„์น˜๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋ฉด ๊ธฐ๋ณธ ์œ„์น˜ ๋„ค์ด๋ฒ„ 1784 (37.3595704, 127.105399)๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
* - Geolocation API๊ฐ€ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๊ธฐ๋ณธ ์œ„์น˜๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
*
* @example
*
* const { lat, lng, error } = getUserLocation();
*
* if (error) {
* console.error('์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ ์—๋Ÿฌ:', error);
* } else {
* console.log('ํ˜„์žฌ ์œ„์น˜:', lat, lng);
* }
*
*/
  • ๋ฌธ์„œ ์ž‘์„ฑ ํ…œํ”Œ๋ฆฟ ๋งŒ๋“ค๊ธฐ

์ด๋ฏธ์ง€

  • ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ, ํšŒ์˜๋ก, ๋ชจ๋‘ ๊ธฐ๋ก

์ด๋ฏธ์ง€

๐Ÿ“ย ํ•œ ์ฃผ์˜ ๊ณ„ํšโ€‹

๐ŸŽฏย ํŒ€ ์ „์ฒด์˜ ๋ชฉํ‘œโ€‹

  • UI/UX ๊ตฌํ˜„ ๋ฐ ๋ฐฑ์•ค๋“œ ๋กœ์ง ๊ตฌํ˜„ ๋‹ค ํ•ด์„œ, ์ •์ ํŒŒ์ผ๋“ค ์œ„์ฃผ๋กœ ๋ฐฐํฌ
  • ๋‹ค์Œ์ฃผ์—๋Š” ์ง€๋„์™€ ์บ”๋ฒ„์Šค์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋๋‚ด๊ธฐ

๐ŸŽฏย FE ๋ชฉํ‘œโ€‹

  • UI/UX ํ”ผ๊ทธ๋งˆ์— ๋‚˜์˜จ ๋Œ€๋กœ ๊ตฌํ˜„
  • shadcn ๋“ฑ์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ , ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜ํ•˜๋‚˜ ์ง์ ‘ ๊ตฌํ˜„

๐ŸŽฏย BE ๋ชฉํ‘œโ€‹

  • ๋ฐฑ์—”๋“œ API ๊ตฌํ˜„ ๋ฐ ๋‹ค์Œ์ฃผ๋ถ€ํ„ฐ ํ”„๋ก ํŠธ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ์ž‘์—… ๋‹ค ๋๋‚ด๊ธฐ
  • ๋ฐฑ์—”๋“œ ๋ฐฐํฌ

๐Ÿ“ย ๊ณ„ํš์ด ์–ผ๋งˆ๋‚˜ ๋‹ฌ์„ฑ๋˜์—ˆ๋Š”๊ฐ€โ€‹

๐ŸŽฏย FE ๋ชฉํ‘œโ€‹

  • 85ํ”„๋กœ ๋‹ฌ์„ฑ (์„ธ๋ถ€์ ์ธ ๋””ํ…Œ์ผ์€ ์•„์ง ๋ณด์™„์‚ฌํ•ญ์œผ๋กœ ๋‚จ์Œ)
    • ๋”๋ฏธ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋กœ ๋นผ๋‘์–ด์•ผํ•จ
    • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์ ์šฉ โ†’ ๊ฐœ๋ฐœ์ค‘์ธ๊ฒŒ ๋จธ์ง€ ๋˜๋ฉด ์ ์šฉ ์˜ˆ์ •

๐ŸŽฏย BE ๋ชฉํ‘œโ€‹

  • 95ํ”„๋กœ ๋‹ฌ์„ฑ
    • ํ•„์š”ํ•œ ๋ชจ๋“  api ๊ตฌํ˜„ ์™„๋ฃŒ
    • ๋ฐฑ์—”๋“œ ๋ฐฐํฌ ์™„๋ฃŒ (docker + docker compose + nginx + naver cloud server)
    • swagger ๋ฌธ์„œ ์ž‘์„ฑ ์™„๋ฃŒ
    • jenkins๋กœ ๋ฐฐํฌ ์ž๋™ํ™” โ†’ ๊ณ ๋ฏผ์ค‘

์ด๋ฏธ์ง€

  • ๋ฐฑ์—”๋“œ ๋ฐฐํฌ url (swagger ๋ฌธ์„œ)

http://223.130.151.43:3001/api-docs/#/

๐Ÿ“ย FE ๊ฐœ๋ฐœ ๋‚ด์šฉ (ํŽ˜์ด์ง€๋ณ„๋กœ)โ€‹

๐Ÿ’ปย ๋ฉ”์ธํ™”๋ฉด ๊ตฌ์ถ•โ€‹

  • Header, Map โ†’ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
  • bottomsheet
    • storybook
    • TSDoc
  • bottomsheet ๋‚ด๋ถ€ content
    • storybook
    • TSDoc

๐Ÿ’ปย ์„ ๊ทธ๋ฆฌ๊ธฐํ™”๋ฉด ๊ตฌ์ถ•โ€‹

๐Ÿ’ปย ์†๋…€ํ™”๋ฉด ๊ตฌ์ถ•โ€‹

์ด๋ฏธ์ง€ ์ด๋ฏธ์ง€

๐Ÿ’ปย ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ํ™”๋ฉด ๊ตฌ์ถ•โ€‹

  • ์ตœ๋Œ€ 5๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค
    • ์‚ฌ์šฉ์ž3์„ ์‚ญ์ œํ•˜๋ฉด ์‚ฌ์šฉ์ž4๊ฐ€ ์‚ฌ์šฉ์ž3์ด ๋œ๋‹ค

๐Ÿ“ย BE ๊ฐœ๋ฐœ ๋‚ด์šฉโ€‹

DB ํ…Œ์ด๋ธ” ์„ค๊ณ„ ์ˆ˜์ •โ€‹

์™ผ์ชฝ ์‚ฌ์ง„์—์„œ ์˜ค๋ฅธ์ชฝ ์‚ฌ์ง„์œผ๋กœ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

channel ํ…Œ์ด๋ธ”์˜ ๊ฒŒ์ŠคํŠธ ๊ฐ์ฒด ๋ฐฐ์—ด์ด ๋น„ํšจ์œจ์ ์ด๊ณ  ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ํŒ๋‹จ์— ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ด๋ฏธ์ง€

API ๊ตฌํ˜„ ๋ชฉ๋กโ€‹

  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ API
  • ํšŒ์›๊ฐ€์ž… API
  • ์ƒˆ๋กœ์šด ์ฑ„๋„ ์ƒ์„ฑ API
  • ๊ฒŒ์ŠคํŠธ ์ถ”๊ฐ€ API
  • ์ฑ„๋„ ์ •๋ณด ์กฐํšŒ API
  • ๊ฒŒ์ŠคํŠธ ์ •๋ณด ์กฐํšŒ API
  • ์‚ฌ์šฉ์ž๊ฐ€ host์ธ ์ฑ„๋„ ๋ชฉ๋ก ๋ฐ˜ํ™˜ API
// ์ฑ„๋„ ์ •๋ณด
{
"id": "string",
"name": "string",
"host_id": "string",
"guests": [
{
"id": "string",
"name": "string",
"start_location": {
"lat": 0,
"lng": 0
},
"end_location": {
"lat": 0,
"lng": 0
},
"path": [
{
"lat": 0,
"lng": 0
}
],
"marker_style": {
"color": "string"
}
}
]
}

swagger ๋ฌธ์„œ ์ž‘์„ฑโ€‹

์ด๋ฏธ์ง€

- ๋ฐฐํฌ (docker + docker-compose + nginx + ncloud)โ€‹

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'express'

์ฃผ๊ฐ„ ๋ฐฑ๋กœ๊ทธ ํ˜„ํ™ฉโ€‹

์ด๋ฏธ์ง€

- [BE] ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฐ ๊ธฐ๋กโ€‹

โ–ธ ESLint ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๊ธฐ: await์„ for...of ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ โ–ธ PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๊ณ ๋ฏผ: Channel ํ…Œ์ด๋ธ”์— Guests ์ •๋ณด๋ฅผ ํฌํ•จํ• ์ง€ โ–ธ PostgreSQL์—์„œ ์ƒ์„ฑ ์‹œ๊ฐ„ ์ž๋™ ์„ค์ •ํ•˜๊ธฐ (generated_at์˜ NOT NULL ์ œ์•ฝ ์กฐ๊ฑด) โ–ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฒ€์ฆ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๊ธฐ โ–ธ PostgreSQL ์Šคํ‚ค๋งˆ๋กœ ์ธํ•œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ โ–ธ Node.js WebSocket ์—ฐ๊ฒฐ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ

๐Ÿ“ย ๋‹ค์Œ์ฃผ ๋ชฉํ‘œโ€‹

  • ์ง€๋„์™€ ์บ”๋ฒ„์Šค์˜ ์—ฐ๋™
  • ์ €์ž‘๋„๊ตฌ ๊ธฐ๋Šฅ ์™„์„ฑ
  • ๋กœ๊ทธ์ธ