๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ ํด๋ž˜์ŠคIOI ํ”„๋กœ์ ํŠธ ํšŒ๊ณ ๋ก

ํ˜œ๋ฆฐยท2022๋…„ 11์›” 29์ผ
6

Project

๋ชฉ๋ก ๋ณด๊ธฐ
6/8
post-thumbnail

๐Ÿš€ ์†Œ๊ฐœ

2์ฐจ ํ”„๋กœ์ ํŠธ๋Š” ํด๋ž˜์Šค101์„ ๋ชจํ‹ฐ๋ธŒ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ํด๋ž˜์Šค101์€ ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด๋กœ ์ œ์‹œํ•œ ์„œ๋น„์Šค์˜€๋‹ค. ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•จ์—๋„ UI๊ฐ€ ์ง๊ด€์ ์ด๊ณ  ๊น”๋”ํ•ด ๊ฐ€์žฅ ์ธ์ƒ ๊นŠ์—ˆ๋˜ ์„œ๋น„์Šค์˜€๊ธฐ์—, ์ด๋Ÿฐ ์„œ๋น„์Šค๋ฅผ ๋ชจํ‹ฐ๋ธŒ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋ฐฐ์šธ์  ์—ญ์‹œ ๋งŽ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ์ปธ๋‹ค.

ํด๋ž˜์Šค101์—์„œ๋Š” ๊ฐ•์˜ ์ˆ˜๊ฐ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šคํ† ์–ด ์ƒํ’ˆ์„ ๊ตฌ๋งคํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ตฌ๋… ์‹œ์Šคํ…œ๋„ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํฌ๋ฆฌ์—์ดํ„ฐ๊ฐ€ ๋˜์–ด ๊ฐ•์˜๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค๋„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋“ค์—ฌ๋‹ค๋ณด๋‹ˆ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์–ด ์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•ด๋‚˜๊ฐˆ ๋•Œ ๊ฝค ๊ณจ์น˜ ์•„ํŒ ์—ˆ๋‹ค.

1์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ๋Š” ์ฃผ๋กœ ์ƒํ’ˆ์„ ๋‹ด๊ณ  ๊ฒฐ์ œํ•˜๋Š” ํ๋ฆ„์œผ๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ 2์ฐจ ํ”„๋กœ์ ํŠธ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ’ˆ(์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ•์˜!)์„ ๋“ฑ๋กํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ค‘์ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋‚ด๊ณ ์ž ํ–ˆ๋‹ค.

๐Ÿ“† ๊ธฐ๊ฐ„

22.10.04 - 22.10.13

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง ๊ธฐ์ˆ 

  • Front-end
    React styled-component
    โ—ฝ CRA(Create-React-App)์„ ํ†ตํ•œ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…
    โ—ฝ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
    โ—ฝ ESLint, Prettier ์„ค์ •

  • Back-end
    Node.js, Express.js, MySQL

  • Business Tool
    Slack, Trello, Notion



๐Ÿ“ ์ผ์ • ๊ด€๋ฆฌ

์ผ์ • ๊ด€๋ฆฌ๋Š” 1์ฐจ ํ”„๋กœ์ ํŠธ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Trello(ํŠธ๋ ๋กœ)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ ํ–ˆ๋˜ ์ผ์€ ๊ฐ์ž ๋งก์€ ๊ธฐ๋Šฅ์„ ์ •๋ฆฌํ•œ ํ‹ฐ์ผ“๋“ค์„ Backlog์นธ์— ์˜ฎ๊ฒจ๋‘๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์ „, ๋นผ๊ณกํ•œ Backlog์นธ์„ ๋ณด๋ฉด ๊ฐ€์Šด์ด ์›…์žฅํ•ด์ง„๋‹ท,,,

