๐Ÿ“˜

14. useId

14.1 useId๋ž€?

14.1.1 useId ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ๊ตฌ์กฐ

ย 
useId๋ž€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋งํ•  ๋•Œ ์•ˆ์ •์ ์œผ๋กœ ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ์จ React์— ๋‚ด์žฅ๋œ Hook์ž…๋‹ˆ๋‹ค. HTML์—์„œ ID๋Š” style sheet์—์„œ ํŠน์ • style ์„ ์–ธ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, JavaScript์—์„œ ํŠน์ • ID๋ฅผ ๊ฐ€์ง„ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. React์—์„œ๋„ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ๋ชจ๋‘ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” HTML๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, React ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ID๋ฅผ HTML๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
React์—์„œ useId๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ Hook์„ ๊ฐ€์ ธ์˜ค๊ณ , ์‚ฌ์šฉํ•  ๊ฐ’์„ ์„ ์–ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
import { useId } from "react";
useId ๊ฐ€์ ธ์˜ค๊ธฐ
ย 
const id = useId();
์ปดํฌ๋„ŒํŠธ ์•ˆ์— useId๋กœ ์‚ฌ์šฉํ•  ๊ฐ’ ์„ ์–ธํ•˜๊ธฐ
ย 

14.1.2 useId๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

ย 
useId๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” useId๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ฒฌ๊ณ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ useId๋Š” : ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ ID์˜ ํŠน์ง•์„ ๋ณด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
  1. ํ•œ ํŽ˜์ด์ง€์—์„œ ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ ID๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•œ ๋ฌธ์„œ ์•ˆ์— ๋™์ผํ•œ ID ๊ฐ’์„ ํฌํ•จํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. useId๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด React์—์„œ ์ž‘์„ฑํ•œ ID๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  1. ID๋Š” ID๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์•ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. useId๋กœ ID๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ํ•ด๋‹น ID ์š”์†Œ์˜ ์ •๋ณด์™€๋Š” ๊ด€๋ จ ์—†์ด ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. useId๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ๋žœ๋”๋ง๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ณ€ํ™”์—๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ID์˜ ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

14.1.3. useId ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

useId๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•ด์•ผํ•  ์ƒํ™ฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
  1. useId๋Š” ๋ฃจํ”„ ํ˜น์€ ์กฐ๊ฑด ๋‚ด์—์„œ ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. useId๋Š” Hook์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ์š”์†Œ์—์„œ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  1. ์ƒ์„ฑ๋œ ID๋Š” CSS ์„ ํƒ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. useId๋ฅผ ์ด์šฉํ•ด ID๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ :r1:, :r2: ์ฒ˜๋Ÿผ ์ฝœ๋ก ์„ ํฌํ•จํ•˜๋Š” ๊ฐ’์„ ID๋กœ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค. CSS ์„ ํƒ์ž์—์„œ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— CSS ์„ ํƒ์ž๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ, useId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ useRef๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  1. ๋งค๋ฒˆ ๊ณ ์œ  ID๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฐ’์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชฉ๋ก์˜ key๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
ย 

14.2 useId ์‹ค์šฉ ์˜ˆ์ œ

useId๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณ ์œ ์˜ ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” useId๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

14.2.1. useId ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

