โ๏ธ 3์ฃผ์ฐจ ๊ณผ์ ์์ ํผ๋๋ฐฑ ๋ฐ์ ๋ด์ฉ๊ณผ ๋ฐฐ์ด ๋ด์ฉ
โ ์ฒ์ ๋๋๋ง์ด ๋๊ณ ๋์ ํด๋น๋๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ ๋ฐ์ดํฐ์ธ์ง ์์ผ๋ก ํ์ํด์ผํ๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ => ์๋ฒ์ ๋ณด๋ด์ฃผ๋ ๋ฐ์ดํฐ๊ฐ index 0๋ถํฐ ์์ํ๋๊น ์๋ฒ์ ์์ฒญํ๋ ๋ฐ์ดํฐ ์ญ์ index 0๋ถํฐ ์์ํด์ผํ๋ค.
โ input ํ๊ทธ์์ value์ defaultValue์ ์ฐจ์ด
์ญํ ์ ๊ฐ๋ค.
value๋ ๊ฐ์ด ๋ณํ์ง ์์ ๋ ์ฌ์ฉ. value๋ฅผ ์ฌ์ฉํ๋ค๋ฉด readOnly ์์ฑ์ true๋ก ์ค์ ํ๋ฉด ๋๋ค.
defaultValue๋ ๊ฐ์ด ๋ณํ ๋ ์ฌ์ฉ
โ ๋ฌธ์ฅ ๋ถ์ ๋ถ๋ถ์์ ํ์ฌ๋ช ์ ๋ฐ๋ผ ๋ฐํ์์ ๋ณ๊ฒฝํด์ผํ๋ค.
๋ฐฐ๊ฒฝ์์ ์ค์ ํด์ฃผ๋ ํจ์๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
์ ์ฒด ํ์ฌ๋ช ๋ฐ์ดํฐ ์ค์์ ์ฐพ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ indexOf๋ก ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ๊ณ , ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์์ ์ธ๋ฑ์ค๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ๊น๋ค๋ก์ ๋ ์ ์ด ์๋ฒ์์ ๋ฐ์์ค๋ ๋ฐ์ดํฐ์์ ์ ์ฒด ํ์ฌ๋ช ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ค๋ด๋ ๊ฒ์ด์๋ค.
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐฐ์ด ์์ ๋ฐฐ์ด์ด (์ด์ค ๋ฐฐ์ด) ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๊ณ ์๋ ํํ์๋ค.
Todo 1..
๋ฐฐ์ด arr์์ ๋ชจ๋ name์ ์ค๋ณต์์ด ๊ตฌํ๋๋ฐ, score์ด ๋์ ์์๋๋ก ๊ตฌํ๊ธฐ
const arr= [
[{name:'C', score:10},{name:'B', score:30}],
[{name:'A', score:90},{name:'E', score:70}],
[{name:'D', score:70},{name:'A', score:90}],
[{name:'E', score:30},{name:'F', score:60}],
[{name:'D', score:90},{name:'C', score:20}]
]
๋ด๊ฐ ํผ ๋ฐฉ๋ฒ
arr.flat().sort((a,b) => b.score - a.score).map(data => data.name).reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], [])
ํ๋์ฉ ํบ์๋ณด๊ธฐ
1. console.log(arr.flat())
// ์ค์ฒฉ๋ ๋ฐฐ์ด ๊ตฌ์กฐ๋ฅผ ํ๋๋ก ํฉ์น๋ค. ex) [{},{},{},{},,,]
// [{name: 'C', score: 10}, {name: 'B', score: 30}, {name: 'A', score: 90}, {name: 'E', score: 70}, {name: 'D', score: 70}, ...]
2. console.log(arr.flat().sort((a,b) => b.score - a.score).map(data => data.name))
// score์ด ๋์ ์์๋๋ก name์ ์ถ๋ ฅํ๋ค.
// ['A', 'A', 'D', 'E', 'D', 'F', 'B', 'E', 'C', 'C']
3. console.log(arr.flat().sort((a,b) => b.score - a.score).map(data => data.name).reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []))
// ์ค๋ณต์ ์์ค๋ค.
// ['A', 'D', 'E', 'F', 'B', 'C']
Todo 2..
์ ์ฒด ํ์ฌ๋ช ๋ฐ์ดํฐ ์ค์์ ์ฐพ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ฅผ indexOf๋ก ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ๊ณ , ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์์ ์ธ๋ฑ์ค๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
const setBackGroundColorFn = (stockName) => {
const BackGroundColor = [
"rgba(101, 119, 152, 0.15)",
"rgba(98, 218, 171, 0.15)",
"rgba(99, 149, 249, 0.15)",
"rgba(327, 120, 345, 0.15)",
"rgba(49, 320, 45, 0.15)",
];
if (stockName === undefined) {
return "rgb(245, 245, 245)";
}
const index = stockList.indexOf(stockName.stock);
return BackGroundColor[index];
};
setBackGroundColorFn๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ํ์ฌ๋ช
์ ๋ฐ๋ผ ํญ์ ๊ฐ์ ์์์ด ๋ฆฌํด๋๋๋ก ํ์๋ค.
setBackGroundColorFn์ ํ๋ผ๋ฏธํฐ์๋ ๋ฐ์ดํฐ์ ํ์ฌ๋ช
์ ๋ฃ์ผ๋ฉด ๋๋ค.
(์ฌ๊ธฐ์ stockList๋ ์์์ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์๋ ์ ์ฒด ํ์ฌ๋ช
์. )
โ๏ธ 4์ฃผ์ฐจ ์ค๋ฌด PT ์ฃผ์
๋ฐฑ์๋์ ์ํตํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ํ๋ก ํธ์๋ ์ฌํ
โ๏ธ ์ด๋ฒ ์ฃผ ์์ ์ ํตํด์ ๋ฐฐ์ด ์
โ CORS ์ ์ฑ (cross origin resource sharing)
(์ฌ๊ธฐ์ origin์ ํ๋กํ ์ฝ, ๋๋ฉ์ธ, ํฌํธ๋ฅผ ํฌํจํ ๊ฐ๋ ์ด๋ค.)
CORS = ์๋ก ๋ค๋ฅธ origin ๊ฐ์ ๋ฆฌ์์ค ๊ตํ
SOP(Same-Origin Policy)์ ์ฑ (๋์ผ ์ถ์ฒ ์ ์ฑ ) = ์น ๋ธ๋ผ์ฐ์ ์ ๋ณด์์ ์ํด ๊ฐ์ origin์ ์๋ฒ๋ก๋ง ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ก ์ํธ์์ฉ์ ์ ํํ๋ ๋ณด์ ๋ฐฉ์
CORS ์ ์ฑ = ํธ์ถ์ด ํ์ฉ๋ ์ถ์ฒ๋ฅผ ์๋ฒ๊ฐ ๋ช ์ํด๋์ผ๋ฉด, ๋น๋ก ์ถ์ฒ๊ฐ ๋ค๋ฅด๋๋ผ๋ ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํ์ฉํ ์ ์ฑ
→CORS ERROR๋ CORS ์ ์ฑ ์ ์งํค์ง ์์์ ๋ ๋ฐ์ํ๋ ์๋ฌ์ด๋ค.
๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ Origin ํค๋์ ๋ด๊ธด ์ถ์ฒ ์ ๋ณด๊ฐ ์๋ต์ Access-Control-Allow-Origin ํค๋์ ๋ด๊ฒจ์์ผ๋ฉด
ํด๋น ์์ฒญ์ ์์ ํ๋ค๊ณ ๊ฐ์ฃผํ๊ณ ์๋ต์ ๊ฐ์ ธ์จ๋ค.
๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ์๋ต์ ์์๋ก ํ๊ธฐํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์๋ต์ ๋ด์ฉ์ ์ ๋ฌํ์ง ์๋๋ค.
-> ์๋ฒ์์ ํ์ฉํ์ง ์์ ์ฃผ์๋ก๋ถํฐ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฌ๋ฅผ ๋ด๋ฟ๋ ๊ฒ์ด๋ค!!
CORS ์๋ฌ ํด๊ฒฐ๋ฒ
(cors ์๋ฌ๋ ๋ฐฑ์๋์์ ํด์ฃผ๋๊ฒ ์ด์์ ์ด๊ธด ํ๋ค๊ณ ๋ง์ํ์ฌ )
1. Access-Control-Allow-Origin ์ ์ฒด ํ์ฉ (CORS ์ ์ฑ ์ ๋ณธ์ง์ ํ๋ฆฐ๋ค)
๋ฐฑ์๋์์ ๋ชจ๋ ์ฃผ์๋ฅผ Access-Control-Allow-Origin : * ๋ก ์ค์
์ด ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๊ฐ CORS ๋ฐฉ์ด๋ฅผ ํด์ค ์ ์๋ ์ต์ํ์ ์์ ์ฅ์น๋ ๋ ๋ ค๋ฒ๋ฆฐ ์
์ด๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ๋ค.
2. ํ๋ก์ ์๋ฒ ์ฌ์ฉ
CORS์๋ฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ง๋๋ ์๋ฌ๋ก, ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ ์์๋ ๋ฐ์ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํ๋ก์ ์๋ฒ๋ฅผ ์์ฑ ํ์ฌ, ์๋ฒ๋ผ๋ฆฌ ์ํตํ๋ ํํ๋ก ๋ง๋ค๋ฉด CORS ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ฐํํ ์ ์๋ ์์ฉ์๋ฒ → (https://cors-anywhere/herokuapp.com/ + '์ฐ๋ฆฌ๊ฐ ๋ณด๋ธ API์์ฒญ ์ฃผ์')
๋จ, ๋ฐฐํฌํ ๋๋ ์ฐ์ง ๋ชปํจ
์ค๋ฌด์์๋ ํ์ฌ์์ ํ๋ก์ ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ CORS ์๋ฌ๋ฅผ ์ ์ดํ๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๊ณ ํจ.
3. Chrome ํ์ฅ ํ๋ก๊ทธ๋จ ์ด์ฉ (๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ)
Chrome์์๋ CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ๊ณ ์๋ค.
๋ก์ปฌ ํ๊ฒฝ์์ API ํ
์คํธ ์, CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ด ์๋ฒ ํ
์คํธ ํ๊ฒฝ์์ ๊ณ ๋ฏผํ์ง ์๊ณ CORS๋ฅผ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
โ ์์ฃผ ๋ํ๋๋ ์๋ฌ ํธ๋ค๋ง ๋ฐฉ๋ฒ
1. ~~ is not a function
์์ธ : ํจ์๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ, ์ฆ ํจ์ ๋ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ๋ฐ์ํ๋ค.
ํด๊ฒฐ : ํจ์๋ช
์ ๊ฒน์น์ง ์๊ฒ ์ฌ์ฉํ๊ฑฐ๋, ํจ์ ๋ด์์ ์ด๋์ ์ค๋ฅ๊ฐ ๋จ๋์ง console.log๋ก ์ถ๋ ฅํด๋ณด๋ฉฐ ํ์ธํ๋ ์ ๋ฐ์!!
์์ธ์ ์ฝ๋์ ์ํฉ๋ง๋ค ๋ค์ํ์ง๋ง, ํ์ฌ ์ด๋ฏธ์ง๋ก ํ์ ํ ์ ์๋ ์์ธ์ movie๊ฐ ๊ฐ์ฒด์ฌ์ mapํจ์ ์ฌ์ฉ ๋ถ๊ฐ
2. Undefined error
์์ธ: ๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ ค์ฃผ๊ณ ์ถ์ UI๋ฅผ ๋ฆฌํดํ๊ณ ๋ง์ฝ UI๋ฅผ ๊ทธ๋ฆด ๋น์์ ๋ณด์ฌ์ฃผ๊ณ ์ํ๋ ๊ฐ์ด ์๋ค๋ฉด ์๋ฌ -> ๋๋๋ง๋๋ ์์ ์๋ undefined์ฌ์ ๋ฐ์ํ๋ ์๋ฌ
ํด๊ฒฐ:
1) State์ ์ด๊ธฐ๊ฐ์์ ๋ค์ด์ฌ ๋ฐ์ดํฐ ํ์
์ ๋ฏธ๋ฆฌ ๋ฃ์ด๋๊ธฐ (ํ์
์ ํ์ธํ๊ธฐโญ๏ธ)
2) ์กฐ๊ฑด๋ถ๋ ๋๋ง && ์ฐ์ฐ์์ ์กฐ๊ฑด๋ฌธ์ ํ์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ, ์กฐ๊ฑด์ผ๋ ๋ ๋๋ง ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ ์ฌ์ฉํ๊ธฐ
์กฐ๊ฑด๋ถ ๋ ๋๋ง ์์
{
Object.keys(result).length && result.sentence.map((sentence, idx) => {
return (
<div key={idx} className="sentenceReport2" style={{backgroundColor: setColor(!!sent.condition.length ? sent.condition[0].stock : '์์', 0.1)}}>
<p className="sentence">{sent.sentence}</p>
<p className="percent" >
<span> {!!sent.condition.length ? sent.condition[0].stock : '์์'} </span>
<span style={{color: setColor(!!sent.condition.length ? sent.condition[0].stock : '์์', 1), fontWeight: 'bold', opacity: "1"}}>{!!sent.condition.length ? Math.floor(sent.condition[0].score*100) : 0}%</span>
</p>
</div>
)
})
}
result.sentence๊ฐ ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์์ 'Object.keys(result).length &&' ๋ฅผ ํตํด์ ์์ ์ฅ์น๋ฅผ ๋ง๋ ๊ฑฐ๋ค.
์ฐธ๊ณ ๋ก result์ ์ด๊ธฐ๊ฐ์ด ๋น๊ฐ์ฒด์ด๋ค.
๊ทธ๋์ Object.keys(result)๋ [] ๋น ๋ฐฐ์ด์ด ๋์ค๊ณ , ๋น๋ฐฐ์ด์ ๊ธธ์ด๋ 0์ falsy๋๊น ์ด๋๋ ์คํ์ด ์๋๊ณ , ๋ญ๋ผ๋ ๊ฐ์ด ํ๋๋ผ๋ ์์๋ ์คํ์ด ๋๋ ์ฝ๋์ด๋ค.
๋ณดํต ๋ฐ์ดํฐ๋ JSON ํํ๋ก ๋ง์ด ๋ฐ๊ธฐ ๋๋ฌธ์ 'Object.keys(result).length &&' ์ด๋ฐ ๋ฐฉ๋ฒ์ด ๋ง์ด ์ฐ์ธ๋ค๊ณ ํ๋ค.
3. Key error
์์ธ :mapํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ทธ๋ฅผ ๋ฐ๋ณตํ ๋ key์์ฑ์ด ์์ด์ ๋ํ๋๋ ์ฝ์ ์๋ฌ์ด๋ค.
-> ๊ฐ ๊ณ ์ ์์์ key ๊ฐ ์์ด์ผ๋ง ๋ฐฐ์ด์ด ์
๋ฐ์ดํธ ๋ ๋ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๊ฒฐ : ๊ฐ์ฅ ์์ ํ๊ทธ์ key={์ ์ผํ ๊ฐ}์ ์ง์ ํ๋ฉด ๋๋ค.
โ๏ธ ์ ๊ฒฝ์ฐ๋ฉด์ ๊ฐ๋ฐํ ์
๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
๋ฐ์ดํฐ๊ฐ undefined์ผ ๋๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ๋ คํ๊ธฐ
๋ฐ์ดํฐ ํ์ ์ ๋ํด ๊ณต๋ถํ๊ธฐ