๋งค์ผ 10~11์‹œ ์‚ฌ์ด์— Daily StandUp Meeting์„ ๋น ์ง์—†์ด ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ณ ์ •๋œ ์‹œ๊ฐ„์— ๋‹ค ๊ฐ™์ด ๋ชจ์—ฌ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ƒํ™ฉ์ด๋‚˜ ์˜ˆ์ •๋œ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ณ  ํ•˜๋ฃจ ์ผ์ •์„ ์‹œ์ž‘ํ•ด์„œ์ธ์ง€ ํ‹ฐ์ผ“ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋น„๊ต์  ์ž˜ ์ด๋ฃจ์–ด์กŒ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

ํ‹ฐ์ผ“์ด ๋ฌด์ง€๋ง‰์ง€ํ•˜๊ฒŒ ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ์„ธ๋ถ€ ๊ธฐ๋Šฅ์€ ํ‹ฐ์ผ“ ๋‚ด๋ถ€์˜ ์ฒดํฌ๋ฐ•์Šค๋กœ ๋Œ€์‹ ํ–ˆ๋‹ค. ํ‹ฐ์ผ“์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ์— ์ข‹์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.



โœจ ์ฃผ์š” ๊ตฌํ˜„ ๊ธฐ๋Šฅ

๋‚˜๋Š” ๋ฉ”์ธํŽ˜์ด์ง€์™€ ๊ตฌ๋…์‹ ์ฒญํŽ˜์ด์ง€๋ฅผ ๋‹ด๋‹นํ–ˆ๋‹ค.

1. ์†Œ์…œ ๋กœ๊ทธ์ธ

  • ์นด์นด์˜คํ†ก ์†Œ์…œ ๋กœ๊ทธ์ธ

2. ๋ฉ”์ธ ํŽ˜์ด์ง€

  • nav, footer
  • ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ
  • ๋‹ค์ค‘๋ชจ๋‹ฌ
  • ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜
  • ์ฐœํ•˜๊ธฐ

3. ์ƒ์„ธ ํŽ˜์ด์ง€

  • ์ƒ์„ธ ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • ๋ฆฌ๋ทฐ ๋“ฑ๋ก, ์‚ญ์ œ
  • ๋งํฌ ๋ณต์‚ฌ
  • ์ฐœํ•˜๊ธฐ

4. ํฌ๋ฆฌ์—์ดํ„ฐ ์„ผํ„ฐ ํŽ˜์ด์ง€

  • ํด๋ž˜์Šค ๋“ฑ๋ก
  • ๊ฐ•์˜ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ

5. ๊ฐ•์˜ ์˜์ƒ ํŽ˜์ด์ง€

  • ๋น„๋””์˜ค ์žฌ์ƒ ๋ฐ ์„ ํƒํ•˜๊ธฐ

6. ๊ตฌ๋… ์‹ ์ฒญ ํŽ˜์ด์ง€

  • ๋ ˆ์ด์•„์›ƒ

7. ๊ฒฐ์ œ ํŽ˜์ด์ง€

  • ๋ ˆ์ด์•„์›ƒ

8. ์ฐœ๋ชฉ๋ก ํŽ˜์ด์ง€

  • ์ฐœ๋ชฉ๋ก ์Šฌ๋ผ์ด๋“œ



๐Ÿ’๐Ÿปโ€โ™€๏ธ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ

[ react-icons์˜ ํŽธ๋ฆฌํ•จ ]
์ƒ๋‹จ๋ฐ”์—๋Š” ๊ฒ€์ƒ‰, ํ”„๋กœํ•„, ์ข‹์•„์š”์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์•„์ด์ฝ˜๋“ค์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ „๊นŒ์ง€๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด๋ถ€์— ์ €์žฅํ•ด ์‚ฌ์šฉํ•ด์™”์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ์—ฌ๋Ÿฌ ์•„์ด์ฝ˜ ํŒŒ์ผ๋“ค์ด ๋‹ด๊ธฐ๋Š” ๊ฒƒ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ญ์ƒ ํ•ด์™”์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ฒ˜์Œ react-icons๋ผ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๊ณ  ํŽธ๋ฆฌํ•œ ์ ์ด ๋งŽ์•˜๋‹ค.