ย 
App.jsx๋Š” useId๋กœ ์ฒดํฌ๋ฐ•์Šค์— ID๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , Child ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ย 
import React, { useId } from 'react'; import Child from './Child'; function App() { const id = useId(); return ( <> <label htmlFor={id}>App check</label> <input type="checkbox" id={id} /> <Child /> <Child /> <Child /> </> ); } export default App;
App.jsx
ย 
Child ์ปดํฌ๋„ŒํŠธ ๋˜ํ•œ ์œ„์™€ ๊ฐ™์ด ์ฒดํฌ๋ฐ•์Šค์— useId๋ฅผ ์ด์šฉํ•˜์—ฌ ์•„์ด๋””๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
import React, { useId } from 'react'; function Child() { const id = useId(); return ( <> <br /> // ์ค„๋ฐ”๊ฟˆ ์œ„ํ•œ ์ฝ”๋“œ <label htmlFor={id}>Child Check</label> <input type="checkbox" id={id} /> </> ); } export default Child;
Child.jsx
ย 
๊ทธ๋ฆผ 14-1๊ทธ๋ฆผ 14-1
๊ทธ๋ฆผ 14-1
ย 
ํ•ด๋‹น ์ฝ”๋“œ๋“ค์˜ ID๊ฐ’์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋ฅผ ํ™•์ธํ•˜๋ฉด, ๊ฐ™์€ Child ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ์ด์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊ฐ๊ฐ ๋‹ค๋ฅธ ID๊ฐ’์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ useId๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ™์€ ํŽ˜์ด์ง€์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ๋ Œ๋”๋ง ๋˜๋”๋ผ๋„ ์ผ์ผ์ด ๋‹ค๋ฅธ ID๋ฅผ ์ง์ ‘ ๋„ฃ์ง€ ์•Š๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ณ ์œ ํ•œ ID๊ฐ’์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

14.2.2 (์‹ค์Šต 1) ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ ์‹œ ๋‹ค๋ฅธ ์•„์ด๋”” ์ƒ์„ฑํ•˜๊ธฐ

useId๋Š” input ์š”์†Œ์™€ label์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋“ฑ HTML ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ useId๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
function NameForm() { return ( <> <label htmlFor="name">์ด๋ฆ„</label> <input id="name" type="text" /> </> ); } function App() { return ( <> <NameForm /> <NameForm /> <NameForm /> </> ); } export default App;
App.jsx
ย 
๊ทธ๋ฆผ 14-2๊ทธ๋ฆผ 14-2
๊ทธ๋ฆผ 14-2
ย 
์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ์—†์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ID๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž…๋ ฅ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ID๋Š” ๊ณ ์œ ํ•œ ID๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, 3๋ฒˆ์งธ input์˜ label์„ ํด๋ฆญํ•˜๋”๋ผ๋„ ํ•ด๋‹น label๊ณผ ์—ฐ๊ฒฐ๋œ input ์š”์†Œ ๋Œ€์‹  ์ฒซ ๋ฒˆ์งธ input ์š”์†Œ์— focus๊ฐ€ ๋งž์ถฐ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด useId๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
import { useId } from 'react' function NameForm() { const id = useId(); return ( <> <label htmlFor={id}>์ด๋ฆ„</label> <input id={id} type="text" /> </> ); } function App() { return ( <> <NameForm /> <NameForm /> <NameForm /> </> ); } export default App;
App.jsx - useId ํ™œ์šฉ
ย 
๊ทธ๋ฆผ 14-3๊ทธ๋ฆผ 14-3
๊ทธ๋ฆผ 14-3
ย 
์ด์ฒ˜๋Ÿผ useId๋ฅผ ํ†ตํ•ด ID๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง ๋˜๋”๋ผ๋„ ๊ณ ์œ ํ•œ ID ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ID์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์›ํ•˜๋Š” ๋งŒํผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

14.2.3 (์‹ค์Šต 2) ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋‹ค๋ฅธ ์•„์ด๋”” ์ƒ์„ฑํ•˜๊ธฐ

ย 
import { useId } from 'react' function App() { const id = useId(); return ( <div> <label htmlFor={id + '-nickname'}> ๋‹‰๋„ค์ž„ </label> <div> <input id={id + '-nickname'} type="text" /> </div> <label htmlFor={id + '-password'}> ๋น„๋ฐ€๋ฒˆํ˜ธ </label> <div> <input id={id + '-password'} type="password" /> </div> </div> ); } export default App;
App.jsx
์œ„ ์˜ˆ์ œ์—์„œ ๋ณด์‹œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด useId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ์ ์œผ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ID๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  n๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ID๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด useId๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ useId๋ฅผ ๋งŒ๋“ค์–ด ๊ณ ์œ ํ•œ ๋™์ ์ธ ID๋ฅผ ๋งŒ๋“ค๊ณ  ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์•„์ด๋””๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์˜ˆ์ œ์—์„œ ๋‹‰๋„ค์ž„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ์ฐฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ useId๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ id๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  โ€˜-nicknameโ€™๊ณผ โ€˜-passwordโ€™๋ผ๋Š” ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ID๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
ย 
๊ทธ๋ฆผ 14-4๊ทธ๋ฆผ 14-4
๊ทธ๋ฆผ 14-4
๊ทธ๋ฆผ 14-5๊ทธ๋ฆผ 14-5
๊ทธ๋ฆผ 14-5
ย 
์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
id + '-nickname' ์€ :r0: -nickname ์œผ๋กœ ๋ Œ๋”๋ง๋˜๊ณ  id + '-password' ๋Š” :r0: -password ๋กœ ๋ Œ๋”๋ง๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ™์€ useId๋กœ ์ƒ์„ฑํ•œ ID๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์ด๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ID๋กœ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย