๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š FrontEnd -Study68

๋ฆฌ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰ํ•œ ํ•ญ๋ชฉ ๋‹ค์‹œ ๋Œ์•„์™€๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ ์ฒ˜์Œ์—๋Š” ์ด ๋ถ€๋ถ„์„ ๋†“์น˜๊ณ  ๋‹จ์ˆœํžˆ ๋ชฉ๋ก ๋ฒ„ํŠผ์ด๋‚˜ ์ˆ˜์ • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด router.back()์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์ด์ „์— ๋ฆฌ์ŠคํŠธ์—์„œ ๋งŒ์•ฝ 100ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ณ  ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ธ€ ๋ˆ„๋ฅด๊ณ  ๋‹ค์‹œ ๋Œ์•„์˜ค๋ฉด ๋‹ค์‹œ 1ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ค๋Š”๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์  ๋งŽ์•„์ง€๋‹ˆ ๋„ˆ๋ฌด ๋ถˆํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ์ŠคํŠธ์—์„œ ์•„์นด์ด๋ธŒ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— route์™€ router๋ฅผ ์‚ฌ์šฉํ•˜์—ฌํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ๋ฐ›์•„์„œ ๊ทธ์ „์— ๋ดค๋˜ ํŽ˜์ด์ง€์ˆ˜์™€ ๊ฒ€์ƒ‰์–ด ๋“ฑ์„ ์œ ์ง€ํ•˜์—ฌ ์ด์ „์— ๋ดค๋˜ ๋ฆฌ์ŠคํŠธ์™€ ๋˜‘๊ฐ™๊ฒŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ๋” ์ˆ˜์ •ํ•˜์˜€๋‹ค. ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋งŽ์ด ์ˆ˜์ •ํ•˜์˜€๋Š”๋ฐ ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ๋‹ค.์šฐ์„  ๊ณต๊ฐœ๊ด€๋ฆฌ ํŽ˜์ด์ง€์—์„œ ๊ผญ ๋„˜๊ฒจ์ค˜์•ผํ•  ๊ฐ’๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.prevPage(ํŽ˜์ด์ง€๊ฒฝ๋กœ)pageNum(.. 2024. 10. 29.
๋ถ€๋ชจ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ v-model ์—ฐ๋™ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(formํƒœ๊ทธ)์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ(inputํƒœ๊ทธ) ์‚ฌ์ด์— v-model ์—ฐ๋™์„ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.. ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? v-model์˜ ๊ฐœ๋… - v-model์€ template์—์„œ ๊ฐ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” data ๊ฐ’์ด๋‹ค. - v-model์€ ๋ถ€๋ชจ - ์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€๋ชจ-์ž์‹ ๊ฐ„ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€ v-model๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค. vue.runtime.esm.js:1888 Error: [vuex] do not mutate vuex store state outside mutation handlers. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ์˜ ๊ฐ’์„ ํ•ธ๋“ค๋งํ•˜๋ฉด v-model์ด ์•„๋‹Œ :.. 2024. 4. 3.
Vue์—์„œ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๋ฐ”๊นฅ ํด๋ฆญ์‹œ ๋ฉ”๋‰ด ๋‹ซ๊ธฐ ์™ธ๋ถ€ ์˜์—ญ ์ธ์‹ํ•˜๊ธฐ 1. refs ์†์„ฑ์œผ๋กœ dom ์š”์†Œ ์ ‘๊ทผํ•˜๊ธฐ ์šฐ์„  ์™ธ๋ถ€ ์˜์—ญ ํด๋ฆญ์„ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” refs ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ref="์ฐธ์กฐ๋ช…" ์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ 2. eventListener๋กœ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์•ž์—์„œ ์ฐธ์กฐํ•  ์š”์†Œ ์ง€์ •ํ–ˆ์œผ๋ฉด, dom์š”์†Œ๊ฐ€ ํด๋ฆญ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด eventListener๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. window.addEventListener('click', this.onClick); dom์— ํด๋ฆญ์ด๋ฒคํŠธ ๋ฐœ์ƒํ–ˆ์œผ๋ฉด onClick ํ•จ์ˆ˜ ์‹คํ–‰ํ•œ๋‹ค. onClick(e){ if(e.target.parentNode !== this.$refs.card){ // ๊ฒฐ๊ณผ์ฐฝ ๋‹ซ๊ธฐ } } {{ dropDown }} {{ item }} dropd.. 2024. 3. 30.
TypeScript React์—์„œ useRef์˜ 3๊ฐ€์ง€ ์ •์˜ โœ… UseRef? useRef๋Š” React Hook์˜ ์ผ์ข…์œผ๋กœ, ์ธ์ž๋กœ ๋„˜์–ด์˜จ ์ดˆ๊นƒ๊ฐ’์„ useRef ๊ฐ์ฒด์˜ .current ํ”„๋กœํผํ‹ฐ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. DOM ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌ์ผœ์„œ ๋‚ด๋ถ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ focus() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ•˜๋Š” ๋•Œ์— ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์ด๋Š” useRef๊ฐ€ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ด๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. .current ํ”„๋กœํ”ผํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋”ฐ๋ผ์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๐Ÿ“ฆ ๋ณธ์งˆ์ ์œผ๋กœ useRef๋Š” .current ํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” โ€œ์ƒ์žโ€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ง์€ useRef์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ธ MutableRefObject์™€.. 2024. 1. 24.
IntersectionObserver ๊ฐœ๋… ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์—ฌ๋Ÿฌ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์ฐพ์•„๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ต‰์žฅํžˆ ๋ฉ‹์žˆ๋Š” ์ž‘ํ’ˆ๋“ค์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์ด ๋™์ž‘ํ•˜๋Š” ํฌํŠธํด๋ฆฌ์˜ค๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ ์ด๊ฒƒ๋“ค์ด ์ •์ ์ผ ์ˆ˜ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ๋ฅผ ์ง€๋ฃจํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณด๊ธฐ์—๋„ ์ƒ๋‹นํžˆ ๋ฉ‹์žˆ๋”๊ตฐ์š”.. ์ฒ˜์Œ์—” framer motion์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด์—ˆ์ง€๋งŒ Intersection Observer => ์š” ๋…€์„์„ ์ถ”ํ›„์— ์‚ฌ์šฉํ•  ๊ณ„ํš์ด ๋งŽ์„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ  ์ •ํ™•ํ•œ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ์ƒ๊ฐ์ด ๋“ค์–ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ๊ณ„๊ธฐ๋กœ ํ›‘์–ด๋ณผ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. Intersection Observer mdn์—์„œ ์„ค๋ช…๋˜์–ด์žˆ๋Š” ๊ธ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ต์ฐจ์  ๊ด€์ฐฐ์ž API์˜ IntersectionObserver ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋Œ€์ƒ ์š”์†Œ์™€ ์ƒ์œ„ ์š”์†Œ ๋˜๋Š”.. 2024. 1. 24.
[Tailwind] ์ž์‹ / ํ˜•์ œ ์š”์†Œ์—๊ฒŒ hover ํšจ๊ณผ ์ฃผ๊ธฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์•„๋ฌด๋ž˜๋„ Tailwind๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ๊ธฐ์กด์— ๊ธˆ๋ฐฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด์—ฌ๋„ ๊ตฌ๊ธ€๋ง ํ•ด์„œ ์ฐพ์•„๋ณด๋Š” ์ผ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ˜… ๊ทธ๋ž˜๋„ Tailwind๋ฅผ ์ ์  ์ ์‘์ด ๋˜๋‹ค ๋ณด๋ฉด Styled-Components๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์€ ์ ๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. import ClickButton from './ClickButton'; const ProjectCard = ({ svgFile, projectTitle, }: { svgFile: string; projectTitle: string; }) => { return ( {projectTitle} ); }; export default ProjectCard; ์œ„์— ์ฝ”๋“œ์—์„œ ๋ถ€๋ชจ ํƒœ๊ทธ div์— hoverํ•˜๋ฉด img๊ฐ€ ํฌํ•จ.. 2024. 1. 9.
[TS] ์ง€์ •๋œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์— ๋Œ€ํ•œ ~์œ ํšจํ•œ ํ‚ค์ธ์ง€ TypeScript๊ฐ€ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Element implicitly has an 'any' type because expression of type 'keyof AboutSecondPageDetailType' can't be used to index type '{ agency: string; date: string; subtitle: string; detail: string[]; } | { agency: string; date: string; subtitle: string; detail: string[]; } | { agency: string; date: string; detail: string[]; }'. Property 'education' does not exist on type '{ agency: string; date: stri.. 2024. 1. 3.
[React] Link๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํ”„๋ฆฌํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ํด๋ฆญํ•  ๋•Œ, ์งˆ๋ฌธ ์ƒ์„ธํŽ˜์ด์ง€์— ํ•ด๋‹น ์งˆ๋ฌธ ๋ฐ์ดํ„ฐ๋“ค์„ ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์— props๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ๋Š” ๋งŽ์ด ํ•˜์˜€๋Š”๋ฐ, react-router-dom์˜ Link ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š” ํƒœ๊ทธ๋Š” ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ• ์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. React Router ๊ณต์‹๋ฌธ์„œ์—์„œ ๋ณด๋ฉด Link ํ˜น์€ Navigate์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฒˆ์— ๋‚˜๋Š” Link๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. state state ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ ์ƒํƒœ ๋‚ด์— ์ €์žฅ๋˜๋Š” ์ƒˆ ์œ„์น˜์— ๋Œ€ํ•œ ์ƒํƒœ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๋‚˜์ค‘์— useLocation()์„ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. let { state } = useLocation(); ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ .. 2023. 6. 18.
[typescript ์—ด๊ฑฐํ˜•,์ธํ„ฐํŽ˜์ด์Šค,type,class] ์—ด๊ฑฐํ˜• enum NumberColor { RED = 0, GREEN = 1, BLUE = 2, }; enum StringColor { RED = 'red', GREEN = 'green', BLUE = 'blue', }; ์ธํ„ฐํŽ˜์ด์Šค // Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. interface Todo { id: number; content: string; isDone: boolean; } // Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” todos๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. let todos: Todo[] = []; // Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” addTodo๋ฅผ ์™„์„ฑํ•ฉ๋‹ˆ๋‹ค. function addTodo(todo: Todo) { todos = [...todos, todo]; } // Todo ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š” .. 2023. 5. 31.
[typescript ํƒ€์ž…] 1. ๊ธฐ๋ณธ ํƒ€์ž… interface kimcoding { name: string; age: number; } interface parhacker { name: string; age: string; } function printAge(person: kimcoding | parhacker) { let age; if (typeof person.age === 'number' || typeof person.age === 'string') { age = person.age.toString(); } console.log(`${person.name}์˜ ๋‚˜์ด๋Š” ${age}์‚ด ์ž…๋‹ˆ๋‹ค.`); } const kimcoding = { name: '๊น€์ฝ”๋”ฉ', age: 30, }; const parhacker = { name: '๋ฐ•.. 2023. 5. 30.
[typescript ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•] TypeScript ํ™˜๊ฒฝ ๊ตฌ์„ฑ 1. ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. mkdir (ํด๋”๋ช…) cd (ํด๋”๋ช…) 2. ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋” ์•ˆ์œผ๋กœ ์ด๋™ํ•œ ๋’ค, ํ„ฐ๋ฏธ๋„์—์„œ npm init -y ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค. npm init : ์ƒˆ๋กœ์šด Node.js ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉ -y : ๋ชจ๋“  ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์ธ "yes"๋กœ ์‘๋‹ตํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์—†์ด ๋น ๋ฅด๊ฒŒ ์ดˆ๊ธฐํ™”๋œ package.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3. ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ npm ์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ด์ œ TypeScript๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. npm install typescript --save-dev npm install [ํŒจํ‚ค์ง€๋ช…] --save-dev : package.json ํŒŒ.. 2023. 5. 30.
useState ๋™์ž‘์›๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ react์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค. ๊ธฐ๋ณธ ๊ฐœ๋…๋“ค์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž. useState useState๋กœ ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. const [state, setState] = useState(initialState) ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์—๋Š” ๋‘ ๋ฒˆ์งธ ์š”์†Œ์—๋Š” ๋‚˜๋Š” setState๊ฐ€ state ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค.. ํ•˜์ง€๋งŒ const๋กœ ์„ ์–ธํ•˜์˜€์œผ๋‹ˆ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋ฆฌ๋Š” ์—†๋‹ค. ๐Ÿคจ ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š”๊ฑธ๊นŒ? import {useState} from 'react' ์šฐ๋ฆฌ๋Š” useState๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ react ๋ชจ๋“ˆ์—์„œ useState๋ฅผ named import ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๐Ÿ”ฝ default / named ์ฐธ๊ณ ํ•  ๊ธ€ ๋”๋ณด๊ธฐ https://medium.com/@_d.. 2023. 5. 25.
์ฝ”๋“œ ๋ถ„ํ• (Code Spliting) / React.lazy()์™€ Suspense React v18 ์ตœ๊ทผ React๊ฐ€ 18 ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ ๋งŽ์€ ๋ถ€๋ถ„์ด ๋ฐ”๋€Œ์—ˆ๋‹ค. ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™”๋Š” ์ฝ˜์†”์ฐฝ์— ๊ฒฝ๊ณ ๋ฌธ์ด ๋ณด์ธ๋‹ค. => ์ด์ œ ๋” ์ด์ƒ ReactDOM.render๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚ด์šฉ์ด๋‹ค. React v18 ์ด์ „ index.js const rootElement = document.getElementById('root'); ReactDOM.render(, rootElement); React v18 index.js import {createRoot} from "react-dom/client"; const rootElement = document.getElementById("root") const root = createRoot(rootElement); root.render(.. 2023. 5. 23.
[ OAuth ] OAuth ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์†Œ์…œ ๋กœ๊ทธ์ธ ์ธ์ฆ ๋ฐฉ์‹์€ OAuth 2.0 ๊ธฐ์ˆ ๋กœ ๊ตฌํ˜„๋จ. OAuth๋Š” ์ธ์ฆ์šธ ์ค‘๊ฐœํ•ด ์ฃผ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜. => ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์›น ์„œ๋น„์Šค (Naver, Google, Kakao ...)์—์„œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ๋Œ€์‹  ํ•ด์ฃผ๊ณ , ์ ‘๊ทผ ๊ถŒํ•œ์— ๋Œ€ํ•œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ ํ›„, ์ด๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„์—์„œ ์ธ์ฆ์ด ๊ฐ€๋Šฅ OAuth ์ฃผ์ฒด Resurce Owner ์‚ฌ์šฉ์ž Application ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ™œ์šฉํ•ด ์ด์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ƒˆ๋กœ์šด ์„œ๋น„์Šค Resurce Server & Authorization Server ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ Resource Server๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ ์„œ๋น„์Šค์˜ ์„œ๋ฒ„ ์ค‘ ์ธ์ฆ์„ ๋‹ด๋‹นํ•จ๋Š” ์„œ๋ฒ„๋ฅผ Authorization Server๋ผ ํ•œ.. 2023. 5. 4.
TIL - [Token/JWT] ํ† ํฐ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ ์ž ๊ณ ์•ˆ๋จ. => ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ์ €์žฅ. ๊ทธ๋ž˜์„œ ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ๊ฐ๊ฐ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฐ์ง€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ. ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹ ํ๋ฆ„ ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ์ค‘์—์„œ ๊ฐœ๋ฐฉํ˜•์ด๊ณ  ์›น์—์„œ ๋„๋ฆฌ ์“ฐ์ด๋Š” JWT๊ฐ€ ์žˆ๋‹ค. JWT (Json Wep Token) json ๊ฐ์ฒด์— ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ํ† ํฐ์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์„ฑ Header : HTTP ํ—ค๋”์ฒ˜๋Ÿผ ํ† ํด ์ž์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค. ํ† ํฐ์˜ ์ข…๋ฅ˜, ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ €์žฅ { "alg": "HS256", "typ": "JWT" } Payload : ์ „๋‹ฌํ•˜๋ ค๋Š” ๋‚ด์šฉ๋ฌผ์„ .. 2023. 5. 4.
728x90