๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ‰Project ํšŒ๊ณ 

Project#1 | 4bsop ํšŒ๊ณ  | feat.๊ฒ€์ƒ‰๊ธฐ๋Šฅ, Total Price

by pajiyeee 2023. 4. 17.

 

์‹œ์ž‘ํ•  ๋•Œ ์•„์ง ์ค€๋น„๋˜์žˆ์ง€ ์•Š๋‹ค๋Š” ์ƒ๊ฐ์— ๋‘๋ ค์›€์ด ์ปธ์ง€๋งŒ ๋‚ด๊ฐ€ ์˜คํžˆ๋ ค ๋ฐฐ์›Œ๊ฐ€๋Š” ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•˜๋˜ ํฌ๋น„์† ํ”„๋กœ์ ํŠธ๋‹ค.
์ฒ˜์Œ์œผ๋กœ ํŒ€ ํ”„๋กœ์ ํŠธ ํ•ด๋ดค๋Š”๋ฐ ์ด๋ฒˆ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์•ž์œผ๋กœ๋„ ํ”„๋กœ์ ํŠธ์— ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•ด์•ผ๊ฒ ๋‹ค.
 
์šฐ๋ฆฌ ํŒ€์€ git branch์—์„œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ ธ์™€ 4๊ฐœ์˜ branch๊ฐ€ ํ•จ๊ป˜ํ•œ๋‹ค๋Š” ๋œป์œผ๋กœ 4branch๋ผ ํŒ€๋ช…์„ ์ •ํ–ˆ๋‹ค.

 

4bsop ๋ทฐํ‹ฐ ๋ธŒ๋žœ๋“œ ์›น์„œ๋น„์Šค

Aesop ์˜จ๋ผ์ธ ์‚ฌ์ดํŠธ๋ฅผ ๋ชจํ‹ฐ๋ธŒ

 

๊ธฐ๊ฐ„ & 4branch ๋ฉค๋ฒ„

  • 2023.04.03 ~ 2023.04.14 (2์ฃผ)
  • ๊น€์˜์šด(FE), ๋ฐ•์ง€์—ฐ(FE), ์žฅ๋‹คํฌ(BE, Project Manager), ์™•๊ด‘ํ˜„(BE, Product Manager)

 

ํ”„๋กœ์ ํŠธ ์„ ์ • ์ด์œ 

  • Aesop์€ ๋ฐฐ๊ฒฝ์ด ์—†๋Š” ์ƒํ’ˆ ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งˆ์น˜ ์ œํ’ˆ์„ ์˜คํ”„๋ผ์ธ์—์„œ ์‡ผํ•‘ํ•˜๊ณ  ์žˆ๋Š” ๋“ฏํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ธŒ๋žœ๋“œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ถ€๋ถ„๋“ค์„ ๋ฒค์น˜ํ•˜๋ฉฐ, ์‡ผํ•‘์— ํ•„์ˆ˜์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ์ค‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์–ด ์„ ํƒ

 

์‚ฌ์šฉํ•œ ๊ธฐ์ˆ 

์šฐ๋ฆฌ๊ฐ€ ํด๋ก ํ•œ Aesop ์›น์‚ฌ์ดํŠธ๋Š” ๋กœ๋”ฉ์ด ๊ธธ๊ณ , ๋กœ๊ทธ์ธํ•  ๋•Œ๋„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์•„ ๋ถˆํŽธํ•˜๊ฒŒ ๋А๊ปด์กŒ์—ˆ๋Š”๋ฐ, 
์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์—ฐ์Šตํ–ˆ๋˜ ๊ธฐ์ˆ ๋“ค์˜ ๋น ๋ฅธ ์†๋„๋ฅผ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • SPA(Single Page Application) ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ–ˆ๋Š”๋ฐ, ์—ฌ๋Ÿฌ web page ๋ฅผ ํ•˜๋‚˜์˜ Html ์— ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด UI ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง ๋œ๋‹ค. 
  • React๋Š” ํ™”๋ฉด ๋ณ€ํ™”๋ฅผ ๊ฐ€์ƒ์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ค์ œ DOM์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์—ฐ์‚ฐ ์–‘์„ ์ค„์—ฌ์ฃผ์–ด ํšจ์œจ์ ์ด๊ณ  ์ƒ์‚ฐ์ ์ธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค. JSX๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • SCSS๋Š” ๊ธฐ์กด CSS์—์„œ ๋” ๊ฐ€๋…์„ฑ๊ณผ ์žฌํ™œ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์–ธ์–ด๋กœ ํŽ˜์ด์ง€์ž‘์—…์ด ๋งŽ์„ ๊ฒฝ์šฐ ํšจ์œจ์ ์ด๋‹ค.

 

 

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์ œํ’ˆ ๊ฒ€์ƒ‰
  • ์ œํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€
  • ์ฃผ๋ฌธ ๋‚ด์—ญ

 
