PROJECT

KREAM 클둠 ν”„λ‘œμ νŠΈ

sophie0527 2022. 7. 25. 12:51

β–Ί KREAMλ₯Ό 클둠 ν•˜λŠ”!   DREAM ν”„λ‘œμ νŠΈ! 

• λ ˆν¬μ§€ν† λ¦¬ μ£Όμ†Œ 
Front-end-repo < λ°”λ‘œκ°€κΈ°
Back-end-repo < λ°”λ‘œκ°€κΈ°

β–Ί Project μ†Œκ°œ

2μ°¨ 클둠 μ½”λ”© ν”„λ‘œμ νŠΈλ‘œ KREAM μ‚¬μ΄νŠΈλ₯Ό μ„ μ •ν•˜κ²Œ λ˜μ—ˆλ‹€. μƒν’ˆμ„ μ‚¬κ³ νŒ”κ³ , 그리고 sns κΈ°λŠ₯κΉŒμ§€ κ°–μΆ˜ λ‹€μ–‘ν•œ 뢄뢄을 보여쀄 수 μžˆλŠ” μ‚¬μ΄νŠΈλΌ μƒκ°λ˜μ–΄ μ„ νƒν•˜κ²Œ λ˜μ—ˆλ‹€.
1μ°¨ ν”„λ‘œμ νŠΈμ™€λŠ” λ‹€λ₯΄κ²Œ ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ 파트λ₯Ό λ‚˜λˆ  진행을 ν–ˆλ‹€. 1차에 λΉ„ν•΄ λ§Žμ€ κΈ°λŠ₯이 μžˆμ–΄ λ‹€ν•΄λ‚Ό 수 μžˆμ„κΉŒλΌλŠ” κ±±μ •κ³Ό, νŒ€μ›λΆ„λ“€ 쀑 μ½”λ‘œλ‚˜μ— ν™•μ§„λ˜λŠ” μ•ˆ 쒋은 상황이 μžˆμ—ˆμ§€λ§Œ, νŒ€μ›λΆ„λ“€μ΄ λͺΈμ΄ μ•ˆ 쒋은데도 λΆˆκ΅¬ν•˜κ³  λͺ¨λ‘ μ—΄μ •μ μœΌλ‘œ μ—΄μ‹¬νžˆ μ°Έμ—¬ν•΄μ£Όμ…”μ„œ λ°œν‘œκΉŒμ§€ 큰 무리 없이 μ§„ν–‰ν•  수 μžˆμ—ˆλ‹€.

μž‘μ—… κΈ°κ°„

 2022-07-11 ~ 2022-07-22 

개발 인원

총 6λͺ…

FE : μ†μ†Œν¬,μ •μ§„μš°,μœ κ΄€ν¬

BE : μ΅œμˆ˜μ§„,κΉ€μ˜ˆμ°¬,μ΅œμ •ν›ˆ

Technlogies

Front-end   HTML | SCSS | JAVASCRIPT | REACT | STYLED-COMPONENTS

Back-end    NODE.JS | EXPRESS | BCRYPT | JSONWEBTOKEN

All    RESTful API | MVC Pattern | GithubI | Slack | Notion

DB modeling

 

ν”„λ‘œμ νŠΈ μ‚¬μ΄νŠΈ κΈ°λŠ₯ κ΅¬ν˜„ μ˜μƒ

Dream 사연 영ᄉᅑᆼ< λ°”λ‘œκ°€κΈ°

 

κ΅¬ν˜„ κΈ°λŠ₯ 사항

* νŒŒλž€μƒ‰ 뢀뢄은 λ‚΄κ°€ κΈ°μ—¬ν•œ κΈ°λŠ₯!

νŒ€μ› Front-end
μ •μ§„μš°

