• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2025.08.31React

๐ŸŽฎ Controlled์™€ Uncontrolled - ๋ฆฌ์•กํŠธ ํผ ์ปดํฌ๋„ŒํŠธ ์ดํ•ดํ•˜๊ธฐ

ํผ์„ ๋งŒ๋“ค ๋•Œ ์ƒํƒœ๋ฅผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ Controlled ๋ธŒ๋ผ์šฐ์ € DOM์— ๋งก๊ธฐ๋Š” ๊ฒƒ์„ Uncontrolled ๋ผ๊ณ  ํ•œ๋‹ค. 

๋‘ ๋ฐฉ์‹์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. 
 


[๊ธฐ๋ณธ ๊ฐœ๋…] 

์ œ์–ด ์ปดํฌ๋„ŒํŠธ(Controlled Component) 

์ž…๋ ฅ๊ฐ’์˜ ๋‹จ์ผ ์†Œ์Šค๋ฅผ ๋ฆฌ์•กํŠธ state๋กœ ๋‘์–ด ๋ Œ๋”๋ง ์‹œ input value๊ฐ€ ์ฑ„์›Œ์ง€๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํƒ€์ดํ•‘ ํ•˜๋ฉด onChange ํ•จ์ˆ˜๋กœ state๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. 
 

javascript
import { useState } from 'react';

export default function Controlled() {
  const [name, setName] = useState('');
  
  return (
    <label>
      ์ด๋ฆ„
      <input
        type="text"
        value={name}
        onChange={(e) => setName(e.target.value)}
      />
    </label>
  );
}

 

๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ(Uncontrolled Component) 

์ž…๋ ฅ๊ฐ’์˜ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๋Š” DOM์ด ๋ณด์œ ํ•˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์€ defaultValue/defaultChecked๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ref.current.value ๋˜๋Š” FormData๋กœ ๊ฐ’์„ ์ฝ์–ด์˜จ๋‹ค. 
 

javascript
import { useRef } from 'react';

export default function Uncontrolled() {
  const inputRef = useRef(null);
  
  function handleSubmit(e) {
    e.preventDefault();
    const value = inputRef.current?.value ?? '';
    alert('์ž…๋ ฅ๊ฐ’: ' + value);
  }
  
  return (
    <form onSubmit={handleSubmit}>
      <label>
        ์ด๋ฆ„
        <input 
          type="text"
          defaultValue="BlueCool"
          ref={inputRef}
        />
      </label>
      <button type="submit">๋“ฑ๋ก</button>
    </form>
  );
}


ํŒŒ์ผ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์ƒ value๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค์ƒ Uncontrolled์—ฌ์•ผ ํ•œ๋‹ค. 
 

javascript
import { useRef } from 'react';

function FileInput() {
  const ref = useRef(null);
  
  return (
    <div>
      <input type="file" ref={ref} />
      <button 
        onClick={() => {
          if (ref.current) ref.current.value = '';
        }}
      >
      ์ดˆ๊ธฐํ™”
      </button>
    </div>
  );
}

 



์ œ์–ด ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ state๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ์ตœ์‹ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ž…๋ ฅ ์ฆ‰์‹œ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž…๋ ฅ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜ ์„ฑ๋Šฅ ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”, ๊ฒ€์ฆ, ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒŒ์ผ ์ž…๋ ฅ ํ˜น์€ ํƒ€์ดํ•‘ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. 

์ด์ „ ๊ธ€
๐Ÿž JPA N+1 ๋ฌธ์ œ - Fetch Join & EntityGraph
๋‹ค์Œ ๊ธ€
๐Ÿค ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๊ฐ€์ด๋“œ
์žฅ์‹์šฉ ๋กœ๊ณ