Uncontrolled Component

ํผ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ธฐ๋ณธ๊ฐ’(default value)์ด๋‚˜ ์ดˆ๊ธฐ๊ฐ’(initial value)์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งํ•œ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ref๋ฅผ ์‚ฌ์šฉํ•ด DOM ์ž์ฒด์—์„œ ํผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฃจ์–ด ์ง€๋ฉฐ, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  state์˜ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿผ Uncontrolled component๊ฐ€ ๋” ์ข‹์€๊ฑฐ ์•„๋‹ˆ์•ผ? -> ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

1. ์™ธ๋ถ€์—์„œ์˜ ์ œ์–ด

Uncontrolled component์˜ ๊ฒฝ์šฐ, ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ์–ดํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํฌ๋„ŒํŠธ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์ด ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

import React, { useRef } from "react";

function UncontrolledInput() {
  const inputRef = useRef();

  const handleSubmit = (event) => {
    event.preventDefault();
    const inputValue = inputRef.current.value;
    // ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Input:
        <input type="text" ref={inputRef} />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

export default UncontrolledInput;

Controlled component ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” value์™€ onChange prop์„ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ œ์–ดํ•œ๋‹ค.

์™ธ๋ถ€์—์„œ ์ด ์ปดํฌ๋„ŒํŠธ์— ์ž…๋ ฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ.

Controlled component๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๋”๋ผ๋„, ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ ธ์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

Controlled component์˜ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ์œ ํšจํ•œ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ฆ‰์‹œ ์—๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด Uncontrolled component์˜ ๊ฒฝ์šฐ, DOM์—์„œ ์ง์ ‘ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ํผ์„ ์ œ์ถœํ•˜๊ธฐ์œ„ํ•œ ์ด๋ฒคํŠธ ํ•จ์ˆ˜์—์„œ ๊ฒ€์‚ฌ๊ฐ€ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๊ฒ€์‚ฌ๊ฐ€ ์–ด๋ ต๋‹ค.

๋”ฐ๋ผ์„œ, Controlled component๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.

  1. Controlled component๋Š” React์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ธ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š”์ ์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋”์šฑ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

countRef๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๊ฐ’์„ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

handleIncrement์™€ handleDecrement ํ•จ์ˆ˜์—์„œ๋Š” countRef.current๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ค„์ง€์ง€ ์•Š๋Š”๋‹ค. ์ƒํƒœ๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค„ ์ˆ˜๋Š” ์žˆ๋‹ค. -> ๋ณต์žกํ•œ๋ฐ ๊ตณ์ด;

๋”ฐ๋ผ์„œ, Controlled component์™€ Uncontrolled component๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์„ ํƒ๋˜์–ด์•ผ ํ•œ๋‹ค.

Controlled component๋Š” ์ž…๋ ฅ ๊ฐ’์˜ ๊ฒ€์ฆ์ด๋‚˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋ฉฐ, Uncontrolled component๋Š” ๋‹จ์ˆœํ•œ ํผ์˜ ๊ฒฝ์šฐ๋‚˜, ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

Last updated