Post

Controlled Component์™€ Uncontrolled Component

Controlled Component์™€ Uncontrolled Component

๐Ÿงฉ Controlled Component๋ž€?

Controlled Component(์ œ์–ด ์ปดํฌ๋„ŒํŠธ)๋Š” ์ž…๋ ฅ ์š”์†Œ์˜ ๊ฐ’(value)์„ ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ(state)๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์ฆ‰, ์ž…๋ ฅ ๊ฐ’์˜ ์ฃผ๋„๊ถŒ์ด DOM์ด ์•„๋‹Œ ๋ฆฌ์•กํŠธ์— ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ๊ฐ€ ์ž…๋ ฅ ์š”์†Œ์˜ ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์„ ๋ณ€๊ฒฝํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React, { useState } from "react";

function ControlledInput() {
  const [name, setName] = useState("");

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setName(e.target.value);
  };

  return (
    <div>
      <input type="text" value={name} onChange={handleChange} />
      <p>์ž…๋ ฅ๊ฐ’: {name}</p>
    </div>
  );
}

export default ControlledInput;

โœ… ํŠน์ง•

  • value๊ฐ€ ํ•ญ์ƒ ๋ฆฌ์•กํŠธ ์ƒํƒœ(state)์™€ ๋™๊ธฐํ™”๋จ
  • ์‹ค์‹œ๊ฐ„ ์ž…๋ ฅ ๊ฒ€์ฆ, ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋“ฑ ๋ณต์žกํ•œ ํผ ๋กœ์ง ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋ฆฌ์•กํŠธ ์ƒํƒœ๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿงฉ Uncontrolled Component๋ž€?

Uncontrolled Component(๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ)๋Š” ์ž…๋ ฅ ์š”์†Œ์˜ ๊ฐ’์ด DOM ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰, ๋ฆฌ์•กํŠธ๊ฐ€ ๊ฐ’์„ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  DOM์— ์œ„์ž„ํ•˜๋Š” ๊ตฌ์กฐ์ฃ .

์ด๋•Œ๋Š” ref๋ฅผ ์‚ฌ์šฉํ•ด DOM์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React, { useRef } from "react";

function UncontrolledInput() {
  const inputRef = useRef<HTMLInputElement>(null);

  const handleSubmit = () => {
    alert(`์ž…๋ ฅ๊ฐ’: ${inputRef.current?.value}`);
  };

  return (
    <div>
      <input type="text" ref={inputRef} />
      <button onClick={handleSubmit}>์ œ์ถœ</button>
    </div>
  );
}

export default UncontrolledInput;

โœ… ํŠน์ง•

  • ์ž…๋ ฅ ๊ฐ’์ด DOM์—์„œ ๊ด€๋ฆฌ๋˜์–ด ๋ฆฌ์•กํŠธ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋น„์šฉ์ด ์—†์Œ
  • useRef๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•จ
  • ๋‹จ์ˆœ ์ž…๋ ฅ/์ œ์ถœ ํผ์— ์ ํ•ฉ

๐Ÿง  Controlled vs Uncontrolled ํ•œ๋ˆˆ์— ๋น„๊ต

๊ตฌ๋ถ„Controlled ComponentUncontrolled Component
์ž…๋ ฅ ๊ฐ’ ๊ด€๋ฆฌ ์ฃผ์ฒดReact stateDOM
๊ฐ’ ์ ‘๊ทผ ๋ฐฉ์‹state ๋ณ€์ˆ˜ref (DOM ์ง์ ‘ ์ ‘๊ทผ)
์ฃผ์š” ์ด๋ฒคํŠธonChangeonSubmit ์‹œ์  ๋“ฑ
์‹ค์‹œ๊ฐ„ ๊ฒ€์ฆ/์ œ์–ด๊ฐ€๋Šฅ๋ถˆ๊ฐ€๋Šฅ ๋˜๋Š” ๋ณต์žก
์„ฑ๋Šฅ ๋ถ€๋‹ด๋‹ค์†Œ ์žˆ์Œ (์ƒํƒœ ์—…๋ฐ์ดํŠธ)์ƒ๋Œ€์ ์œผ๋กœ ์ ์Œ
์ ํ•ฉํ•œ ์ƒํ™ฉ์‹ค์‹œ๊ฐ„ ์ž…๋ ฅ ๊ฒ€์ฆ, ๋™์  UI๋‹จ์ˆœ ์ž…๋ ฅ, ์ œ์ถœ ์‹œ ๊ฐ’๋งŒ ํ•„์š”ํ•  ๋•Œ

์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์„ ์จ์•ผ ํ• ๊นŒ?

  1. Controlled Component๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

    • ์ž…๋ ฅ ์‹œ๋งˆ๋‹ค ์œ ํšจ์„ฑ ๊ฒ€์ฆ, ํฌ๋งทํŒ…, ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๋‹ค์ค‘ ์ž…๋ ฅ ํ•„๋“œ ๊ฐ„ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ฆ‰์‹œ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ†’ ์˜ˆ: ๋กœ๊ทธ์ธ ํผ, ํšŒ์›๊ฐ€์ž… ํผ, ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์ฐฝ ๋“ฑ
  2. Uncontrolled Component๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

    • ๋‹จ์ˆœํžˆ ํ•œ ๋ฒˆ์— ๊ฐ’์„ ์ œ์ถœ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ํผ
    • ๋ฆฌ๋ Œ๋”๋ง ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์‹ถ์„ ๋•Œ
    • React ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(FormData, Vanilla JS)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ โ†’ ์˜ˆ: ๊ฐ„๋‹จํ•œ ์ด๋ฉ”์ผ ๊ตฌ๋… ํผ, ํŒŒ์ผ ์—…๋กœ๋“œ ํผ ๋“ฑ

๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

Controlled Component์™€ Uncontrolled Component๋Š” ๋ฆฌ์•กํŠธ ํผ ๊ด€๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ถ•์ด๋‹ค.

  • Controlled: ๋ฆฌ์•กํŠธ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌ โ†’ ์ •๊ตํ•˜์ง€๋งŒ ๋ณต์žก
  • Uncontrolled: DOM์ด ๊ด€๋ฆฌ โ†’ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ œ์–ด ์–ด๋ ค์›€

ํผ์ด ๋ณต์žกํ• ์ˆ˜๋ก Controlled ๋ฐฉ์‹์ด ์œ ๋ฆฌํ•˜๊ณ , ๋‹จ์ˆœ ์ž…๋ ฅ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Uncontrolled ๋ฐฉ์‹์ด ํšจ์œจ์ ์ž„.


END

This post is licensed under CC BY 4.0 by the author.