Frontend ๐Ÿ“š/React

[React] controlled pattern, uncontrolled pattern etc.

leejaejae 2024. 7. 25. 10:16

1. LCP ๋ž€

  • LCP(Large Contentful Paint)
    • ์›น ํŽ˜์ด์ง€์—์„œ ๊ฐ€์žฅ ํฐ ์ฝ˜ํ…์ธ  ์š”์†Œ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ
    • ์›น ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ธ์‹์„ ๋ฐ˜์˜ํ•˜๊ณ  ์›น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ฐธ์—ฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ์ง€ํ‘œ์ž„!
  • LCP๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด
    • lazy load, ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋ฐ ํ˜•์‹ ์ตœ์ ํ™”, CDN(์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ) ๋“ฑ์˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ์ด๋ฏธ์ง€ ๋ฐ ๋น„๋””์˜ค์™€ ๊ฐ™์€ ๋Œ€์šฉ๋Ÿ‰ ์ฝ˜ํ…์ธ  ์š”์†Œ์˜ ๋กœ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
    • HTML, CSS ๋ฐ JS ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์˜ ์ „์ฒด ๋กœ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
  • Chrome DevTools์˜ Lighthouse ๊ฒ€์‚ฌ ๋˜๋Š” WebPageTest์™€ ๊ฐ™์€ ๋„๊ตดใ„น ์‚ฌ์šฉํ•ด ์›น ํŽ˜์ด์ง€์˜ LCP๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Œ

 

2. FCP ๋ž€

  • FCP(First Contentful Paint)
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ํŽ˜์ด์ง€์˜ ์ฒซ ๋ฒˆ์งธ ์ฝ˜ํ…์ธ  ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ
    • ๋‚ด์šฉ ์š”์†Œ๋Š” ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์œ ํ˜€์œผ์ด ๋‚ด์šฉ์ผ ์ˆ˜ ์žˆ์Œ
    • FCP๋Š” ์›น ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ธ์‹์„ ๋ฐ˜์˜ํ•˜๊ณ  ์›น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ฐธ์—ฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ์ง€ํ‘œ์ž„
  • FCP๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด
    • HTML, CSS ๋ฐ JS ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ท ํŽ˜์ด์ง€ ๋กœ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋˜ํ•œ ๋กœ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์œ„์˜ ๋‚ด์šฉ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฆฌ์†Œ์Šค์˜ ๋กœ๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ

 

3. Controlled Pattern ์ด๋ž€

  • Controlled Pattern
    • ํผ ์š”์†Œ์˜ ์ƒํƒœ๋ฅผ React ์ปดํฌ๋„ŒํŠธ์˜ state๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
    • ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด React๊ฐ€ ํผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
    • ๋ณต์žกํ•œ ํผ์ด๋‚˜ ๋™์ ์ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉ
  • Controlled Pattern์˜ ์ฃผ์š” ํŠน์ง•
    • ์ƒํƒœ ๊ด€๋ฆฌ
      - ํผ ์š”์†Œ์˜ ๊ฐ’์„ React์˜ state๋กœ ๊ด€๋ฆฌํ•จ
      - ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ state๋ฅผ ์—…๋ฐ์ดํŠธ
    • ๊ฐ’ ์„ค์ •
      - ํผ ์š”์†Œ์˜ value ์†์„ฑ์„ state ๊ฐ’์œผ๋กœ ์„ค์ •
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง
      - onChange ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•˜๊ณ  state๋ฅผ ์—…๋ฐ์ดํŠธ
  • Controlled Pattern์˜ ์žฅ์ 
    • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ: React๊ฐ€ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•˜๋ฏ€๋กœ UI์™€ ์ƒํƒœ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅ
    • ์ฆ‰์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ฆ‰์‹œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณต
    • ์กฐ๊ฑด๋ถ€ ๋น„ํ™œ์„ฑํ™”: ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ํผ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ๋น„ํ™œ์„ฑํ™”
    • ๊ฐ’ ํฌ๋งทํŒ…: ์ž…๋ ฅ๊ฐ’์„ ์ฆ‰์‹œ ํฌ๋งทํŒ…ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ฃผ์˜์‚ฌํ•ญ
    • ์„ฑ๋Šฅ: ๋งŽ์€ ์ˆ˜์˜ ํผ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฐ ์ž…๋ ฅ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ
    • ๋ณต์žก์„ฑ: ๊ฐ„๋‹จํ•œ ํผ์˜ ๊ฒฝ์šฐ Uncontrolled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Œ
import React, { useState } from 'react';

function ControlledForm() {
  const [inputValue, setInputValue] = useState('');

  const handleChange = (event) => {
    setInputValue(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log('Submitted value:', inputValue);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type='text' value={inputValue} onChange={handleChange} />
      <button type='submit'>Submit</button>
    </form>
  );
}

 

4. Uncontrolled Pattern ์ด๋ž€

  • Uncontrolled Pattern
    • React์—์„œ ํผ ์š”์†Œ์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ React์˜ state๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , DOM์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹
    • ์ฃผ๋กœ ref๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ๋งŒ DOM์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
    • ๊ฐ„๋‹จํ•œ ํผ์ด๋‚˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ๋˜๋Š” ๋น„-React ์ฝ”๋“œ์™€์˜ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉ
    • ํ•˜์ง€๋งŒ React ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Controlled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Œ!
  • Uncontrolled Pattern์˜ ์ฃผ์š” ํŠน์ง•
    • ์ƒํƒœ ๊ด€๋ฆฌ
      - React์˜ state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  DOM์ด ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ
      - ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ref๋ฅผ ํ†ตํ•ด DOM์—์„œ ๊ฐ’์„ ์ฝ์–ด์˜ด
    • ๊ฐ’ ์„ค์ •
      - ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๋ฉด defaultValue ์†์„ฑ์„ ์‚ฌ์šฉ
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง
      - onChange ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์Œ
  • Uncontrolled Pattern์˜ ์žฅ์ 
    • ๊ฐ„๋‹จ์„ฑ: ๊ฐ„๋‹จํ•œ ํผ์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
    • ์„ฑ๋Šฅ: React์˜ state๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ž…๋ ฅ ์‹œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ†ตํ•ฉ: React ์™ธ๋ถ€์˜ DOM ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ†ตํ•ฉํ•˜๊ธฐ ์‰ฌ์›€
    • ํŒŒ์ผ ์ž…๋ ฅ: file input๊ณผ ๊ฐ™์ด ์ฝ๊ธฐ ์ „์šฉ ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉ
  • ์ฃผ์˜์‚ฌํ•ญ
    • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: ์ฆ‰๊ฐ์ ์ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋‚˜ ์ž…๋ ฅ๊ฐ’ ๋ณ€ํ™˜์ด ์–ด๋ ค์›€
    • ๋™์  UI: ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ UI๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ค์›€
    • ๊ฐ’ ์ดˆ๊ธฐํ™”: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ค์›€