react-icons๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์— importํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋‹ค๋ฅธ ์Šคํƒ€์ผ(์ƒ‰์ƒ, ํฌ๊ธฐ ๋“ฑ)์„ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด className์„ ๋ถ€์—ฌํ•˜์—ฌ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค, ์ƒ‰์ƒ์„ ๋‚ด ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊พธ๊ธฐ ํž˜๋“  ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ณด๋‹ค ๊ทธ๋•Œ๊ทธ๋•Œ ์ปค์Šคํ…€ํ•˜๊ธฐ ์ข‹์•˜๋‹ค.

[ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ์˜ ๋ถ„๋ฆฌ ]
Footer ์† ํšŒ์‚ฌ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ๋”ฐ๋กœ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๊ฑฐ๋‚˜, ํ•ด๋‹น ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋”ฐ๋กœ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•  ํ•„์š”์—†์ด, named Export๋กœ ํ•œ ํŒŒ์ผ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

// Footer.jsx
import { INFO_LIST, SOCIAL_LIST } from './infoData';
// infoData.jsx
export const INFO_LIST = [
  {
    id: '0',
    title: '์ด์šฉ์•ฝ๊ด€',
    url: '#',
  }, 
  // ์ดํ›„ ์ƒ๋žต
]
export const SOCIAL_LIST = [
  {
    id: '0',
    title: 'IOI Korea',
    url: '#',
  },
  // ์ดํ›„ ์ƒ๋žต
]



2. ์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ

[ react-slick์„ ์‚ฌ์šฉํ•œ ์บ๋Ÿฌ์…€ ๊ตฌํ˜„ ]
์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”๋ณด๋‹ค ์บ๋Ÿฌ์…€์ด๋ผ๊ณ  ๋งŽ์ด ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์บ๋Ÿฌ์…€์˜ ์˜๋ฏธ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๊ถ๊ธˆํ–ˆ์—ˆ๋‹ค. ์บ๋Ÿฌ์…€์€ ํšŒ์ „๋ชฉ๋งˆ๋ผ๋Š” ๋œป์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ํšŒ์ „๋ชฉ๋งˆ์ฒ˜๋Ÿผ ์ผ๋ จ์˜ ์ฝ˜ํ…์ธ ๋“ค์ด ์ˆœํ™˜ํ•˜๋Š” ์Šฌ๋ผ์ด๋”๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ๋Š” ์ž๊ธฐ์†Œ๊ฐœ ์›นํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ, Vanilla JavaScript๋กœ ๊ตฌํ˜„ํ•œ ์ ์ด ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋กœ๋กœ ์ญ‰ ๋ถ™์—ฌ์„œ ๊ฐ€๋กœ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋งŒํผ ์œ„์น˜๋ฅผ ์ด๋™์‹œ์ผœ์ฃผ์–ด์•ผ๋งŒ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. react-slick์œผ๋กœ๋ถ€ํ„ฐ importํ•ด์˜จ Slider ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์—ฌ๋Ÿฌ ์žฅ์˜ ์ด๋ฏธ์ง€ ๋ฆฌ์ŠคํŠธ๋ฅผ map์œผ๋กœ ๋ฐ˜๋ณต์‹œ์ผœ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด๋œ๋‹ค.

Vanilla JavaScript๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณธ ์ ์ด ์—†๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŽธ๋ฆฌํ•จ์„ ์ด๋ ‡๊ฒŒ ํฌ๊ฒŒ ๋Š๋ผ์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„ํŠผ ๋ชจ์–‘์ด๋ผ๋“ ์ง€ ์Šคํƒ€์ผ์ ์ธ ๋ถ€๋ถ„์„ ๋‚ด ์ž…๋ง›๋Œ€๋กœ ์ปค์Šคํ…€ํ•˜๊ธฐ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ง์ ‘ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์—ญ์‹œ ๋ชจ๋“  ๊ฒƒ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ ๋งˆ๋ จ์ด๊ตฌ๋งŒ!

import Slider from 'react-slick';

<StyledSlider {...settings}>
	{CarouselImgData.map(image => (
		<ImageBox key={image.id}>
			<Image src={image.url} alt="์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋“œ" />
        </ImageBox>
	))}
</StyledSlider>