์ด ์ค‘์— ์ œํ’ˆ๊ฒ€์ƒ‰๊ณผ ์ฃผ๋ฌธ๋‚ด์—ญ์—์„œ ๋‹ค์‹œ ๋˜์งš์–ด๋ณด๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋“ค์ด ์žˆ์–ด ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.
 

โถ ๊ฒ€์ƒ‰

 

๊ตฌํ˜„ํ–ˆ๋˜ ํŽ˜์ด์ง€ ์ค‘์— ๋น„๊ต์  ์‹œ๊ฐ„์„ ๋งŽ์ด ์Ÿ์€ ๊ฒ€์ƒ‰

 

๊ฒ€์ƒ‰์—์„œ๋Š” ์ด 2๊ฐœ์˜ ํ’€์–ด์•ผ ํ•  ๊ณผ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ

1. ๊ฒ€์ƒ‰ ํ™”๋ฉด ์ง„์ž… ์‹œ, default ๋กœ ๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๊ฒŒ ํ•˜์ž

2. ๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ๋ฅผ ํ˜ธ๋ฒ„ํ•˜๋ฉด ์ธก๋ฉด์— ํ•ด๋‹นํ•˜๋Š” ์ƒํ’ˆ์˜ ์ด๋ฏธ์ง€์™€ ์ƒํ’ˆ ์ƒ์„ธ๋กœ ์ด์–ด์ง€๋Š” ๋ฒ„ํŠผ์ด ๋‚˜์˜ค๊ฒŒ ํ•˜์ž

 

๋จผ์ € ๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ๊ฐ€ default๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
 

const [searchKeyword, setSearchKeyword] = useState('');

function itemSearch(e) {
  setSearchKeyword(e.target.value);
}

<input value={searchKeyword} onChange={itemSearch}/>

<SearchList/>

 
input ์˜ value๋Š” searchKeyword,
๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ๊ฐ’ ๋ฆฌ์ŠคํŠธ๋Š” <SearchList/>๋กœ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฌถ์–ด์คฌ๋‹ค.

์ด๋Ÿฐ์ €๋Ÿฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ดค์ง€๋งŒ ์กด์žฌ๊ฐ์ด ํ™•์—ฐ,,๐Ÿ˜ฑ
์ฒ˜์Œ์— ์กฐ๊ฑด๋ฌธ์„ ์จ์•ผํ•  ๊ฑฐ ๊ฐ™๊ธดํ•œ๋ฐ.. ํ•˜๋‹ค๊ฐ€

SearchList์ปดํผ๋„ŒํŠธ๊ฐ€ searchKeyword์˜ ๊ธธ์ด๊ฐ€ 0๋ณด๋‹ค ํด ๋•Œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋„๋ก &&์—ฐ์‚ฐ์ž๋ฅผ ์ผ๋‹ค.
๊ทธ๋žฌ๋”๋‹ˆ ์ฒ˜์Œ์— ๊ฒ€์ƒ‰์–ด๊ฐ€ ์•ˆ ๋‚˜์˜ค๋Š” ์ƒํƒœ์—์„œ input์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ƒํ’ˆ์ด๋ฆ„ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œจ๋Š” ํ˜•ํƒœ๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!
 

{searchKeyword.length >0 && <SearchList/>}



 
์ด์ œ 2๋ฒˆ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐ€๋ณด๋ฉด,
๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ์˜ ๊ฒ€์ƒ‰์–ด๋“ค์„ ํ˜ธ๋ฒ„ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ์ƒํ’ˆ ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฑฐ์˜€๋Š”๋ฐ
ํ˜ธ๋ฒ„ํ•˜๋ฉด ์ƒํ’ˆ์ด์ง€์™€ ๋ฒ„ํŠผ์ด ๋œจ๊ธด ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์–ด๋ฅผ ํ˜ธ๋ฒ„ํ•˜๋ฉด ์ƒํ’ˆ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์ด ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๊ทธ ์œ„์— ๊ณ„์† ๋ˆ„์ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