둜그인/νšŒμ›κ°€μž…
μ œν’ˆμƒμ„ΈνŽ˜μ΄μ§€
ꡬ맀/판맀 νŽ˜μ΄μ§€
μ†μ†Œν¬ 마이 νŽ˜μ΄μ§€ (ν”„λ‘œν•„νŽ˜μ΄μ§€)
마이 νŽ˜μ΄μ§€ (관심/ꡬ맀/판맀 νŽ˜μ΄μ§€)
SHOP νŽ˜μ΄μ§€
μœ κ΄€ν¬

λ©”μΈνŽ˜μ΄μ§€
Header/Footer
STYLE νŽ˜μ΄μ§€
νŒ€μ› Back-end
μ΅œμˆ˜μ§„

νšŒμ›κ°€μž…,둜그인 API/μ†Œμ…œ 둜그인(카카였)
SHOP νŽ˜μ΄μ§€ API
μ œν’ˆ 상세 νŽ˜μ΄μ§€ API
κΉ€μ˜ˆμ°¬

메인 νŽ˜μ΄μ§€ API
STYLE νŽ˜μ΄μ§€ API
κ΄€μ‹¬μƒν’ˆ API
μ΅œμ •ν›ˆ

λ§ˆμ΄νŽ˜μ΄μ§€(ν”„λ‘œν•„)API
ꡬ맀/판맀 νŽ˜μ΄μ§€ API

 

둜그인 / νšŒμ›κ°€μž…

  • 둜그인/νšŒμ›κ°€μž…
    • μ •κ·œν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ—¬ 이메일 μ£Όμ†Œμ™€ λΉ„λ°€λ²ˆν˜Έμ— λŒ€ν•œ μœ νš¨μ„± 검사 κΈ°λŠ₯을 κ΅¬ν˜„
    • useState와 useEffect 훅을 μ‚¬μš©ν•˜μ—¬ 이메일 state와 λΉ„λ°€λ²ˆν˜Έ stateκ°€ 변경될 λ•Œλ§ˆλ‹€ validation을 체크할 수 μžˆλ„λ‘ κ΅¬ν˜„
    • 카카였 λ‘œκ·ΈμΈμ„ μ§„ν–‰ν•  λ•ŒλŠ” 카카였 둜그인 λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ aνƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°±μ—”λ“œ μ£Όμ†Œλ‘œ μ΄λ™μ‹œμΌœμ£Όκ³ , λ°±μ—”λ“œ μͺ½μ—μ„œ λ‘œμ§μ„ μ²˜λ¦¬ν•œ ν›„ λ‹€μ‹œ redirect url으둜 μ΄λ™μ‹œμΌœμ£ΌλŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„
    •  url에 μžˆλŠ” 정보듀을 뽑아낼 λ•ŒλŠ” query-string 라이브러리λ₯Ό μ‚¬μš©. 둜컬 μŠ€ν† λ¦¬μ§€μ— 정보듀을 μ €μž₯ν•œ ν›„μ—λŠ” 메인 νŽ˜μ΄μ§€('/')둜 이동.