const StyledSlider = styled(Slider)`
  /* ์ƒ๋žต */
`



3. ๋‹ค์ค‘ ๋ชจ๋‹ฌ ์† ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ

[ ๊ณตํ†ต๋œ ๋ชจ๋‹ฌ์˜ ์ปดํฌ๋„ŒํŠธํ™” ]
๋ฉ”์ธํŽ˜์ด์ง€์—๋Š” ๊ฐ•์˜๋ชฉ๋ก์„ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. Selectbox๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ทธ ๋ฐ‘์— Dropdown์œผ๋กœ ๋ชฉ๋ก์ด ๋‚˜์˜ค๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ชจ๋‹ฌ์— ๋ชฉ๋ก์„ ๋„์šด๋‹ค. ๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ, ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ, ์ •๋ ฌ, ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋‹ฌ์˜ UI๋Š” ๋™์ผํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ชจ๋‹ฌ์„ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ์–ด๋–ค ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ชฉ๋ก์ด ๋ฐ”๋€Œ๋ฏ€๋กœ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ! ์ด๋Š” ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ„์˜ props๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉฐ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// *Main ์ปดํฌ๋„ŒํŠธ*
<Container>
  <FilterAndSortBox /> // ๋ฉ”์ธ ์นดํ…Œ๊ณ ๋ฆฌ
  <FilterAndSortBox /> // ์„œ๋ธŒ ์นดํ…Œ๊ณ ๋ฆฌ
  <FilterAndSortBox /> // ์ •๋ ฌ
</Container>

// *FilterAndSortBox ์ปดํฌ๋„ŒํŠธ*
<FilterAndSortBox>
    <CategoryWrap/> // SelectBox
	<FilterAndSortModal/> // ๋ชจ๋‹ฌ
</FilterAndSortBox>

[ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ ]
๊ฐ•์˜ ๋ชฉ๋ก์„ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋”ฐ๋ผ ํ•„ํ„ฐ๋งํ•˜๊ณ , ๊ฐ€๊ฒฉ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์€ filterํ˜น์€ sort๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—์„œ๋„ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ์„œ๋น„์Šค๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์›นํŽ˜์ด์ง€๋ฅผ ๋ณด๋ฉด ํ•„ํ„ฐ๋ง์„ ํ•˜๊ฑฐ๋‚˜ ์ •๋ ฌ์„ ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ชจ์Šต์„ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ Networkํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŽ˜์ด์ง€์˜ URL์— https://test.com/?category=0123456&sort=recommendOrder์—์„œ๋„ ์ •๋ ฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌํ•  ๋•Œ๋งˆ๋‹ค searchParams๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด URL์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , searchParams๊ฐ€ ๋ฐ”๋€๋‹ค๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— searchParams๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

// *๋†’์€ ๊ฐ€๊ฒฉ์ˆœ ์ •๋ ฌ*
const sortByHighPrice = e => {
	setBoxName(e.target.innerText); // ์„ ํƒํ•œ ์ •๋ ฌ์„ selectbox ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
	searchParams.set('sort', 'costHigh'); // searchParams๋ฅผ ํ†ตํ•ด sort=costHigh ์ถ”๊ฐ€ํ•˜๊ธฐ
	setSearchParams(searchParams);
	setMainModalOpen(prev => !prev); // ์ •๋ ฌ ์„ ํƒ ํ›„ ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ
};

// *๋ฉ”์ธ ํŽ˜์ด์ง€*
const fetchURL = searchParams.toString();

useEffect(() => {
  fetch(`${BASE_URL}/main?${fetchURL}`)
    .then(res => res.json())
    .then(data => {
    setClassList(data.getFilter);
    });
}, [searchParams]);

์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด, ๊ฐ€๊ฒฉ ๋†’์€ ์ˆœ ์ •๋ ฌ์„ ํด๋ฆญํ–ˆ์„ ์‹œ ํŽ˜์ด์ง€ URL์— sort=costHigh๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.



4. ํŽ˜์ด์ง€๋„ค์ด์…˜