๋ถˆ๋กœ๊ทธ๊ธ€ ์“ธ ๋•Œ๋ฅผ ์œ„ํ•ด์„œ ์—๋Ÿฌ ํ™”๋ฉด์„ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ์ฐ์–ด๋†”์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด..
 
 

    <div className="searchList">
      {searchList.length ? (
        searchList.map(item => {
          return (<SearchItem className="searchItem" key={item.id} item={item} />)})) 
          : (<p className="noResult">๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</p>)}
    </div>
  );
}

 
๋จผ์ € <SearchList />๋ฅผ map ๋Œ๋ ค ๊ฒ€์ƒ‰์–ด ํ•˜๋‚˜๊ฐ€ <SearchItem /> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค.
 

function SearchItem({ item }) {
  const [isHover, setIsHover] = useState(false);
  
  return (
    <div className="searchItem" onMouseEnter={()=>{setIsHover(true)}}>
      <div id={item.id}>
        {isHover && <HoverItemView item={item}}
        {item.name} //์ƒํ’ˆ๊ฒ€์ƒ‰์–ด ๋ฆฌ์ŠคํŠธ์˜ ํ•˜๋‚˜์˜ ์ƒํ’ˆ์ด๋ฆ„
      </div>
    </div>
  );
}

 
item์„ props๋กœ ๋ฐ›์€ <SearchItem />์—์„œ 
๊ฐ๊ฐ์˜ item ์˜ ์ด๋ฆ„์„ ํ˜ธ๋ฒ„ํ•˜๋ฉด, ํ•ด๋‹นํ•˜๋Š” ์ƒํ’ˆ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์ด ์žˆ๋Š” <HoverItemView /> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.
 

function HoverItemView({ item, showProduct }) {
  const { name, url } = item;

  return (
    <div className="hoverItemView">
      <img />
      <button />
    </div>
  );
}

 
<SearchList />์•ˆ์— <SearchItem />,
<SearchItem /> ์•ˆ์—  <HoverItemView />์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค.
 
์—ฌ๊ธฐ์„œ ๋จผ์ € 
onMouseRemove ์ด๋ฒคํŠธ๋ฅผ ์จ์„œ ๋ˆ„์ ๋˜์ง€ ์•Š๊ณ  ์ƒํ’ˆ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์ด ํ•˜๋‚˜์”ฉ๋งŒ ์ถœ๋ ฅ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

<div className="searchItem" onMouseEnter={()=>{setIsHover(true)}} onMouseLeave={() => {setIsHover(true)}}>//onMouseLeave์ด๋ฒคํŠธ ์ถ”๊ฐ€

 
๊ทผ๋ฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ๋˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹คใ… 
์ƒํ’ˆ ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์ชฝ์œผ๋กœ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋ฉด ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๊ฑฐ์˜€๋‹ค.
HoverItemView ์ปดํฌ๋„ŒํŠธ์˜ ์˜์—ญ์„ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์ƒํ’ˆ์ด๋ฆ„์ด ๋œจ๋Š” ๊ณณ๊นŒ์ง€ ์ฐจ์ง€ํ•˜๊ฒŒ ํ•ด๋ณด๊ณ  ์ด์ƒํ•˜๊ฒŒ ๋’ค์—‰์ผœ๋ฒ„๋ฆฐ ์ฝ”๋“œ์™€ ํ™”๋ฉด์„ ๋งˆ์ฃผํ•˜๋‹ค๊ฐ€
onMouseEnter์ด๋ฒคํŠธ๋ฅผ ํ˜ธ๋ฒ„ํ•œ ์ƒํ’ˆ์ด๋ฏธ์ง€์™€ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ณณ์—๋„ ๊ฑธ์–ด์ฃผ์–ด ํ•ด๋‹น ์ด๋ฏธ์ง€์— ๊ฐ€๋„ ํ˜ธ๋ฒ„ํ•œ ์ƒํƒœ๊ฐ€ ๋˜๊ฒŒ๋” ํ•ด์ค„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
 

<div onMouseEnter={()=>{setIsHover(true)}} onClick={moveItemPage}>
  <img />
  <button />
</div>

 
 
 

โท ์ฃผ๋ฌธ๋‚ด์—ญ์„œ

์ฃผ๋ฌธ ๋‚ด์—ญ์„œ์—์„œ๋Š”  ์ฃผ๋ฌธํ•œ ์œ ์ €์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฑฐ์˜€๋‹ค. 

