๋ฐ˜์‘ํ˜•

Frontend/React 11

React | ๋ Œ๋”๋ง ์ฃผ๊ธฐ - ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋‹จ๊ณ„ (Error Handling)

์—๋Ÿฌ ๊ฒฝ๊ณ„ (Error Boundary) React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ํ•˜์œ„์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๋ถ€๋ถ„์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ตœ์ƒ์œ„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—๋Ÿฌ ๊ฒฝ๊ณ„๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ผ๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋กœ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค. static getDerivedStateFromError() ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ ๋˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ด๋‹ค. ์—๋Ÿฌ ์ƒํƒœ๋ฅผ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. componentDidCatch() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ..

Frontend/React 2023.12.05

React | ๋ Œ๋”๋ง ์ฃผ๊ธฐ - ์ œ๊ฑฐ ๋‹จ๊ณ„ (Unmounting)

componentWillUnmount() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์–ธ๋งˆ์šดํŠธ(์ œ๊ฑฐ) ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ๋ฆฌ์†Œ์Šค ํ•ด์ œ, ํƒ€์ด๋จธ ์ œ๊ฑฐ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ ๋“ฑ ์ปดํฌ๋„ŒํŠธ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค. import React, { Component } from 'react'; class MyComponent extends Component { constructor(props) { super(props); this.state = { timerId: null, }; } componentDidMount() { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ํ›„์— ํƒ€์ด๋จธ๋ฅผ ์„ค์ • const timerId = setInterval(() => { console.log('Timer is ticking...'); }, 1000..

Frontend/React 2023.12.04

React | ๋ Œ๋”๋ง ์ฃผ๊ธฐ - ์—…๋ฐ์ดํŠธ ๋‹จ๊ณ„ (Updating)

static getDerivedStateFromProps() props๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™” ํ•˜๊ณ ์ž ํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋งˆ์šดํŠธ ์ดํ›„์—๋„ props๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ํ˜ธ์ถœํ•œ๋‹ค. shouldComponentUpdate() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ(๋ Œ๋”๋ง) ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. render() ์ปดํฌ๋„ŒํŠธ UI ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. getSnapshotBeforeUpdate() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ์ตœ๊ทผ์— ๋ Œ๋”๋ง ๋œ ๊ฒฐ๊ณผ๊ฐ€ DOM์— ๋ฐ˜์˜๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋‹ค. componentDidUpdate() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋‹ค. import React, { Component } from 'React' class MyCom..

Frontend/React 2023.12.01

React | ๋ Œ๋”๋ง ์ฃผ๊ธฐ - ์ƒ์„ฑ ๋‹จ๊ณ„ (Mounting)

counstructor() ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ์‹œ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋˜๋Š” ์ฒซ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ ์ดˆ๊ธฐ ์ƒํƒœ ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. state getDerivedStateFromProps() props๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™” ํ•˜๊ณ ์ž ํ•  ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ render() ์ปดํฌ๋„ŒํŠธ UI ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. componentDidMount() ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ ๋˜๊ณ  DOM์— ๋งˆ์šดํŠธ ๋˜๊ณ ๋‚œ ์ดํ›„์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ํ˜น์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค. import React, { Component } from 'React' class MyComponent extends Component { constructor(props) { super(props); /..

Frontend/React 2023.11.30

React | ๋ Œ๋”๋ง ์ฃผ๊ธฐ

React์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์ผ€์ด์Šค๋Š” ๋‹ค์–‘ํ•˜๋‹ค. ์ดˆ๊ธฐ ๋ Œ๋”๋ง : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ดˆ๊ธฐ ์ƒ์„ฑ๋˜๊ณ  DOM์— ๋งˆ์šดํŠธ ๋  ๋•Œ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ update ๊ด€๋ จ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ : shouldComponentUpdate, componentDidUpdate ๋“ฑ๋“ฑ.. React ๋ Œ๋”๋ง ์ฃผ๊ธฐ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ ๋ Œ๋”๋ง ๋˜๊ณ , ์—…๋ฐ์ดํŠธ ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค. (์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์†Œ๋ฉธ์— ๊ด€ํ•œ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋ฏ€๋กœ ๊ฐœ๋…์ด ๋‹ค๋ฆ„!) 1. ์ƒ์„ฑ ๋‹จ๊ณ„ (Mounting) counstructor() state getDerivedStateFromProps() render() componentDidMount() R..

Frontend/React 2023.11.29

React | ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(Lifecyle Methods)

์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ex) ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์ œ๊ฑฐ ๋“ฑ๋“ฑ... React์˜ ์ฃผ์š” ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 1. componentDidMount() ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ฆฐ ๋œ ์งํ›„์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ฃผ๋กœ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ดˆ๊ธฐํ™” ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค. import React, { Component } from 'react'; class MyComponent extends Component { constructor(props) { super(props); } componentDidMount() { // ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ } render() { return (MyComponent); } } export default MyComp..

Frontend/React 2023.11.28

React | ๊ฐ์ฒด ํƒ€์ž… State ์—…๋ฐ์ดํŠธ

์ „๊ฐœ ์—ฐ์‚ฐ์ž(`...`) ์‚ฌ์šฉ ์ด์ „ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ฎ์–ด์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค. (๋ถˆ๋ณ€์„ฑ ์œ ์ง€) const [myObject, setMyObject] = useState({ name: 'John', age: 25 }); const updateObject = (newData) => { setMyObject((prevObject) => ({ ...prevObject, ...newData, })); }; console.log(updateObject({ age: 26 })); // { name: 'John', age: 26 } Object.assign() Object.assign(target, source1, source2, ...); ์›๋ณธ ๊ฐ์ฒด์—์„œ ์†์„ฑ์„ ๋‹ค๋ฅธ..

Frontend/React 2023.11.27

React | ๋ฐฐ์—ด ํƒ€์ž… State ์—…๋ฐ์ดํŠธ

State์—๋Š” JavaScript์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค. ex) string, number, boolean, array, object ๋“ฑ๋“ฑ... ๊ทธ ์ค‘ ํ•ต์‹ฌ์€ State ๊ฐ’์ด ๋ถˆ๋ณ€์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ๋ฐฐ์—ด ํƒ€์ž… State ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•์€ ๋งŽ์ง€๋งŒ ์ดํ•˜ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. concat() ์‚ฌ์šฉ ๋ฐฐ์—ด์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” JavaScript ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๋ถˆ๋ณ€์„ฑ ์œ ์ง€) const [myArray, setMyArray] = useState([1, 2, 3]); const addElementConcat = (newElement) => { setMyArra..

Frontend/React 2023.11.24

React | ๋ณ€์ˆ˜ vs State

๋ณ€์ˆ˜ ๊ฐ’์„ ์ง์ ‘ ํ• ๋‹นํ•˜์—ฌ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ž‘์„ฑ๋œ Component ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์ด๋‹ค. ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ Component๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š”๋‹ค. let myVariable = 0; myVariable = 1; State useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋œ State๋Š” setState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ์ž‘์„ฑ๋œ Component ๋‚ด ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. props๋‚˜ context ๋“ฑ์„ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ State ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด Component๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐ ๋œ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ๋™์  UI ๊ตฌํ˜„์„ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. const [myState, setMyState] = useState(0); setMyState(1);

Frontend/React 2023.11.23

React | event (์ด๋ฒคํŠธ) ์— ๋Œ€ํ•ด์„œ

event (์ด๋ฒคํŠธ) ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, html ์—์„œ onclick์€ React์—์„œ onClick์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ž‘์„ฑ๋˜๋ฉฐ, ์ต๋ช…ํ•จ์ˆ˜๋กœ๋„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ต๋ช…ํ•จ์ˆ˜ ๋‚ด์—์„  this๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์œผ๋ฏ€๋กœ bind ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. import React, { Component } from 'react'; class MyComponent extends Component { constructor(props) { super(props); this.state = { buttonName = '์ €์žฅ' }; } handleClick() { console.log(this.state.buttonName, '๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'); } render() { ..

Frontend/React 2023.11.18
๋ฐ˜์‘ํ˜•