ํŽ˜์ด์ง€๋„ค์ด์…˜ ์—ญ์‹œ ์•ž์„  ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง๊ณผ ์ •๋ ฌ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ searchParams๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด URL์˜ offset๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ•์˜๋ชฉ๋ก์„ 12๊ฐœ์”ฉ ๋ณด์ด๋„๋ก limit์„ ์„ค์ •ํ•œ๋‹ค๋ฉด, ์ฒซ ํŽ˜์ด์ง€์˜ offset์€ 0์ด๋˜๊ณ  ๊ทธ ๋‹ค์Œ ํŽ˜์ด์ง€์˜ offset์€ 12, ๋˜ ๊ทธ๋‹ค์Œ ํŽ˜์ด์ง€์˜ offset์€ 24๊ฐ€ ๋œ๋‹ค.

// Main ํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ
const LIMIT = 12;
const movePage = pageNumber => {
	searchParams.set('limit', LIMIT);
	searchParams.set('offset', (pageNumber - 1) * LIMIT);
	setSearchParams(searchParams);
};

return (
	<>
    	<BtnContainer>
        	<PageBtn onClick={() => movePage(1)}>1</PageBtn>
        	<PageBtn onClick={() => movePage(2)}>2</PageBtn>
        	<PageBtn onClick={() => movePage(3)}>3</PageBtn>
    	</BtnContainer>
	</>
)

ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ „๋ถ€ ๋‹ค๋ฅธ URL์— ์š”์ฒญํ•ด์•ผํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋„ ๋งŽ์•„ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋น„ํšจ์œจ์ ์ด์—ˆ์„ ๊ฒƒ์ด๋‹ค. searchParams๋ฅผ ํ†ตํ•ด URL์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ฐ”๊พธ๊ณ , ์ด๋ฅผ ํ† ๋Œ€๋กœ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด ์ข‹์•˜๋‹ค.



5. ์ฐœํ•˜๊ธฐ

๊ฐ€์žฅ ์ฒ˜์Œ ๊ฐ•์˜ ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, access token์ด LocalStorage์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ƒํƒœ, ์ฆ‰ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ฐœํ•œ ๊ฐ•์˜ ๋ชฉ๋ก์— ํ•˜ํŠธ๊ฐ€ ์ฑ„์›Œ์ง„ ์ƒํƒœโค์—ฌ์•ผ ํ–ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ฐœํ•œ ๊ฐ•์˜๋ชฉ๋ก์„ ๋ฐ›์•„์™”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฐœํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ๊ฐ•์˜ ๋ชฉ๋ก์„ ์ฐœํ•˜๊ณ , ์ฐœ์„ ์‚ญ์ œํ–ˆ๋Š”์ง€ ์„œ๋ฒ„์— POST ๋ฐ DELETE์š”์ฒญ์„ ๋ณด๋‚ด ๋งˆ์ดํŽ˜์ด์ง€ ์ฐœํ•˜๊ธฐ ๋ชฉ๋ก์—์„œ ์ฐœํ•œ ๊ฐ•์˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.



๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ

2์ฐจ ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ๋‚ ์€ ์ ˆ๋Œ€ ์žŠ์„ ์ˆ˜ ์—†๋Š” ํ•˜๋ฃจ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ์‹ถ์—ˆ๋‹ค.

2์ฐจ ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ๋‹น์ผ์ธ ์ƒˆ๋ฒฝ 2์‹œ๊ฐ€ ๋˜์–ด์„œ์•ผ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌ์ง“๊ธฐ ๋ฐ”๋น ์„œ ๋ฐœํ‘œ๋Š” ์ƒ๊ฐํ•  ๊ฒจ๋ฅผ๋„ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐœํ‘œ ์ž๋ฃŒ๋Š” ๋ฌผ๋ก ์ด๊ณ  ๋ฐœํ‘œ ์ค€๋น„๊ฐ€ ํ•˜๋‚˜๋„ ๋˜์–ด์žˆ์ง€ ์•Š์€ ์ƒํ™ฉ์ด์—ˆ๋˜ ๊ฒƒ. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋Ÿฐ ๋ฐœํ‘œ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๋ฐœํ‘œ์ž๋Š” ๋ˆ„๊ตฌ...? PM์€ ๋ˆ„๊ตฌ?

