KREAM ν΄λ‘ νλ‘μ νΈ
βΊ 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)
- νλ‘ν μ£Όμ μΆκ° κΈ°λ₯
- κ΄μ¬ / ꡬ맀 / νλ§€ νμ΄μ§
- λ°±μλμ ν΅μ μ ν΅ν΄ νλ§€μν/ꡬ맀μν/κ΄μ¬ μμΈ μ 보λ₯Ό κ°μ Έμ€κΈ° (GET)
- λ°±μλμ ν΅μ μ ν΅ν΄ κ΄μ¬ μμΈμ 보 μμ (DELETE)
SHOP νμ΄μ§
- λ°±μλμ ν΅μ μ ν΅ν΄ μν κ°μ Έμ€κΈ° (GET)
- μΈκΈ°μ/λ°λ§€ μΌμμΌλ‘ map λ©μλλ₯Ό νμ©ν΄ μν 보μ¬μ£ΌκΈ°
λ©μΈ νμ΄μ§ / 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
μ΄ νλ‘μ νΈλ ν¬λ¦Ό μ¬μ΄νΈλ₯Ό μ°Έμ‘°νμ¬ νμ΅ λͺ©μ μΌλ‘ λ§λ€μμ΅λλ€.
μ€λ¬΄ μμ€μ νλ‘μ νΈμ΄μ§λ§ νμ΅μ©μΌλ‘ λ§λ€μκΈ° λλ¬Έμ μ΄ μ½λλ₯Ό νμ©νμ¬ μ΄λμ μ·¨νκ±°λ λ¬΄λ¨ λ°°ν¬ν κ²½μ° λ²μ μΌλ‘ λ¬Έμ λ μ μμ΅λλ€. μ΄ νλ‘μ νΈμμ μ¬μ©νκ³ μλ μ¬μ§ λλΆλΆμ μμ½λμμ ꡬ맀ν κ²μ΄λ―λ‘ ν΄λΉ νλ‘μ νΈ μΈλΆμΈμ΄ μ¬μ©ν μ μμ΅λλ€.