μ œν’ˆ 상세 / ꡬ맀&판맀

  • μ œν’ˆ 상세
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 μ œν’ˆ 상세 정보λ₯Ό κ°€μ Έμ˜€κΈ°
    • κ΄€μ‹¬μƒν’ˆ κΈ°λŠ₯κ³Ό, μ‚¬μ΄μ¦ˆ λͺ¨λ‹¬, ꡬ맀 μ „ 확인 λΆ€λΆ„ ν† κΈ€ κΈ°λŠ₯, react-slick을 μ΄μš©ν•œ 이미지 μŠ¬λΌμ΄λ” κΈ°λŠ₯, λ‹€λ₯Έ μƒν’ˆ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
  • ꡬ맀&판맀
    • ꡬ맀 및 판맀 κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ νŒλ§€κ°€ λ“±λ‘λœ μ‚¬μ΄μ¦ˆλ§Œ ꡬ맀할 수 μžˆλ„λ‘ κ΅¬ν˜„
    • 판맀λ₯Ό 등둝할 λ•ŒλŠ” λ“±λ‘λœ μ‚¬μ΄μ¦ˆ 가격과 λ™μΌν•˜κ²Œ 등둝할 μˆ˜λ„ 있고, 판맀 가격을 μž…μ°° λ°©μ‹μœΌλ‘œλ„ 등둝할 μˆ˜λ„ μžˆλ„λ‘ κ΅¬ν˜„
    • λ°±μ—”λ“œμ—μ„œ λ³΄λ‚΄μ£ΌλŠ” 판맀 λ¦¬μŠ€νŠΈμ— λŒ€ν•œ userId와 둜컬 μŠ€ν† λ¦¬μ§€μ— μ €μž₯된 userIdλ₯Ό λΉ„κ΅ν•˜μ—¬ μžμ‹ μ΄ λ“±λ‘ν•œ μƒν’ˆμ€ ꡬ맀 κ°€λŠ₯ν•œ λ¦¬μŠ€νŠΈμ— 보이지 μ•ŠλŠ” κΈ°λŠ₯도 κ΅¬ν˜„
    • νŒλ§€λ‚˜ ꡬ맀λ₯Ό ν•  λ•Œ μ‚¬μš©λ˜λŠ” μ‚¬μ΄μ¦ˆλ‚˜ 가격 λ“±μ˜ 정보듀은 νŽ˜μ΄μ§€κ°€ 이동될 λ•Œλ§ˆλ‹€ stateλ₯Ό λ³΄λ‚΄μ£Όλ©΄μ„œ
      μƒˆλ‘œκ³ μΉ¨ ν•˜λ”λΌλ„ 정보가 μœ μ§€λ  수 μžˆλ„λ‘ κ΅¬ν˜„

 

마이 νŽ˜μ΄μ§€ ( ν”„λ‘œν•„ νŽ˜μ΄μ§€ , 관심/ꡬ맀/판맀 νŽ˜μ΄μ§€ )

  • ν”„λ‘œν•„ νŽ˜μ΄μ§€
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 ν”„λ‘œν•„ 상세 정보λ₯Ό κ°€μ Έμ˜€κΈ° (GET)
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 ν”„λ‘œν•„ μ£Όμ†Œ 등둝 (POST) : ν”„λ‘œν•„ 이미지 없을 μ‹œ κΈ°λ³Έ ν”„λ‘œν•„ μ΄λ―Έμ§€λ‘œ 보여쀄 수 μžˆλ„λ‘ 함.
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 νšŒμ› νƒˆν‡΄ (DELETE) : νšŒμ› νƒˆν‡΄ 성곡 μ‹œ 메인 ν™”λ©΄μœΌλ‘œ 이동.
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 ν”„λ‘œν•„ μ£Όμ†Œ μ‚­μ œ (DELETE)
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 ν”„λ‘œν•„ μ£Όμ†Œ μˆ˜μ • (PUT) : input 창에  μž…λ ₯λ˜λŠ” 값을 useStateλ₯Ό μ‚¬μš©ν•΄ μž…λ ₯된 값을 μœ μ§€μ‹œν‚€κΈ°.
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 ν”„λ‘œν•„ 이름/νœ΄λŒ€ν° 번호 μˆ˜μ • (PUT)
    • ν”„λ‘œν•„ μ£Όμ†Œ μΆ”κ°€ κΈ°λŠ₯
     

ν”„λ‘œν•„ νŽ˜μ΄μ§€_1
ν”„λ‘œν•„ νŽ˜μ΄μ§€_2

 

  • 관심 / ꡬ맀 / 판맀 νŽ˜μ΄μ§€
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 νŒλ§€μƒν’ˆ/κ΅¬λ§€μƒν’ˆ/관심 상세 정보λ₯Ό κ°€μ Έμ˜€κΈ° (GET)
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 관심 상세정보 μ‚­μ œ (DELETE)
     

관심내역 νŽ˜μ΄μ§€
판맀/ꡬ맀 λ‚΄μ—­ νŽ˜μ΄μ§€

 