๋‹น์žฅ ์˜ค์ „ 10์‹œ๊ฐ€ ๋ฐœํ‘œ์˜€๋‹ค. 2์ฃผ๊ฐ„ ๋ฐค๋‚ฎ์—†์ด ๋‹ฌ๋ ค์˜จ ๋งˆ์ง€๋ง‰๋‚ ์ด์—ˆ๊ธฐ์— ์ฒด๋ ฅ์ ์œผ๋กœ ์‰ฝ์ง€ ์•Š์€ ์ƒํ™ฉ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ˆ๋Œ€ ์–ด์˜๋ถ€์˜ ๋Œ€์ถฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‹ค. ์–ด๋–ค ์ผ์„ ํ•˜๋“  ์œ ์ข…์˜ ๋ฏธ๋ฅผ ๊ฑฐ๋‘์–ด์•ผํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ญ์ƒ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ์— ์ž ๋„ ์•ˆ์™”๋‹ค. ํ•˜๋ฃจ์ •๋„ ์•ˆ์ž๋„ ๊ดœ์ฐฎ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๋ฐœํ‘œ ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐœํ‘œ ์—ฐ์Šต๊นŒ์ง€ ๋๋งˆ์ณค๋‹ค. ์ค€๋น„ํ•œ๊ฒŒ ์žˆ์œผ๋‹ˆ ๋‘๋ ค์šธ๊ฒŒ ์—†์—ˆ๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋ฐœํ‘œ๋Š” ์„ฑํ™ฉ๋ฆฌ์— ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ๋‹ค.๐Ÿ‘๐Ÿป๐Ÿ‘๐Ÿป๐Ÿ‘๐Ÿป
(1์ฐจ ๋•Œ๋Š” ๋ฐœํ‘œํ•˜๋Š” ์‚ฌ์ง„ ์ฐ์–ด์ฃผ์‹œ๋˜๋Ž…..2์ฐจ ๋•Œ๋Š” ์—†๋‹น..๊ดœ์‹œ๋ฆฌ ์„ญ์„ญ..)

์ด ๋‚ ์˜ ๊ฒฝํ—˜์€ ๋‚ด๊ฒŒ ๊ทผ๊ฑฐ์žˆ๋Š” ์ž์‹ ๊ฐ์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ์ƒํ™ฉ์ด๋“  ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ๋‚ด๊ฐ€ ๋งก์€ ์ผ์„ ํ•ด๋‚ด๋Š”, ๊ทธ๊ฒƒ๋„ ์ž˜ ํ•ด๋‚ด๋Š” ์‚ฌ๋žŒ์ด๋ผ๋Š” ๊ทผ๊ฑฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๊ณ  ์ด๋กœ ์ธํ•ด ์ž์‹ ๊ฐ์ด ์ƒ๊ฒผ๋‹ค. ๊ทธ๋ž˜์„œ์ธ์ง€ ์งง๋‹ค๋ฉด ์งง์•˜๊ณ  ๊ธธ๋‹ค๋ฉด ๊ธด 2์ฃผ๊ฐ„์˜ 2์ฐจ ํ”„๋กœ์ ํŠธ๋Š” ๋‚ด๊ฒŒ ์ •๋ง ๋œป๊นŠ์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค.



๐Ÿ‘๐Ÿป ๋งˆ์น˜๋ฉฐ

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

profile
FE Developer

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 11์›” 29์ผ

์šธ๋ฆผ์ด ์žˆ๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 11์›” 29์ผ

๋งˆ์น˜๋Š” ๊ธ€์ด ๋„ˆ๋ฌด ๋ฉ‹์žˆ๋„ค์šฉโœจ๐Ÿ‘ ์ž๊ทน ๋ฟœ๋ฟœ ๋ฐ›๊ณ  ๊ฐ‘๋‹ˆ๋‹นใ…Žใ…Ž

1๊ฐœ์˜ ๋‹ต๊ธ€