๐BookCurly
- ๋ง์ผ์ปฌ๋ฆฌ ์ฌ์ดํธ ๋์์ธ๊ณผ ๋์ API๋ฅผ ์ด์ฉํ ํ๋ก์ ํธ
- 2021.02.12 ~ 2021.02.28๊น์ง 2์ฃผ๊ฐ ์งํ
API ๋ฐฐํฌ๊ด๋ จ ๋ฌธ์ ๋ก ์์ ์ฒจ๋ถ
๐ฅ Work
1. Main Page
1-1. Carousel
- main์์ ์ฑ
์ฌ๋ผ์ด๋๋ก ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ
- React Slick ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
-> node_modules์์ css ํ์ผ ๊บผ๋ด ์ง์ ์คํ์ผ๋ง
-> ์ข์ฐ ํ์ดํ ์ถ๊ฐ (absolute
, relative
), ์ด๋ฏธ์ง ํฌ๊ธฐ, ํ๋ฒ์ 4๊ฐ ๋ณด์ด๋๋ก, ๋ฌดํ ์ข์ฐ ์ด๋, scale ์ ๋๋ฉ์ด์
- ์ฑ
ํ๋ ํด๋ฆญ์ ํด๋น ์ํ ๋ํ
์ผ ํ์ด์ง๋ก ์ด๋
1-2. ์นดํ
๊ณ ๋ฆฌ
- useState ์ด์ฉํด ์ด์ฉ์๊ฐ ์ ํํ ์นดํ
๊ณ ๋ฆฌ๋ช
๋ณ๊ฒฝ ๊ด๋ฆฌ
-> ์ง๋ณด๋ผ์ ์์ ๋ถ์ฌ๋๋ ์นดํ
๊ณ ๋ฆฌ ์ง์
-> ์ ํ๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ง๋ ๋์ ๋ชฉ๋ก Carousel
- ์ ํํ ์นดํ
๊ณ ๋ฆฌ์ ๋ง๋ ๋๋ณด๊ธฐ ์นธ ๋ง๋ จ
- ๋๋ณด๊ธฐ ํด๋ฆญ์ ๋ฆฌ์คํธ๋ก ๋ ๋ง์ ๋ชฉ๋ก ์ถ๋ ฅ
1-3. 2๋จ ํค๋
position: absolute, width: 150px
๋ถ์ฌ
left
์์ฑ ๊ฐ : 0๊ณผ 100%์ ํตํด ์๋์ ์ธ ์์น ๋ถ์ฌ
- hover ์ ๋ฌด์ ๋ฐ๋ผ
display
์์ฑ ๊ฐ : none, block์ ํตํด ๋ง์ฐ์ค ์์น์ ๋ฐ๋ผ ๋ฑ์ฅํ๊ฒ ํจ
- ํด๋ฆญํ๋ฉด router ํ๋ผ๋ฏธํฐ๋ก categoryId ๊ฐ์ด ์ ๋ฌ๋์ด ํด๋น ๊ฐ์ผ๋ก API GET ํธ์ถํ๊ณ ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ค
2. List Page & Detail Page
2-1. ํค๋ ํด๋ฆญ์ ์ฑ
๋ชฉ๋ก & ์ ํ ๊ธฐ์ค ๋ฐ๋ฅธ ์ ๋ ฌ
- useEffect์ dependency ๊ฐ์ ํค๋์์ ํด๋ฆญํ ๋ฉ๋ด๊ฐ์ผ๋ก ์ค์ ํด API GET ์์ฒญ์ ๋ ๋ฆฌ๋๋ก ํ๊ณ ๋ชฉ๋ก ์ฌ๋๋๋ง
- [๋ฌธ์ ์ํฉ] API ์์ฒญ ์ฟผ๋ฆฌ์ ์ ๋ ฌ ๋ถ์ฌ ๋ถ๊ฐ๋ฅ
- [ํด๊ฒฐ] ์ง์ Response JSON ๋ด ํน์ key์ value๋ฅผ ๊ธฐ์ค์ผ๋ก element๋ฅผ ์ฌ๋ฐฐ์ดํ๋ ํจ์ ์์ฑ
- ์ฌ๋ฐฐ์ด์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉด list ์ปดํฌ๋ํธ ์ฌ๋๋๋ง๋๋๋ก useEffect ์ฌ์ฉ
2-2. ๊ฒ์ ์ ๊ฒฐ๊ณผ ๋ชฉ๋ก
- ํค๋์
input
ํ๊ทธ์ ์
๋ ฅ๋ ๊ฐ์ผ๋ก API GET ์์ฒญ
- ๊ฒ์ ์์ฒญ ์ฟผ๋ฆฌ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ useEffect ์คํ๋๋ฉฐ ๋ชฉ๋ก ์ปดํฌ๋ํธ ์ฌ๋๋๋ง
- ์ฌ์ฉ์๊ฐ ํน์ ์ฑ
ํด๋ฆญ์ ํด๋น ์ฑ
์ title, categoryId ๊ฐ์ ธ์ด
- GET Detail API์ ํ์ํ searchType ์ฟผ๋ฆฌ ๊ฐ์ ๋ถ์ฌํ๋ ํจ์ ์์ฑ
- ์์ฒญ ํ๋ผ๋ฏธํฐ๊ฐ ๋ค ๊ฐ์ถฐ์ง๋ฉด API๋ก ์์ธ ์ ๋ณด ๋ฐ์์ค๊ณ ๋ํ
์ผ ํ์ด์ง๋ ์ด๋
- ํด๋น ์ฑ
์ ์ธํฐํํฌ ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ๋งํฌ ์ฐ๊ฒฐ
3. Signup
3-1. ์ ๋ณด ์
๋ ฅ ๊ฐ ์กฐ๊ฑด ๋ง์กฑ ์ฌ๋ถ์ ์๊ฐํ
<input>
ํ๊ทธ์ name๊ณผ value ์์ฑ ์ด์ฉ
<input className="signup_Pw_input" placeholder="๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์" maxLength="16"
name="Pwd" type="text" value={Pwd}
onChange={onChange} onClick={onClick_Info} />
-
change์ click ์ด๋ฒคํธ ๋ฐ์์ ํธ๋๋ง ํจ์ ์์ฑ
//์
๋ ฅ ๊ฐ์ ๋ฐ๋ฅธ ์ํ ์ค์
const onChange = (e) => {
const { value, name } = e.target;
setInputs({
...inputs,
});
console.log(inputs);
};
//์
๋ ฅํ๊ณ ์ ํ ๋ ํด๋ฆญํ์ผ๋ ์กฐ๊ฑด ๋ณด์ฌ์ฃผ๊ธฐ
const onClick_Info = (e) => {
console.log(e.target);
let name = `show${e.target.name}Info`;
setInputs({
...inputs,
});
};
* ํ์๊ฐ์
์กฐ๊ฑด ๊ฒ์ฆํด true/false ๋ฐํํ๋ ์ ๊ทํํ์ ์์ฑ
* ๋ฐํ๋๋ true/false ์ด์ฉ + ์ผํญ์ฐ์ฐ์๋ก class ๋ช
๋ถ์ฌ
* class ๋ช
์ ๋ฐ๋ฅธ ์์ ์ค์
```js
<li className={IsPassword(Pwd) ? "true" : "false"}>
3-2. DaumPostcode ์ด์ฉํ ์ฃผ์ ์ ๋ณด
์ฃผ์ ์
๋ ฅ ์ํ ๋ฐ๋ฅธ input
-
์ฃผ์ ์
๋ ฅ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋ฒํผ์ ํด๋ฆญํด DaumPostcode
๊ฐ ์คํ๋๋๋ก ํจ
-
DaumPostcode
๊ฐ POP์ผ๋ก ์คํ๋๊ณ ๋๋ต์ ์ธ ์ฃผ์ ๊ฒ์์ผ๋ก ์ฐํธ๋ฒํธ์ ์ ํํ ์ฃผ์ ๋ฐ์์ด
-
๋ฐ์์จ ์ ํํ ์ฃผ์์ ์ฐํธ๋ฒํธ๋ ์๋์ผ๋ก input
์ ๋ฃ์ด์ค
-
์ด๋ฏธ ๋ฐ์์จ ์ฃผ์๊ฐ ์์์ผ๋ก ๋ฒํผ์ ๋ฌธ๊ตฌ๋ ์ฃผ์ ์ฌ๊ฒ์์ผ๋ก ์์
-
๋ง์ง๋ง ์นธ์๋ ์ถ๊ฐ์ ์ธ ๋ํธ์ ์
๋ ฅ
4. Login & User Profile
์นด์นด์ค ์์
๋ก๊ทธ์ธ
- ์นด์นด์ค ๋ก๊ทธ์ธ ์ฑ๊ณตํด user ์ ๋ณด๋ฅผ
crypto-js
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํด ์ํธํ ํด localStorage
์ ์ ์ฅ
- ์ ์ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ ์ฐ์ธก ์๋จ์๋ ๋ก๊ทธ์ธ/ํ์๊ฐ์
์ด ์๋ ์ ์ ์ด๋ฆ/์ ์ ์ ๋ณด๊ฐ ๋จ๋๋ก ํจ
- ๋ด ์ ๋ณด ํด๋ฆญ ์ localStorage์ ์ํธํ๋์ด ์ ์ฅ๋ ์ ์ ์ ์ ๋ณด๋ฅผ ๋ณตํธํํด ํ์ด์ง์ ๋ณด์ฌ์ค
- ๋ก๊ทธ์์ ์ locaStorage์ ์ ๋ณด๋ฅผ ์ญ์ ํ๊ณ ์ ์ ์ด๋ฆ/์ ์ ์ ๋ณด๊ฐ ์๋ ๋ก๊ทธ์ธ/ํ์๊ฐ์
์ด ๋จ๋๋ก ํจ