SHOP νŽ˜μ΄μ§€ 

  • λ°±μ—”λ“œμ™€ 톡신을 톡해 μƒν’ˆ κ°€μ Έμ˜€κΈ° (GET)
  • 인기순/발맀 일순으둜 map λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•΄ μƒν’ˆ 보여주기

Shop νŽ˜μ΄μ§€

메인 νŽ˜μ΄μ§€ / Style νŽ˜μ΄μ§€

  • 메인 νŽ˜μ΄μ§€
    • 메인 λ°°λ„ˆ : λ²„νŠΌ 클릭 μ‹œ ν•΄λ‹Ή μŠ¬λΌμ΄λ”λ‘œ 이동 κΈ°λŠ₯ κ΅¬ν˜„
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 μ œν’ˆ 상세 정보λ₯Ό κ°€μ Έμ˜€κΈ°
  • μŠ€νƒ€μΌ νŽ˜μ΄μ§€
    • λ°±μ—”λ“œμ™€ 톡신을 톡해 μ œν’ˆ 상세 정보λ₯Ό κ°€μ Έμ˜€κΈ°

 

Header

  • Header
    • ν•΄λ‹Ή νŽ˜μ΄μ§€λ‘œ 이동 κ°€λŠ₯ν•˜λ„λ‘ κ΅¬ν˜„

 

β–Ί Project Review

μΉ­μ°¬ν•΄μ£Όκ³  싢은 점

 

μ§„ν–‰ μƒν™© λ° λ§‰νžˆλŠ” λΆ€λΆ„ λΉ λ₯΄κ²Œ  κ³΅μœ ν•˜κΈ°!

맀일 μžˆλŠ” μŠ€νƒ λ“œμ—… λ―ΈνŒ…μ„ κ²Œλ” νƒ€μš΄μ—μ„œ λͺ¨μ—¬ μ§„ν–‰ν•˜μ˜€κ³ ,

λ˜ν•œ ν˜„μž¬ 자기 상황에 λŒ€ν•΄ κ³΅μœ ν•˜κ³  μ‘°μœ¨ν•˜λ©°, ν”„λ‘œμ νŠΈ 진행을 μ›ν™œν•˜κ²Œ μ΄μ–΄λ‚˜κ°ˆ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

μ•„μ‰¬μ› λ˜  점

νŒ¨μΉ˜ν•˜λŠ” 뢀뢄이 λ§Žμ•„ κΈ°λŠ₯ κ΅¬ν˜„μ„ 많이 ν•˜μ§€ λͺ»ν•œ 점

νŒ¨μΉ˜ν•˜λŠ” 방법을 μ΄ν•΄ν•˜λŠ”λ° 어렀움이 μžˆμ—ˆλŠ”λ°, 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” νŒ¨μΉ˜ν•˜λŠ” 뢀뢄이 λŒ€λΆ€λΆ„μ΄λΌ 계속 ν•œ 뢀뢄에 머무λ₯΄κ²Œ λ˜μ–΄ κΈ°λŠ₯ κ΅¬ν˜„μ„ 많이 ν•˜μ§€ λͺ»ν•΄ μ•„μ‰¬μ› μŠ΅λ‹ˆλ‹€.

κ·Έλž˜λ„ νž˜λ“€μ—ˆλ˜ 만큼 패치 뢀뢄에 μžˆμ–΄μ„œλŠ” 많이 μ„±μž₯ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

κΈ°λ‘ν•˜κ³  싢은  λΆ€λΆ„ 

2μ°¨ ν”„λ‘œμ νŠΈμ—μ„œλŠ” fetch ν•˜λŠ” 뢀뢄이 많이 μžˆμ–΄μ„œ fetch ν•˜λŠ” 법을 많이 읡힐 수 μžˆμ—ˆλ‹€.

κ·Έμ€‘μ—μ„œ url 이 쿼리둜 λ˜μ–΄μžˆμ–΄ 인기순일 λ•Œμ™€ 발맀일 순일 λ•Œλ₯Ό onChange ν–ˆμ„ λ•Œ, λ°”λ€” 수 μžˆλ„λ‘ useStateλ₯Ό  μ‚¬μš©ν•œ μ½”λ“œκ°€ κ°€μž₯ 기얡에 λ‚¨λŠ” μ½”λ“œλΌ μ΄λ ‡κ²Œ 남겨본닀.