์—ฌ๊ธฐ์„œ JSONํŒŒ์ผ๋กœ ๋˜๋ฉด์„œ ์ŠคํŠธ๋ง์œผ๋กœ ๋˜์–ด ๋“ค์–ด์˜จ ๋ฐฐ์—ด/๊ฐ์ฒด๋ฅผ ์›๋ž˜์˜ ๋ฐฐ์—ด/๊ฐ์ฒด๋กœ ํ˜•๋ณ€ํ™˜ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฌธ์ œ ํ•˜๋‚˜,
(๋žฉํƒ‘์˜ ๋ฌธ์ œ์˜€๋˜ ๊ฑฐ ๊ฐ™์€๋ฐ, ๋‚˜์ค‘์—” ๋ฐฑ์—”๋“œ ๋ถ„๋“ค์ด ๊ณ ์ณ์„œ ์ŠคํŠธ๋ง์—†๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ด  )
๋ฐฐ์—ด ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ ์ฃผ๋ฌธ ์ƒํ’ˆ ๋ชฉ๋ก์˜ ๊ฐ€๊ฒฉ๊ณผ ์ˆ˜๋Ÿ‰์„ ๊ณ„์‚ฐํ•ด์„œ ํ•ฉ๊ณ„๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 
๋ฐฑ์—”๋“œ์—์„œ ๋“ค์–ด์˜ฌ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ์ด๋‹ค.

"orderInfo": {
	"orderItems": "[{\"size\": null, \"price\": null, \"quantity\": null, \"productName\": null}]",
}

 
์•„์ดํ…œ์˜ ๊ฐ€๊ฒฉ๊ณผ ์ˆ˜๋Ÿ‰์€ orderInfo ๊ฐ์ฒด ์•ˆ์— oderItems ๋ฐฐ์—ด ์•ˆ์— ๊ฐ๊ฐ์˜ ์ƒํ’ˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์˜ price์™€ quantity ๋กœ ๋˜์–ด ์žˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ useEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์น˜ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์†ํ•ด์„œ ๋นˆ ๊ฐ์ฒด๋กœ ๋œจ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. 
๋‚˜๋Š” ์ด๋Ÿด ๋•Œ๋งˆ๋‹ค ๊ฐ’์ด ์•ˆ ๋‚˜์˜ค๋‹ˆ๊นŒ ๋งตํ•‘์„ ๋Œ๋ ธ๋˜ ๊ฑฐ ๊ฐ™๋‹คโ€ฆ ๊ทธ๋Ÿฌ๋ฉด ์ผ๋‹จ ๋œจ๊ธฐ๋ผ๋„ ํ•˜๋Š”๋ฐ ์ด๊ฑด ์ž„์‹œ๋ฐฉํŽธ์ผ๋ฟ์ด๋ผ๊ณ  ํ•จโ€ฆ๐Ÿซ 

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํŒ€์›์—๊ฒŒ ์–ป์€ ๊ฟ€ํŒ์ด ์žˆ๋Š”๋ฐ optional chaining
'?' ์•ž์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ undefined/ null ์ด๋ฉด ์ผ๋‹จ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. 
๋ Œ๋”๋ง์ด ๋๋‚˜๊ณ  ๋‚œ ํ›„ orderInfo ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” '?' ๋’ค์— ์žˆ๋Š” ๋Œ€์ƒ์„ ์‹คํ–‰ํ•œ๋‹ค.
&&์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•œ๋ฐ ๋” ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฑฐ ๊ฐ™๋‹ค.
 

orderinfo?.orderItems

 
์ €๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜จ orderItems ๊ฐ€ ์ŠคํŠธ๋ง์œผ๋กœ ๋ฌถ์—ฌ ์žˆ์–ด ๊ฐ์ฒดํ˜•ํƒœ๋กœ ๋‹ค์‹œ ํ˜•๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.
orderItems๋ฅผ orderItemString ์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  JSON.parse() ๋ฅผ ์จ์„œ ํ˜•๋ณ€ํ™˜์„ ์‹œ์ผฐ๋‹ค. 
๊ทธ๋ฆฌ๊ณ  orderItemsArray๋ผ๋Š” ๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ˜•๋ณ€ํ™˜์‹œํ‚จ orderItems ๋ฐฐ์—ด์„ ๋‚˜์—ด์‹œํ‚จ๋‹ค.
 

let orderItemsArray = [];
const orderItemsString = orderInfo?.orderItems;

if (orderItemsString) {
  [...orderItemsArray] = JSON.parse(orderItemsString);
}

 
 
์—ฌ๊ธฐ์„œ ์ด์ œ ๊ณ„์‚ฐ์„ ํ•ด์•ผ ํ•œ๋‹ค.
์ƒํ’ˆ ๋ชฉ๋ก์— ๋”ฐ๋ผ ๊ฐ€๊ฒฉ๊ณผ ๊ตฌ๋งคํ•˜๋Š” ์ˆ˜๋Ÿ‰์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ๊ฐ๊ฐ์˜ price์™€ quantity๋ฅผ ๊ณฑํ•˜๊ณ ,
๊ณฑํ•œ ๊ฐ’์„ ๋ชจ์•„ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
์ฒ˜์Œ์— ์ด ํ•ฉ๊ณ„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ map ์„ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ total์„ ๊ตฌํ•˜๋Š”๋ฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.
.reduce() ์ธ๋ฐ, ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์—์„œ ๊ณ„์‚ฐํ•˜์—ฌ ๋ˆ„์ ๋œ ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
 

๋ฐฐ์—ด.reduce(๋ˆ„์ ๊ฐ’, ํ˜„์žฌ๊ฐ’) => {return ๊ฒฐ๊ณผ}, ์ดˆ๊ธฐ๊ฐ’);

 
์ด๊ฑธ ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์ดํ•ฉ์„ ๊ตฌํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์จ์•ผ ํ–ˆ๋‹ค.
 

let totalAmount = [];

totalAmount = orderItemsArray.reduce(
  (accumulator, currentValue) =>
    accumulator + currentValue.price * currentValue.quantity,
  0
);

 
์ดˆ๊ธฐ๊ฐ’์„ ๋จผ์ € 0์›์œผ๋กœ ์„ค์ •ํ•˜๊ณ , accumulator๋ผ๋Š” ๋ˆ„์ ๊ฐ’์—  ํ˜„์žฌ ๊ณ„์‚ฐํ•  ๊ฐ’์„ ๋”ํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ ๋„์ถœ๋œ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐฐ์—ด์€ totalAmount ๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. 
 
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ totalAmount๊ฐ€ '000.00'์˜ ์†Œ์ˆ˜์  ํ˜•ํƒœ๋กœ ๋˜์žˆ๊ธฐ ๋•Œ๋ฌธ์—
์ •์ˆ˜๋กœ ๋ฐ”๊พธ๊ณ  ์•ž์— 'โ‚ฉ'์„ ๋ถ™์ด๊ณ  toLocaleString() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋งž์€ ๊ธˆ์•ก ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
๊ทธ๋Ÿผ ์„ฑ๊ณต
 

 {`โ‚ฉ ${Math.floor(totalAmount).toLocaleString()}`}

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

์ข‹์•˜๋˜ ์ 

  • ์•„์นจ๋งˆ๋‹ค stand-up meeting์œผ๋กœ 30๋ถ„ ์ •๋„ ์งง๊ฒŒ ์–ด์ œ ํ•œ ์ผ, ์˜ค๋Š˜ ํ•  ์ผ์„ ํšŒ์˜ํ•œ ๊ฒƒ
  • 1์ฃผ์ฐจ sprint ํšŒ๊ณ ํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋А ์ •๋„ ์ง„ํ–‰๋๋Š”์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฆฌ๋งˆ์ธ๋“œํ•จ. (trello๊ฐ€ ๋„์›€์ด ๋งŽ์ด ๋˜์—ˆ๋‹ค.)
  • ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๋ฉด์„œ ๋ฐฑ์—”๋“œ์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋“  ํ™”๋ฉด์— ๋“ค์–ด์™€์ง€๋Š” ๊ฒƒ์„ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋™์ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ƒํ’ˆ๋“ค์„ ํ™”๋ฉด์— ๊ตฌํ˜„ํ•   ์ˆ˜ ์žˆ์—ˆ๋˜ ์ .
  • ๋กœ๊ณ ์™€ ์ƒํ’ˆ์„ ์ œ์ž‘ํ•˜๋ฉด์„œ ์šฐ๋ฆฌ๋งŒ์˜ ์ƒํ’ˆ๊ณผ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋˜ ์ .
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๊ตฌ๋‚˜๋ฅผ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ .
  • ํ†ต์‹ ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋Š” ํ™”๋ฉด ๊ตฌํ˜„์ด ๋  ๋•Œ๋งˆ๋‹ค ํ†ต์‹ ์„ ๊ณ„์† ์‹œ๋„ํ–ˆ๋˜ ์ 

 

์•„์‰ฌ์šด ์ 

  • ๋ฐฑ์—”๋“œ ํŒ€์›๊ณผ ์†Œํ†ต์˜ ๋ถ€์žฌ