const [keyword, setKeyword] = useState('sell_num');

useEffect(() => {
    setIsUpdated(false);
    fetch(`http://localhost:10010/search?sort=${keyword}`, {
      method: 'GET',
    })
      .then(res => res.json())
      .then(data => {
        setSearchInfo(data);
      });
  }, [isUpdated, keyword]);

const handleSellNum = e => {
    setKeyword(e.target.value);
  };

return (
        <div className={css.filter_sorting}>
          <select onChange={handleSellNum}>
            <option value="sell_num">인기순</option>
            <option value="created_at">발맀일순</option>
          </select>
        </div>
...

 

νŒ€ ν”„λ‘œμ νŠΈ ν›„κΈ°

이번 ν”„λ‘œμ νŠΈλ₯Ό 톡해 κΈ°ν•œ μ•ˆμ— 효율적으둜 맑은 뢀뢄을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν• μ§€, 그리고 λ§Œμ•½ μ–΄λ €μšΈ μ‹œ μ–΄λ–»κ²Œ μ‘°μœ¨ν• μ§€μ— λŒ€ν•΄ 더 μƒκ°ν•˜κ²Œ 되고 배울 수 μžˆμ—ˆλ‹€. λ¬Όλ‘  1μ°¨ ν”„λ‘œμ νŠΈμ²˜λŸΌ κΈ°μ•ˆ μ•ˆμ— κ°€λŠ₯ν•˜λ„λ‘ μ—¬μœ λ‘­κ²Œ κ³„νšμ„ μž‘λŠ” 것도 λ°©λ²•μ΄κ² μ§€λ§Œ, ν˜„μ—…μ—μ„œλŠ” κ·Έλ ‡κ²Œ ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆλŠ” 뢀뢄이 μžˆλ‹€κ³  생각이 λ“ λ‹€. κ·Έλž˜μ„œ 이번 ν”„λ‘œμ νŠΈλŠ” νž˜λ“  만큼 많이 κ²½ν—˜ν•˜κ³  배울 수 μžˆμ—ˆλ‹€.

λ‚΄κ°€ 맑은 뢀뢄을 λ‹€ ν•΄λ‚΄μ§€ λͺ»ν•  μˆ˜λ„ μžˆμ„ κ±°λΌλŠ” 걱정을 우리 νŒ€μ›λ“€μ˜ λ„μ›€μœΌλ‘œ 잘 마무리될 수 μžˆμ—ˆλ‹€. λκΉŒμ§€ ν•¨κ»˜ν•΄μ€€ 우리 λ“œλ¦ΌνŒ€ νŒ€μ›λ“€ λ„ˆλ¬΄λ„ˆλ¬΄ κ°μ‚¬ν•΄μš”~🫰 

 

 

Reference
이 ν”„λ‘œμ νŠΈλŠ” 크림 μ‚¬μ΄νŠΈλ₯Ό μ°Έμ‘°ν•˜μ—¬ ν•™μŠ΅ λͺ©μ μœΌλ‘œ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
싀무 μˆ˜μ€€μ˜ ν”„λ‘œμ νŠΈμ΄μ§€λ§Œ ν•™μŠ΅μš©μœΌλ‘œ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— 이 μ½”λ“œλ₯Ό ν™œμš©ν•˜μ—¬ 이득을 μ·¨ν•˜κ±°λ‚˜ 무단 배포할 경우 λ²•μ μœΌλ‘œ 문제 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” 사진 λŒ€λΆ€λΆ„μ€ μœ„μ½”λ“œμ—μ„œ κ΅¬λ§€ν•œ κ²ƒμ΄λ―€λ‘œ ν•΄λ‹Ή ν”„λ‘œμ νŠΈ 외뢀인이 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.