๊ฒ€์ƒ‰ํŽ˜์ด์ง€์—์„œ ๋ฐฑ์—”๋“œ๊ฐ€ ์ž‘์—…ํ•œ ๊ฒ€์ƒ‰ API๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ณ , ์ „์ฒด ์ƒํ’ˆ API๋ฅผ ํŒจ์น˜ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
๋ฐฑ์—”๋“œ๊ฐ€ ์ค€๋น„ํ•ด๋‘๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ž˜ ํŒŒ์•…ํ•˜์ž
 

  • ์ฒ˜์Œ์—๋Š” ๋นจ๋ฆฌ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ธ‰ํ•œ ๋งˆ์Œ์— ์—ญํ•  ๋ถ„๋‹ด์ด ์ œ๋Œ€๋กœ ์•ˆ ๋˜์–ด์„œ ์ง„ํ–‰๋˜์—ˆ๋˜ ์ .

์—ญํ•  ๋ถ„๋‹ด์ด ์ž˜ ์•ˆ ๋˜์–ด ์žˆ์–ด์„œ ๋‹ค๋ฅธ ํŒ€์›๋ถ„์—๊ฒŒ ์ž‘์—…ํ•  ๋ถ€๋ถ„๋“ค์ด ๋ชฐ๋ ค ์žˆ์—ˆ๋‹ค.
์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ์ž ๋งก์•„์„œ ํ•  ํŽ˜์ด์ง€๋ฅผ ์ •ํ•ด์„œ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
 

  •  ๊ตฌํ˜„ ๊ณผ์ •์„ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ์ฐ์–ด๋†“์ง€ ๋ชปํ•œ ์ 

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


์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์€ ์ 

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ์ด๋‚˜ ํ•„ํ„ฐ ๊ธฐ๋Šฅ์„ ์‹œ๋„ํ•ด๋ณด์ง€ ๋ชปํ•ด์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์–ด๋ ต๋”๋ผ๋„ ๋„์ „ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.
  • ๋™์ ๋ผ์šฐํŒ…๊ณผ fetch ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์•„์ง ๋ถ€์กฑํ•˜์—ฌ ๊ณต๋ถ€๋ฅผ ๋” ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 


๋งˆ๋ฌด๋ฆฌ

๊ฐ™์ด ํŒ€ํ”„๋กœ์ ํŠธํ•˜๋ฉด์„œ ์„œ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋А๊ผˆ๋‹ค.
์šฐ๋ฆฌ ํŒ€์ด ์ž˜ํ–ˆ๋˜ ๊ฑด API๊ฐ€ ์žˆ๋Š” ํ™”๋ฉด์ด ๋‹ค ๋งŒ๋“ค์–ด์ง€๊ณ  ๋‚˜๋ฉด ํ†ต์‹ ์„ ์„œ๋กœ ๊ทธ ๋•Œ ๊ทธ ๋•Œ ํ•ด๋ณด์•˜๋‹ค๋Š” ๊ฑฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜์ค‘์— ํ™”๋ฉด์„ ๋‹ค ํ•˜๋‚˜๋กœ ๋ชจ์•„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ž˜ ํ†ต์‹ ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ดค์„ ๋•Œ ๋Œ€์ฒด๋กœ ์ˆœ์กฐ๋กœ์› ๋‹ค. 
๊ฐ™์ด ์ž‘์—…ํ•˜๋ฉด์„œ ๋” ํ•„์š”ํ•œ ๊ฒŒ ์—†๋Š”์ง€ ์ˆ˜์‹œ๋กœ ๋ฌผ์–ด๋ด์ฃผ์—ˆ๋˜ ๋‹คํฌ ํ”„๋งค๋‹˜,
์ค‘๊ฐ„์ค‘๊ฐ„ ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐœ์„ ์ ์„ ์–˜๊ธฐํ•ด์ฃผ๊ณ  ์„ธ์„ธํ•˜๊ฒŒ PTํ–ˆ๋˜ ๊ด‘ํ˜„ ํ”„๋งค๋‹˜,
ํ™”๋ฉด ๊ตฌํ˜„์ด๋‚˜ ํ†ต์‹ ์— ์žˆ์–ด์„œ ํ—ค๋งค๊ณ  ์žˆ์„ ๋•Œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์ฅฌ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌ๋”์ธ ์˜์šด๋‹˜์ด
์บ๋ฆฌ ํ•ด์ค˜์„œ ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋„ ํ™”์ดํŒ…~