React Fragment๋ฅผ ๋ง์คํฐํ์ฌ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐํํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ๋ฉฐ, ๋ ๊น๋ํ๊ณ ์๋งจํฑํ UI ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ์ธ์. ์ ์ธ๊ณ React ๊ฐ๋ฐ์๋ฅผ ์ํ ํ์ ๊ฐ์ด๋์ ๋๋ค.
๋งค๋๋ฌ์ด UI ๊ตฌํ: ๋ค์ค ์๋ฆฌ๋จผํธ ๋ฐํ์ ์ํ React Fragment ์ข ํฉ ๊ธ๋ก๋ฒ ๊ฐ์ด๋
๋์์์ด ์งํํ๋ ๊ด๋ํ ์ต์ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ React๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋๋ผ์ด ํจ์จ์ฑ์ผ๋ก ๋ณต์กํ๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ๋ ๊ฑฐ์ธ๊ณผ ๊ฐ์ ์กด์ฌ์ ๋๋ค. React ์ฒ ํ์ ํต์ฌ์๋ UI๋ฅผ ๋ ๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์์ผ ์ฌ๋ฌ ๊ตญ์ ๊ฐ๋ฐํ์ด ์ ํธํ๋ ๋ฐฉ์์ด ๋์์ต๋๋ค.
ํ์ง๋ง ๊ทธ ๋ง๊ฐํ ํ์๋ ๋ถ๊ตฌํ๊ณ React์๋ ๊ฐ๋ฐ์๋ค์ด ํ์ํด์ผ ํ ํน์ ๋ฏธ๋ฌํ ์ฐจ์ด์ ๋ค์ด ์์ต๋๋ค. ์ ์
๊ฐ๋ฐ์์ ์๋ จ๋ ์ ๋ฌธ๊ฐ ๋ชจ๋๊ฐ ๊ฐ์ฅ ์์ฃผ ๋ง์ฃผ์น๋ ๋ฌธ์ ์ค ํ๋๋ React ์ปดํฌ๋ํธ์ render
๋ฉ์๋(๋๋ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ฐํ ๊ฐ)๊ฐ ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ง ๋ฐํํด์ผ ํ๋ค๋ ๋ด์ฌ์ ํ๊ณ์
๋๋ค. ์ฌ๋ฌ ์ธ์ ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ ๋ฐํํ๋ ค๊ณ ์๋ํ๋ฉด ํ์ฐ์ ์ผ๋ก "Adjacent JSX elements must be wrapped in an enclosing tag."(์ธ์ ํ JSX ์๋ฆฌ๋จผํธ๋ ๊ฐ์ธ๋ ํ๊ทธ ์์ ์์ด์ผ ํฉ๋๋ค.)๋ผ๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ฒ๋ผ ์ ํ์ ์ผ๋ก ๋ณด์ด๋ ๊ท์น์๋ React์ ๊ฐ์ DOM์ด ์๋ํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ธ ์ด์ ๊ฐ ์์ผ๋ฉฐ, ๊ทธ ํด๊ฒฐ์ฑ
์ ์ฐ์ํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ๋ฐ๋ก React Fragments์
๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ React Fragment๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ทธ๊ฒ์ ํ์์ฑ, ์ด์ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ ํํค์น๊ณ , ์ค์ ์์ ๋ฅผ ํตํด ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ๋ฉฐ, ์ง๋ฆฌ์ ์์น๋ ํ๋ก์ ํธ ๊ท๋ชจ์ ๊ด๊ณ์์ด ๋ ๊น๋ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ์๋งจํฑ์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด Fragment๋ฅผ ํ์ฉํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
ํต์ฌ ๋ฌธ์ : ์ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ ๋ฐํํ ์ ์๋๊ฐ?
React Fragment์ ์ง๊ฐ๋ฅผ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ๊ทธ๊ฒ์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฅผ ํ์
ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. React ์ปดํฌ๋ํธ์์ JSX๋ฅผ ์์ฑํ ๋, ์ฌ๋ฌ๋ถ์ ์์ HTML์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋๋ค. ๋์ , JSX๋ React.createElement()
๋ฅผ ํธ์ถํ๊ธฐ ์ํ ๋ฌธ๋ฒ์ ์คํ(syntactic sugar)์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ JSX ์ค๋ํซ์:
<div>Hello</div>
๋ค์๊ณผ ์ ์ฌํ ํํ๋ก ๋ณํ๋ฉ๋๋ค:
React.createElement('div', null, 'Hello')
React.createElement()
ํจ์๋ ๊ทธ ์ค๊ณ์ ๋จ์ผ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค. ๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ํ์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ ค๊ณ ํ๋ฉด:
<h1>Welcome</h1>
<p>This is a paragraph.</p>
React์ ๋น๋ ํ๋ก์ธ์ค๋ ์ด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ฃจํธ React.createElement()
ํธ์ถ๋ก ๋ณํํ๋ ค๊ณ ์๋ํ๋๋ฐ, ์ด๋ ๋ด๋ถ์ ์ธ ์ฌ์กฐ์ (reconciliation) ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ํธํ๋์ง ์์ต๋๋ค. ์ค์ DOM์ ๊ฒฝ๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํํ์ธ ๊ฐ์ DOM์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ถ์ ํ๊ธฐ ์ํด ๋จ์ผ ๋ฃจํธ ๋
ธ๋๋ฅผ ํ์๋ก ํฉ๋๋ค. React๊ฐ ํ์ฌ ๊ฐ์ DOM ํธ๋ฆฌ์ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ๋น๊ตํ ๋("diffing"์ด๋ผ ๋ถ๋ฆฌ๋ ๊ณผ์ ), ๊ฐ ์ปดํฌ๋ํธ์ ๋จ์ผ ๋ฃจํธ์์ ์์ํ์ฌ ์ค์ DOM์์ ์
๋ฐ์ดํธํด์ผ ํ ๋ถ๋ถ์ ์๋ณํฉ๋๋ค. ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ฐ๊ฒฐ๋์ง ์์ ๋ฃจํธ๋ฅผ ๋ฐํํ๋ค๋ฉด, ์ด diffing ๊ณผ์ ์ ํจ์ฌ ๋ ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ด๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์์ง ๊ฒ์
๋๋ค.
์ค์ง์ ์ธ ์ํฅ์ ์๊ฐํด ๋ด ์๋ค. ๋ง์ฝ ๊ด๋ จ ์๋ ๋ ๊ฐ์ ์ต์์ ์๋ฆฌ๋จผํธ๊ฐ ์๋ค๋ฉด, React๋ ๊ณตํต ๋ถ๋ชจ ์์ด ์ด๋ป๊ฒ ์ผ๊ด๋๊ฒ ๊ทธ๊ฒ๋ค์ ์๋ณํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์๊น์? ์ฌ์กฐ์ ๊ณผ์ ์ ์ผ๊ด์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ React์ ์ฑ๋ฅ ์ต์ ํ์ ์์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ๋ฐ๋ผ์ "๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ" ๊ท์น์ ์์์ ์ธ ์ ํ์ด ์๋๋ผ React์ ํจ์จ์ ์ธ ๋ ๋๋ง ๋ฉ์ปค๋์ฆ์ ๊ธฐ์ด์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค.
์ผ๋ฐ์ ์ธ ์ค๋ฅ ์์:
๋ํผ(wrapper) ์์ด ๋ง์ฃผํ๊ฒ ๋ ์ค๋ฅ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค:
// MyComponent.js
import React from 'react';
function MyComponent() {
return (
<h3>Title of Section</h3>
<p>Content goes here.</p>
);
}
export default MyComponent;
์ด ์ปดํฌ๋ํธ๋ฅผ ์ปดํ์ผํ๊ฑฐ๋ ์คํํ๋ ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ฐ์ํฉ๋๋ค: "Adjacent JSX elements must be wrapped in an enclosing tag (e.g. <div>...</div> or <>...<>)."(์ธ์ ํ JSX ์๋ฆฌ๋จผํธ๋ ๊ฐ์ธ๋ ํ๊ทธ(์: <div>...</div> ๋๋ <>...<>) ์์ ์์ด์ผ ํฉ๋๋ค.)
React Fragment ์๊ฐ: ์ฐ์ํ ํด๊ฒฐ์ฑ
React 16 ์ด์ ์๋ ๊ฐ๋ฐ์๋ค์ด ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ๋ถํ์ํ <div>
ํ๊ทธ๋ก ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ธ๋ ๋ฐฉ๋ฒ์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์๋ํ์ง๋ง, ์ข
์ข
์์น ์๋ ๋ถ์์ฉ์ ๋ณ์์ต๋๋ค. ์ฆ, ์ถ๊ฐ์ ์ด๊ณ ์๋ฏธ ์๋ ๋
ธ๋๋ก DOM์ ์ค์ผ์ํค๊ณ , CSS ๋ ์ด์์(ํนํ flexbox๋ grid)์ ๋ฐฉํดํ ์ ์์ผ๋ฉฐ, ๋๋ก๋ ์๋งจํฑ์ ์ผ๋ก ๋ถ์ ํํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ๋ ํ์ต๋๋ค. React Fragment๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ์ฐ์ํ ํด๊ฒฐ์ฑ
์ผ๋ก ๋ฑ์ฅํ์ฌ, DOM์ ์ถ๊ฐ ๋
ธ๋๋ฅผ ์์ฑํ์ง ์๊ณ ์ฌ๋ฌ ์์ ์์๋ฅผ ๊ทธ๋ฃนํํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ต๋๋ค.
React Fragment๋ ๋ณธ์ง์ ์ผ๋ก React์๊ฒ ์ค๊ฐ ๋ํผ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ์ง ์๊ณ ์์๋ค์ DOM์ ์ง์ ๋ ๋๋งํ๋๋ก ์ง์ํ๋ ํ๋ ์ด์คํ๋์ ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ๋ฐํ ๊ฐ์ ๋ํ ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๋ฉด์๋ ๊น๋ํ๊ณ ์๋งจํฑํ DOM ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฌธ๋ฒ์ ์คํ์ ๋๋ค. ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฌผ์์ ๋ฌผ๋ฆฌ์ ์ธ ๊ทธ๋ฃนํ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ธฐ๋ณด๋ค๋ ๋ ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃนํ ๋ฉ์ปค๋์ฆ์ผ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
React Fragment ์ฌ์ฉ์ ์ฃผ์ ์ด์ :
- ๋ ๊น๋ํ DOM ๊ตฌ์กฐ: ์ด๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ์ค์ํ ์ฅ์ ์ผ ๊ฒ์
๋๋ค. Fragment๋ ๋ถํ์ํ
<div>
์๋ฆฌ๋จผํธ์ ์ฝ์ ์ ๋ฐฉ์งํ์ฌ, ์๋ํ ์๋งจํฑ ๊ตฌ์กฐ๋ฅผ ๋ ์ ํํ๊ฒ ๋ฐ์ํ๋ DOM์ ๋ง๋ญ๋๋ค. ๋ ๊ฐ๋ฒผ์ด DOM์ ๊ฒ์ฌ, ๋๋ฒ๊น ๋ฐ ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์์ง ์ ์์ต๋๋ค. - ํฅ์๋ ์ฑ๋ฅ: DOM ๋ ธ๋๊ฐ ์ ๋ค๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ด ํ ์ผ์ด ์ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. DOM ํธ๋ฆฌ๊ฐ ์์์๋ก ๋ ์ด์์ ๊ณ์ฐ, ์คํ์ผ๋ง, ํ์ธํ ๊ณผ์ ์ด ๋ ๋นจ๋ผ์ ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ฐ์์ฑ์ด ํฅ์๋ ์ ์์ต๋๋ค. ์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฑ๋ฅ ํฅ์์ด ๋ฏธ๋ฏธํ ์ ์์ง๋ง, ๊น์ ์ปดํฌ๋ํธ ํธ๋ฆฌ, ๋ณต์กํ ๋ ์ด์์, ์ฆ์ ์ ๋ฐ์ดํธ๊ฐ ์๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์๋นํ ์ด์ ์ด ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ธ๊ณ์ ๋ค์ํ ๊ธฐ๊ธฐ ์ฌ์ฉ์์๊ฒ ํํ์ ์ค๋๋ค.
- ์๋งจํฑ HTML ์ ์ง: ํน์ HTML ๊ตฌ์กฐ๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์
๋๋ค. ์๋ฅผ ๋ค์ด,
<table>
์<tbody>
,<thead>
,<tr>
,<td>
์๋ฆฌ๋จผํธ๊ฐ ํน์ ๊ณ์ธต ๊ตฌ์กฐ ๋ด์ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ฌ๋ฌ<td>
๋ฅผ ๋ฐํํ๊ธฐ ์ํด<tr>
๋ด์ ์ถ๊ฐ์ ์ธ<div>
๋ฅผ ๋ฃ์ผ๋ฉด ํ ์ด๋ธ์ ์๋งจํฑ ๋ฌด๊ฒฐ์ฑ๊ณผ ์คํ์ผ๋ง์ด ๊นจ์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. Fragment๋ ์ด๋ฌํ ์ค์ํ ์๋งจํฑ ๊ด๊ณ๋ฅผ ๋ณด์กดํฉ๋๋ค. - CSS ๋ ์ด์์ ๋ฌธ์ ๋ฐฉ์ง: ๋ถํ์ํ ๋ํผ
<div>
๋ CSS ํ๋ ์์ํฌ๋ ์ฌ์ฉ์ ์ง์ ์คํ์ผ์ ๋ฐฉํดํ ์ ์์ผ๋ฉฐ, ํนํ CSS Flexbox๋ Grid์ ๊ฐ์ ๊ณ ๊ธ ๋ ์ด์์ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋ ๊ทธ๋ ์ต๋๋ค.<div>
๋ ์๋์น ์์ ๋ธ๋ก ๋ ๋ฒจ ์ปจํ ์คํธ๋ฅผ ๋์ ํ๊ฑฐ๋ ํ๋ฆ์ ๋ณ๊ฒฝํ์ฌ ์ ์คํ๊ฒ ์ ์๋ ๋์์ธ์ ๋ง๊ฐ๋จ๋ฆด ์ ์์ต๋๋ค. Fragment๋ ์ด๋ฌํ ์ํ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค. - ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์: ๋ฏธ๋ฏธํ์ง๋ง, DOM ๋ ธ๋๊ฐ ์ ์์๋ก ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์ฝ๊ฐ ์ค์ด๋ค์ด ์ ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ฌํฉ๋๋ค.
Fragment๋ฅผ ์ํ ๋ฌธ๋ฒ์ ์คํ: ๋จ์ถ ๋ฌธ๋ฒ
React๋ Fragment๋ฅผ ์ ์ธํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค: ๋ช
์์ ์ธ <React.Fragment>
๊ตฌ๋ฌธ๊ณผ ๋ ๊ฐ๊ฒฐํ ๋จ์ถ ๋ฌธ๋ฒ์ธ <></>
์
๋๋ค.
1. ๋ช
์์ <React.Fragment>
๊ตฌ๋ฌธ:
์ด๊ฒ์ Fragment๋ฅผ ์ฌ์ฉํ๋ ์์ ํ๊ณ ์ฅํฉํ ๋ฐฉ์์
๋๋ค. ํนํ key
prop์ ์ ๋ฌํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค(์ด์ ๋ํด์๋ ๊ณง ๋
ผ์ํ ๊ฒ์
๋๋ค).
// MyComponentWithFragment.js
import React from 'react';
function MyComponentWithFragment() {
return (
<React.Fragment>
<h3>Title of Section</h3>
<p>์ฝํ ์ธ ๊ฐ ์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋๋ค, ์ด์ ์ ๋๋ก ๊ฐ์ธ์ก์ต๋๋ค.</p>
<button>Click Me</button>
</React.Fragment>
);
}
export default MyComponentWithFragment;
์ด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋, ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ <h3>
, <p>
, <button>
์๋ฆฌ๋จผํธ๊ฐ ์ค๊ฐ์ <div>
๋ ์ ์ฌํ ๋ํผ ์์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ ์๋์ ์ง์ ์ ์ธ ํ์ ์์๋ก ํ์๋๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
2. ๋จ์ถ ๋ฌธ๋ฒ <></>
:
React 16.2์ ๋์ ๋ ๋น ํ๊ทธ ๊ตฌ๋ฌธ์ ๊ฐ๊ฒฐํจ๊ณผ ๊ฐ๋ ์ฑ ๋๋ถ์ ๋๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ Fragment๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ข ์ข "๋จ์ถ ๊ตฌ๋ฌธ" ๋๋ "๋น ํ๊ทธ ๊ตฌ๋ฌธ"์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
// MyComponentWithShorthandFragment.js
import React from 'react';
function MyComponentWithShorthandFragment() {
return (
<>
<h3>Another Section Title</h3>
<p>๋ ๋ง์ ์ฝํ ์ธ ๊ฐ ๋งค๋๋ฝ๊ฒ ํตํฉ๋์์ต๋๋ค.</p>
<a href="#">Learn More</a>
</>
);
}
export default MyComponentWithShorthandFragment;
๊ธฐ๋ฅ์ ์ผ๋ก, ๋จ์ถ ๋ฌธ๋ฒ <></>
๋ <React.Fragment></React.Fragment>
์ ๋์ผํ์ง๋ง, ํ ๊ฐ์ง ์ค์ํ ์์ธ๊ฐ ์์ต๋๋ค: ๋จ์ถ ๊ตฌ๋ฌธ์ key
๋ฅผ ํฌํจํ ์ด๋ ํ props๋ ์ง์ํ์ง ์์ต๋๋ค. ์ด๋ Fragment์ key๋ฅผ ํ ๋นํด์ผ ํ ๊ฒฝ์ฐ(Fragment ๋ชฉ๋ก์ ๋ ๋๋งํ ๋ ํํ ๋ฐ์), ๋ฐ๋์ ๋ช
์์ ์ธ <React.Fragment>
๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
React Fragment์ ์ค์ ์ ์ฉ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
React Fragment๋ ๋ค์ํ ์ค์ ์๋๋ฆฌ์ค์์ ๋น์ ๋ฐํ๋ฉฐ, ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ์ฅ์ ๋ฌผ์ ์ฐ์ํ๊ฒ ํด๊ฒฐํฉ๋๋ค. ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ๋ช ๊ฐ์ง ์ ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ฌ๋ฌ ํ
์ด๋ธ ์ด(<td>
) ๋๋ ํ(<tr>
) ๋ ๋๋ง
์ด๊ฒ์ ์๋ง๋ Fragment๊ฐ ํ์์ ์ธ ๊ฐ์ฅ ์ ํ์ ์ธ ์์ผ ๊ฒ์
๋๋ค. HTML ํ
์ด๋ธ์ ์๊ฒฉํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค. <tr>
(ํ
์ด๋ธ ํ) ์๋ฆฌ๋จผํธ๋ <td>
(ํ
์ด๋ธ ๋ฐ์ดํฐ) ๋๋ <th>
(ํ
์ด๋ธ ํค๋) ์๋ฆฌ๋จผํธ๋ง์ ์ง์ ํฌํจํ ์ ์์ต๋๋ค. ์ฌ๋ฌ <td>
๋ฅผ ๊ฐ์ธ๊ธฐ ์ํด <tr>
๋ด์ <div>
๋ฅผ ๋์
ํ๋ฉด ํ
์ด๋ธ์ ์๋งจํฑ๊ณผ ๋ ๋๋ง์ด ๊นจ์ ธ ์๊ฐ์ ๊ฒฐํจ์ด๋ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
์๋๋ฆฌ์ค: ์ฌ์ฉ์ ์์ธ ์ ๋ณด ํ ์ด๋ธ ํ ์ปดํฌ๋ํธ
๊ตญ์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋ฐ์ดํฐ ํ ์ด๋ธ์ ๊ตฌ์ถํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๊ฐ ํ์ ์ฌ๋ฌ ์ด์ ๋ ๋๋งํด์ผ ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค:
- Fragment ๋ฏธ์ฌ์ฉ (์๋ชป๋ ๋ฐฉ๋ฒ):
// UserTableRow.js - ํ ์ด๋ธ ๋ ์ด์์์ ๊นจ๋จ๋ฆผ
import React from 'react';
function UserTableRow({ user }) {
return (
<tr>
<div> {/* ์ค๋ฅ: td๋ฅผ ๊ฐ์ธ๋ div๋ฅผ tr ๋ฐ๋ก ์์ ๋ฃ์ ์ ์์ */}
<td>{user.id}</td>
<td>{user.name}</td>
<td>{user.email}</td>
</div>
</tr>
);
}
export default UserTableRow;
์์ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฑฐ๋ ์๋ชป๋ ํ์์ ํ ์ด๋ธ์ ๋ ๋๋งํ ๊ฒ์ ๋๋ค. Fragment๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ํ๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Fragment ์ฌ์ฉ (์ฌ๋ฐ๋ฅด๊ณ ์๋งจํฑํ ๋ฐฉ๋ฒ):
// UserTableRow.js - ์ฌ๋ฐ๋ฆ
import React from 'react';
function UserTableRow({ user }) {
return (
<tr>
<> {/* ๋จ์ถ Fragment */}
<td>{user.id}</td>
<td>{user.name}</td>
<td>{user.email}</td>
</>
</tr>
);
}
export default UserTableRow;
์ด ์์ ๋ ์์ ์์ Fragment๋ <td>
์๋ฆฌ๋จผํธ๋ค์ ํจ๊ณผ์ ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ์ปดํฌ๋ํธ ๋ฐํ ๊ฐ์ ๋ํ React์ ๋จ์ผ ๋ฃจํธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๋ฉด์, ์ค์ DOM์์๋ ์ด <td>
๋ค์ด <tr>
์ ์ง์ ์ ์ธ ์์์ด ๋๋๋ก ๋ณด์ฅํ์ฌ ์๋ฒฝํ ์๋งจํฑ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํฉ๋๋ค.
2. ์ฌ๋ฌ ์๋ฆฌ๋จผํธ์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
ํน์ ์ํ๋ props์ ๋ฐ๋ผ ๊ด๋ จ๋ ์๋ฆฌ๋จผํธ ์งํฉ์ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. Fragment๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ด์์์ด๋ ์๋งจํฑ์ ์ํฅ์ ์ค ์ ์๋ ๋ถํ์ํ ๋ํผ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ด๋ฌํ ์๋ฆฌ๋จผํธ๋ค์ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
์๋๋ฆฌ์ค: ์ฌ์ฉ์ ์ํ ์ ๋ณด ํ์
์ฌ์ฉ์๊ฐ ํ์ฑ ์ํ์ด๊ฑฐ๋ ํน๋ณํ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ํ ๋ฐฐ์ง๋ฅผ ํ์ํ๋ ํ๋กํ ์นด๋ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด ๋ณด์ธ์:
- Fragment ๋ฏธ์ฌ์ฉ (๋ถํ์ํ Div ์ถ๊ฐ):
// UserStatusBadges.js - ๋ถํ์ํ div ์ถ๊ฐ
import React from 'react';
function UserStatusBadges({ isActive, hasAdminPrivileges }) {
return (
<div> {/* ์ด div๋ ๋ถ๋ชจ์ flex/grid ๋ ์ด์์์ ๋ฐฉํดํ ์ ์์ */}
{isActive && <span className="badge active">Active</span>}
{hasAdminPrivileges && <span className="badge admin">Admin</span>}
</div>
);
}
export default UserStatusBadges;
๊ธฐ๋ฅ์ ์ผ๋ก๋ ์๋ํ์ง๋ง, ๋ง์ฝ UserStatusBadges
๊ฐ ์ง์ ์ ์ธ ์์๋ค์ด flex ์์ดํ
์ด ๋๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ flex ์ปจํ
์ด๋ ๋ด์์ ์ฌ์ฉ๋๋ค๋ฉด, ๊ฐ์ธ๋ <div>
๊ฐ flex ์์ดํ
์ด ๋์ด ์ํ๋ ๋ ์ด์์์ ๊นจ๋จ๋ฆด ์ ์์ต๋๋ค. Fragment๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค:
- Fragment ์ฌ์ฉ (๋ ๊น๋ํ๊ณ ์์ ํจ):
// UserStatusBadges.js - ์ถ๊ฐ div ์์
import React from 'react';
function UserStatusBadges({ isActive, hasAdminPrivileges }) {
return (
<> {/* ๋ถ๋ชจ๊ฐ flex ์ปจํ ์ด๋์ผ ๊ฒฝ์ฐ Fragment๊ฐ ์์๋ค์ ์ง์ ์ ์ธ flex ์์ดํ ์ผ๋ก ๋ง๋ฆ */}
{isActive && <span className="badge active">Active</span>}
{hasAdminPrivileges && <span className="badge admin">Admin</span>}
</>
);
}
export default UserStatusBadges;
์ด ์ ๊ทผ ๋ฐฉ์์ (๋ ๋๋ง๋ ๊ฒฝ์ฐ) <span>
์๋ฆฌ๋จผํธ๋ค์ด ๋ถ๋ชจ์ ๋ ๋๋ง ๊ฒฐ๊ณผ์์ ๋ค๋ฅธ ์๋ฆฌ๋จผํธ๋ค๊ณผ ์ง์ ์ ์ธ ํ์ ๊ฐ ๋๋๋ก ๋ณด์ฅํ์ฌ ๋ ์ด์์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์กดํฉ๋๋ค.
3. ์ปดํฌ๋ํธ ๋๋ ์๋ฆฌ๋จผํธ ๋ชฉ๋ก ๋ฐํ
.map()
์ ์ฌ์ฉํ์ฌ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ ๋, ๋ชฉ๋ก์ ๊ฐ ํญ๋ชฉ์ React๊ฐ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ์ฌ์กฐ์ ํ๊ธฐ ์ํด ๊ณ ์ ํ key
prop์ด ํ์ํฉ๋๋ค. ๋๋ก๋ ๋งคํํ๋ ์ปดํฌ๋ํธ ์์ฒด๊ฐ ์ฌ๋ฌ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ, Fragment๋ ํค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์ด์์ ์ธ ๋ํผ์
๋๋ค.
์๋๋ฆฌ์ค: ์ ํ ๊ธฐ๋ฅ ๋ชฉ๋ก ํ์
์ ํ ์์ธ ํ์ด์ง์ ๊ธฐ๋ฅ์ด ๋์ด๋์ด ์๊ณ , ๊ฐ ๊ธฐ๋ฅ์๋ ์์ด์ฝ๊ณผ ์ค๋ช ์ด ์์ ์ ์๋ค๊ณ ์์ํด ๋ณด์ธ์:
// ProductFeature.js
import React from 'react';
function ProductFeature({ icon, description }) {
return (
<> {/* ๋ด๋ถ ๊ทธ๋ฃนํ๋ฅผ ์ํด ๋จ์ถ ๋ฌธ๋ฒ ์ฌ์ฉ */}
<i className={`icon ${icon}`}></i>
<p>{description}</p>
</>
);
}
export default ProductFeature;
์ด์ , ์ด ProductFeature
์ปดํฌ๋ํธ ๋ชฉ๋ก์ ๋ ๋๋งํ๋ค๋ฉด:
// ProductDetail.js
import React from 'react';
import ProductFeature from './ProductFeature';
const productFeaturesData = [
{ id: 1, icon: 'security', description: 'Advanced Security Features' },
{ id: 2, icon: 'speed', description: 'Blazing Fast Performance' },
{ id: 3, icon: 'support', description: '24/7 Global Customer Support' },
];
function ProductDetail() {
return (
<div>
<h2>Product Highlights</h2>
{productFeaturesData.map(feature => (
<React.Fragment key={feature.id}> {/* key prop์ ์ํ ๋ช ์์ Fragment */}
<ProductFeature icon={feature.icon} description={feature.description} />
</React.Fragment>
))}
</div>
);
}
export default ProductDetail;
์ฌ๊ธฐ์ ProductFeature
์์ฒด๋ ์์ด์ฝ๊ณผ ๋จ๋ฝ์ ๊ทธ๋ฃนํํ๊ธฐ ์ํด ๋จ์ถ Fragment๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์. ๊ฒฐ์ ์ ์ผ๋ก, ProductDetail
์์ productFeaturesData
๋ฅผ ๋งคํํ ๋, ๊ฐ ProductFeature
์ธ์คํด์ค๋ฅผ ๋ช
์์ ์ธ <React.Fragment>
๋ก ๊ฐ์ธ key={feature.id}
๋ฅผ ํ ๋นํฉ๋๋ค. ๋จ์ถ ๋ฌธ๋ฒ <></>
๋ key
๋ฅผ ๋ฐ์ ์ ์์ผ๋ฏ๋ก, ์ด ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์์๋ ๋ช
์์ ๊ตฌ๋ฌธ์ด ํ์์ ์
๋๋ค.
4. ๋ ์ด์์ ์ปดํฌ๋ํธ
๋๋ก๋ ์์ฒด์ ์ธ DOM ๋ฐ์๊ตญ์ ๋จ๊ธฐ์ง ์๊ณ ๋ ์ด์์์ ์ํด ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๊ทธ๋ฃนํํ๋ ๊ฒ์ด ์ฃผ ๋ชฉ์ ์ธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ๋ ํฉ๋๋ค. Fragment๋ ์ด๋ฌํ ๋ชฉ์ ์ ์๋ฒฝํฉ๋๋ค.
์๋๋ฆฌ์ค: 2๋จ ๋ ์ด์์ ์ธ๊ทธ๋จผํธ
์ฝํ ์ธ ๋ฅผ ๋ ๊ฐ์ ๋ณ๋ ์ด๋ก ๋ ๋๋งํ์ง๋ง, ์ธ๊ทธ๋จผํธ ์ปดํฌ๋ํธ ์์ฒด๊ฐ ๋ํผ div๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ๋ฅผ ์ํ๋ ๋ ์ด์์ ์ธ๊ทธ๋จผํธ๋ฅผ ์์ํด ๋ณด์ธ์:
// TwoColumnSegment.js
import React from 'react';
function TwoColumnSegment({ leftContent, rightContent }) {
return (
<>
<div className="column-left">
{leftContent}
</div>
<div className="column-right">
{rightContent}
</div>
</>
);
}
export default TwoColumnSegment;
์ด TwoColumnSegment
์ปดํฌ๋ํธ๋ ์ผ์ชฝ ๋ฐ ์ค๋ฅธ์ชฝ ์ด์ ์ด๋ค ์ฝํ
์ธ ๋ ์ ๋ฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ์ปดํฌ๋ํธ ์์ฒด๋ Fragment๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ div
์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋ฉฐ, ์ด๋ค์ด DOM์์ ์ง์ ์ ์ธ ํ์ ๊ฐ ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ถ๋ชจ์ ์ ์ฉ๋ CSS ๊ทธ๋ฆฌ๋๋ ํ๋ ์ค๋ฐ์ค ๋ ์ด์์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ display: grid; grid-template-columns: 1fr 1fr;
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด ๋ div
๋ ์ง์ ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์์ดํ
์ด ๋ ๊ฒ์
๋๋ค.
Key์ ํจ๊ป ์ฌ์ฉํ๋ Fragment: ์ธ์ ๊ทธ๋ฆฌ๊ณ ์
React์ key
prop์ ๋ชฉ๋ก ๋ ๋๋ง์ ์ต์ ํํ๋ ๋ฐ ๊ธฐ๋ณธ์ ์
๋๋ค. React๊ฐ ์๋ฆฌ๋จผํธ ๋ชฉ๋ก์ ๋ ๋๋งํ ๋, ์ด๋ค ํญ๋ชฉ์ด ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ ๊ฑฐ๋์๋์ง ์๋ณํ๊ธฐ ์ํด ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ React๊ฐ ์ ์ฒด ๋ชฉ๋ก์ ๋ถํ์ํ๊ฒ ๋ค์ ๋ ๋๋งํ์ง ์๊ณ UI๋ฅผ ํจ์จ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์์ ์ ์ธ key
๊ฐ ์์ผ๋ฉด React๋ ๋ชฉ๋ก ํญ๋ชฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ ๋ ฌํ๊ฑฐ๋ ์
๋ฐ์ดํธํ์ง ๋ชปํ ์ ์์ผ๋ฉฐ, ์ด๋ ํนํ ์
๋ ฅ ํ๋๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋์คํ๋ ์ด์ ๊ฐ์ ์ํธ์์ฉ์ ์ธ ์๋ฆฌ๋จผํธ์์ ์ฑ๋ฅ ๋ฌธ์ ์ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ธ๊ธํ๋ฏ์ด, ๋จ์ถ Fragment <></>
๋ key
prop์ ๋ฐ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปฌ๋ ์
์ ๋งคํํ๊ณ map ํจ์๊ฐ ๋ฐํํ๋ ํญ๋ชฉ์ด (์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํด์ผ ํ๋ฏ๋ก) Fragment์ธ ๊ฒฝ์ฐ, key
๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ๋์ ๋ช
์์ ์ธ <React.Fragment>
๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์: ํผ ํ๋ ๋ชฉ๋ก ๋ ๋๋ง
๊ด๋ จ๋ ์ ๋ ฅ ํ๋ ๊ทธ๋ฃน์ด ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ ๋๋ง๋๋ ๋์ ํผ์ ์๊ฐํด ๋ณด์ธ์. ๊ทธ๋ฃน ๋ชฉ๋ก์ด ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒฝ์ฐ ๊ฐ ๊ทธ๋ฃน์ ๊ณ ์ ํ๊ฒ ์๋ณ๋์ด์ผ ํฉ๋๋ค.
// FormFieldGroup.js
import React from 'react';
function FormFieldGroup({ label1, value1, label2, value2 }) {
return (
<> {/* ๋จ์ถ ๋ฌธ๋ฒ์ผ๋ก ๋ด๋ถ ๊ทธ๋ฃนํ */}
<label>{label1}:</label>
<input type="text" value={value1} onChange={() => {}} />
<label>{label2}:</label>
<input type="text" value={value2} onChange={() => {}} />
</>
);
}
export default FormFieldGroup;
์ด์ ๋ ๋๋งํ ํ๋ ๊ทธ๋ฃน ๋ชฉ๋ก์ด ์๋ค๋ฉด:
// DynamicForm.js
import React from 'react';
import FormFieldGroup from './FormFieldGroup';
const formSections = [
{ id: 'personal', l1: 'First Name', v1: 'John', l2: 'Last Name', v2: 'Doe' },
{ id: 'contact', l1: 'Email', v1: 'john@example.com', l2: 'Phone', v2: '+1234567890' },
{ id: 'address', l1: 'Street', v1: '123 Main St', l2: 'City', v2: 'Anytown' },
];
function DynamicForm() {
return (
<form>
<h2>User Information Form</h2>
{formSections.map(section => (
<React.Fragment key={section.id}> {/* ์ฌ๊ธฐ์ key๊ฐ ํ์ํจ */}
<FormFieldGroup
label1={section.l1} value1={section.v1}
label2={section.l2} value2={section.v2}
/>
</React.Fragment>
))}
</form>
);
}
export default DynamicForm;
์ด ์์ ์์ map
ํจ์์์ ๋ฐํ๋ ๊ฐ FormFieldGroup
์ ๊ณ ์ ํ key
๊ฐ ํ์ํฉ๋๋ค. FormFieldGroup
์์ฒด๊ฐ Fragment(์ฌ๋ฌ ๋ ์ด๋ธ๊ณผ ์
๋ ฅ)๋ฅผ ๋ฐํํ๋ฏ๋ก, FormFieldGroup
ํธ์ถ์ ๋ช
์์ ์ธ <React.Fragment>
๋ด์ ๊ฐ์ธ๊ณ key={section.id}
๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ์ด๋ React๊ฐ ํผ ์น์
๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๋ณด์ฅํ๋ฉฐ, ํนํ ์น์
์ด ๋์ ์ผ๋ก ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ฌ์ ๋ ฌ๋ ๋ ์ค์ํฉ๋๋ค.
๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
React Fragment๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ ๋จ์ํ "๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ" ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ์ด์์ ๋๋ค. ์ด๋ ๊ฒฌ๊ณ ํ๊ณ , ๊ณ ์ฑ๋ฅ์ด๋ฉฐ, ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ค์ํ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์ ํ๋ํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ผ๋์ ๋์ด์ผ ํฉ๋๋ค:
1. ์ฑ๋ฅ ์ด์ ์ ๋ํ ์ฌ์ธต ๋ถ์
์ข ์ข ๋ฏธ๋ฌํ์ง๋ง, Fragment ์ฌ์ฉ์ผ๋ก ์ธํ ๋์ ๋ ์ฑ๋ฅ ์ด๋์ ํนํ ๋ค์ํ ๊ธฐ๊ธฐ ์ฑ๋ฅ๊ณผ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ ์ธ๊ณ ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ถ๊ฐ DOM ๋ ธ๋์๋ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค:
- DOM ํธ๋ฆฌ ํฌ๊ธฐ ๊ฐ์: ๋ ์์ DOM ํธ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ฑํ ๋ด์ฉ์ด ์ ๊ณ , ๋ฉ๋ชจ๋ฆฌ์์ ๊ด๋ฆฌํ ๋ ธ๋๊ฐ ์ ์ผ๋ฉฐ, ๋ ๋๋ง ์ค์ ํ ์ผ์ด ์ค์ด๋ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์์ฒ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ง ํ์ด์ง(๊ธฐ์ ๋์๋ณด๋๋ ์ฝํ ์ธ ๊ฐ ํ๋ถํ ํฌํธ์์ ํํจ)์ ๊ฒฝ์ฐ, ์ด๋ฌํ ๊ฐ์๋ ์๋นํ ์ ์์ต๋๋ค.
- ๋ ๋น ๋ฅธ ๋ ์ด์์ ๋ฐ ๋ฆฌํ์ธํธ: ์ปดํฌ๋ํธ๊ฐ ์
๋ฐ์ดํธ๋ ๋ React๋ ์ฌ๋ ๋๋ง ์ฃผ๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ๋ง์ฝ ๋ํผ
<div>
๊ฐ ์์๋ค๋ฉด, ๊ทธ ์์ ๋ด์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฌ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น<div>
์ ๊ทธ ์์์ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ๊ณ ๋ฆฌํ์ธํธํ๋๋ก ์๊ตฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ถํ์ํ ๋ํผ๋ฅผ ์ ๊ฑฐํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ์ ๋ ์ด์์ ์์ง์ ๋ ๊ฐ๋จํ ์์ ์ ์ํํ๊ฒ ๋์ด ๋ ๋น ๋ฅธ ์ ๋ฐ์ดํธ์ ๋ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ๋ค์ํ ์ง์ญ ๋ฐ ๊ธฐ๊ธฐ ์ ํ์ ๊ฑธ์ณ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํ์์ ์ ๋๋ค. - ์ต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ๋จ์ผ DOM ๋ ธ๋์ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ์ ์์ง๋ง, ์์ฒ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ถํ์ํ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ๋ฎ์ถ๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค. ์ด๋ ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์์ ํํ ๋ณผ ์ ์๋ ๊ตฌํ ๋๋ ์ ์ฌ์ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ํนํ ์ ์ตํฉ๋๋ค.
2. ์๋งจํฑ HTML ์ฐ์ ์์ ์ง์
์๋งจํฑ HTML์ ์ ์งํ๋ ๊ฒ์ ์ ๊ทผ์ฑ, SEO ๋ฐ ์ ๋ฐ์ ์ธ ์ฝ๋ ํ์ง์ ๋งค์ฐ ์ค์ํฉ๋๋ค. Fragment๋ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ๋จ์ํ ์๋ฆฌ๋จผํธ๋ฅผ ๊ทธ๋ฃนํํ๊ธฐ ์ํด ๋น์๋งจํฑ์ ์ธ <div>
์ ์์กดํ๋ ๋์ , Fragment๋ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ ์ปจํ
์คํธ์์ ์๋ฏธ ์๋ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํ๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
- ์ปดํฌ๋ํธ๊ฐ
<li>
์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๋ค๋ฉด, ๊ทธ<li>
์๋ฆฌ๋จผํธ๋ค์<ul>
๋๋<ol>
์ ์ง์ ์ ์ธ ์์์ด์ด์ผ ํฉ๋๋ค. - ์ปดํฌ๋ํธ๊ฐ
<td>
์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๋ค๋ฉด, ๊ทธ๋ค์<tr>
์ ์ง์ ์ ์ธ ์์์ด์ด์ผ ํฉ๋๋ค.
Fragment๋ React์ ๋ด๋ถ ์๊ตฌ ์ฌํญ์ ํด์น์ง ์์ผ๋ฉด์ ๋ ๋๋ง๋ DOM์์ ์ด๋ฌํ ์ง์ ์ ์ธ ๋ถ๋ชจ-์์ ๊ด๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฌํ ์๋งจํฑ HTML์ ๋ํ ์ฝ์์ ๊ฒ์ ์์ง ํฌ๋กค๋ฌ์๊ฒ ์ด์ต์ ์ค ๋ฟ๋ง ์๋๋ผ, ์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฐ ๊ธฐํ ๋ณด์กฐ ๊ธฐ์ ์ ์์กดํ๋ ์ฌ์ฉ์์ ์ ๊ทผ์ฑ์ ํฅ์์ํต๋๋ค. ๊น๋ํ๊ณ ์๋งจํฑํ ๊ตฌ์กฐ๋ ์ ์ธ๊ณ์ ์ผ๋ก ์ดํด๋๋ฉฐ ๋ณดํธ์ ์ผ๋ก ์ ์ตํฉ๋๋ค.
3. Fragment๋ฅผ ์ฌ์ฉํ ๋๋ฒ๊น
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools ๋๋ Firefox Developer Tools)๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒ์ฌํ ๋ DOM ํธ๋ฆฌ์์ <React.Fragment>
๋๋ <></>
์๋ฆฌ๋จผํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๊ทธ๋ค์ ๋ชฉ์ ์
๋๋ค โ ๋ ๋๋ง ๊ณผ์ ์์ React์ ์ํด ์๋น๋๋ฉฐ ์ค์ DOM ๋
ธ๋๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์ด๋ ์ฒ์์๋ ๋๋ฒ๊น
์ ์ด๋ ค์์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ค์ ๋ก๋ ์ด์ ์
๋๋ค. ํ์ด์ง ๊ตฌ์กฐ์ ์ค์ ๋ก ๊ธฐ์ฌํ๋ ์๋ฆฌ๋จผํธ๋ง ๋ณด๊ฒ ๋์ด ๋ ์ด์์๊ณผ ์คํ์ผ๋ง์ ์๊ฐ์ ๊ฒ์ฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
4. Fragment๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํ ๋ (๊ทธ๋ฆฌ๊ณ div
๊ฐ ์ ์ ํ ๊ฒฝ์ฐ)
Fragment๋ ๋งค์ฐ ์ ์ฉํ์ง๋ง, <div>
๋ ๋ค๋ฅธ ๋ํผ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณดํธ์ ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ ์๋๋๋ค. ๋ํผ๋ฅผ ์ฌ์ฉํด์ผ ํ ํ๋นํ ์ด์ ๊ฐ ์์ต๋๋ค:
- ์คํ์ผ๋ง์ ์ํ ์ปจํ
์ด๋๊ฐ ํ์ํ ๋: ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ธ๋ ๋ํผ ์๋ฆฌ๋จผํธ์ ์ง์ ํน์ CSS ์คํ์ผ(์:
background-color
,border
,padding
,margin
,display: flex
)์ ์ ์ฉํด์ผ ํ๋ค๋ฉด,<div>
(๋๋<section>
,<article>
๋ฑ ๋ค๋ฅธ ์๋งจํฑ HTML ์๋ฆฌ๋จผํธ)๊ฐ ํ์ํฉ๋๋ค. Fragment๋ DOM์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์คํ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค. - ๋ํผ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฒจ๋ถํด์ผ ํ ๋: ์์ ๊ทธ๋ฃน์ ํฌํจํ๋ ๋จ์ผ ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋(์:
onClick
,onMouseEnter
)๋ฅผ ์ฒจ๋ถํด์ผ ํ๋ค๋ฉด,<div>
์ ๊ฐ์ ์ค์ง์ ์ธ DOM ์๋ฆฌ๋จผํธ๊ฐ ํ์ํฉ๋๋ค. - ๋ํผ๊ฐ ์๋งจํฑํ ์๋ฏธ๋ฅผ ๊ฐ์ง ๋: ๋๋ก๋ ๊ทธ๋ฃนํ ์์ฒด๊ฐ ์๋งจํฑํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด, ๊ด๋ จ๋ ํผ ํ๋ ๊ทธ๋ฃน์
<fieldset>
์ผ๋ก ์๋งจํฑํ๊ฒ ๊ฐ์ธ์ง ์ ์๊ณ , ๋ ผ๋ฆฌ์ ์ธ ์ฝํ ์ธ ์น์ ์<section>
์ผ๋ก ๊ฐ์ธ์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ํผ๋ "๋ถํ์ํ" ๊ฒ์ด ์๋๋ผ ํ์ด์ง์ ๊ตฌ์กฐ์ ์๋ฏธ์ ํ์์ ์ ๋๋ค.
ํญ์ ๋ํผ์ ๋ชฉ์ ์ ๊ณ ๋ คํ์ญ์์ค. ๋ง์ฝ ๊ทธ๊ฒ์ด ์์ ํ React์ ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ ๊ท์น์ ์ถฉ์กฑ์ํค๊ธฐ ์ํ ๊ฒ์ด๊ณ ์๋งจํฑ์ด๋ ์คํ์ผ๋ง ๋ชฉ์ ์ด ์๋ค๋ฉด, Fragment๊ฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ ๋๋ค. ๊ธฐ๋ฅ์ , ์๋งจํฑ ๋๋ ์คํ์ผ๋ง ๋ชฉ์ ์ ์ํํ๋ค๋ฉด, ์ ์ ํ HTML ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๋ค๋ฅธ ํด๊ฒฐ์ฑ ๊ณผ์ ๋น๊ต (๊ทธ๋ฆฌ๊ณ ๊ทธ ํ๊ณ)
Fragment ์ด์ ์๋ ๊ฐ๋ฐ์๋ค์ด ๋ค์ํ ํด๊ฒฐ์ฑ ์ ์ฌ์ฉํ์ผ๋ฉฐ, ๊ฐ๊ฐ ๊ณ ์ ํ ๋จ์ ์ด ์์์ต๋๋ค. ์ด๋ฌํ ๋์์ ์ดํดํ๋ฉด Fragment์ ์ฐ์ํจ๊ณผ ํ์์ฑ์ด ๋์ฑ ๋ถ๋ช ํด์ง๋๋ค.
1. ์ด๋์๋ ์๋ <div>
๋ํผ:
๋ฐฉ๋ฒ: ๋ชจ๋ ํ์ ์๋ฆฌ๋จผํธ๋ฅผ ์์์ <div>
๋ก ๊ฐ์๋๋ค.
- ์ฅ์ : ๊ตฌํ์ด ๊ฐ๋จํ๊ณ , ๋ชจ๋ React ๋ฒ์ (Fragment ์ด์ ์๋)์์ ์๋ํ๋ฉฐ, HTML ๊ฐ๋ฐ์์๊ฒ ์ต์ํฉ๋๋ค.
- ๋จ์ :
- DOM ์ค์ผ: DOM ํธ๋ฆฌ์ ์ถ๊ฐ์ ์ด๊ณ ์ข ์ข ์๋ฏธ ์๋ ๋ ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด๋ก ์ธํด DOM์ด ๋น๋ํด์ง ์ ์์ต๋๋ค.
- CSS ๋ฌธ์ : ํนํ ์ง์ ์ ์ธ ์์ ๊ด๊ณ์ ์์กดํ๋ ๋ณต์กํ CSS ๋ ์ด์์(์: Flexbox, CSS Grid)์ ๋ง๊ฐ๋จ๋ฆด ์ ์์ต๋๋ค. ๋ถ๋ชจ๊ฐ
display: flex
๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ปดํฌ๋ํธ๊ฐ ์์๋ค์ ๊ฐ์ธ๋<div>
๋ฅผ ๋ฐํํ๋ฉด, ๊ทธ<div>
๊ฐ flex ์์ดํ ์ด ๋์ด ๋ ์ด์์ ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. - ์๋งจํฑ ๋ถ์ ํ์ฑ: ํ
์ด๋ธ(
<tr>
์<div>
๋ฅผ ์ง์ ํฌํจํ ์ ์์), ๋ชฉ๋ก, ์ ์ ๋ชฉ๋ก๊ณผ ๊ฐ์ ์ปจํ ์คํธ์์ ์๋งจํฑ HTML ๊ท์น์ ์๋ฐํฉ๋๋ค. ์ด๋ ์ ๊ทผ์ฑ๊ณผ SEO์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. - ์ฆ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฑ๋ฅ ์ค๋ฒํค๋:
div
๋น ๋ฏธ๋ฏธํ์ง๋ง, ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋์ ํจ๊ณผ๊ฐ ๋ ๋๋ฆฐ ๋ ๋๋ง๊ณผ ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ์๋น์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
2. ์๋ฆฌ๋จผํธ ๋ฐฐ์ด ๋ฐํ (์ด์ ์ ๊ทผ ๋ฐฉ์):
๋ฐฉ๋ฒ: React 16 ์ด์ ์๋ ๊ฐ๋ฐ์๋ค์ด ์๋ฆฌ๋จผํธ ๋ฐฐ์ด์ ๋ฐํํ ์ ์์์ต๋๋ค. ๋ฐฐ์ด์ ๊ฐ ์๋ฆฌ๋จผํธ๋ ๊ณ ์ ํ key
prop์ ๊ฐ์ ธ์ผ ํ์ต๋๋ค.
- ์ฅ์ : ์ถ๊ฐ์ ์ธ DOM ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ง ์์์ต๋๋ค.
- ๋จ์ :
- ๊ตฌ๋ฌธ ์ฅํฉํจ: ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐฐ์ด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ธ์ผ ํ์ต๋๋ค(์:
return [<h1 key="h1">Title</h1>, <p key="p">Content</p>];
). ์ด๋ JSX๋ณด๋ค ๊ฐ๋ ์ฑ์ด ํจ์ฌ ๋จ์ด์ก์ต๋๋ค. - ํ์์ ์ธ ํค: ๋ฐฐ์ด์ ๋ชจ๋ ์ต์์ ์๋ฆฌ๋จผํธ๋ ๋์ ๋ชฉ๋ก์ ์ผ๋ถ๊ฐ ์๋๋๋ผ๋ ๋ฐ๋์ ๊ณ ์ ํ
key
๋ฅผ ๊ฐ์ ธ์ผ ํ์ผ๋ฉฐ, ์ด๋ ๋ถํ์ํ ์์ฉ๊ตฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. - ๋ ์ง๊ด์ ์: ๋ฐฐ์ด์ ๋ฐํํ๋ ๊ฒ์ ํธ๋ฆฌ์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์กฐํ๋ JSX์ ๋ ๊ด์ฉ์ ์ผ๋ก ๋๊ปด์ก์ต๋๋ค.
3. ๋ฌธ์์ด ๋๋ ์ซ์ ๋ฐํ:
๋ฐฉ๋ฒ: ์ผ๋ฐ ๋ฌธ์์ด ๋๋ ์ซ์๋ฅผ ๋ฐํํฉ๋๋ค(์: return 'Hello World';
๋๋ return 123;
).
- ์ฅ์ : ์ถ๊ฐ DOM ๋ ธ๋๊ฐ ์์ต๋๋ค.
- ๋จ์ : ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ทนํ ์ ํ์ ์ ๋๋ค. ๊ตฌ์กฐํ๋ UI๊ฐ ์๋ ๊ฐ๋จํ ํ ์คํธ๋ ์ซ์ ์ถ๋ ฅ์๋ง ํด๋น๋ฉ๋๋ค.
Fragment๋ ์ด๋ฌํ ๋์๋ค์ ๊ฐ์ฅ ์ข์ ์ธก๋ฉด๋ค์ ์ฐ์ํ๊ฒ ๊ฒฐํฉํฉ๋๋ค: JSX์ ์น์ํจ๊ณผ ๊ฐ๋ ์ฑ์ ์ถ๊ฐ์ ์ธ DOM ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ง ์๋ ์ด์ ์ ๋ชจ๋ ์ ๊ณตํ๋ฉฐ, ํ์ํ ๋ ํค๋ฅผ ์ง์ ํ๋ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
React ๋ฒ์ ํธํ์ฑ
Fragment์ ์ญ์ฌ์ ๋งฅ๋ฝ์ ์ดํดํ๋ ๊ฒ์ ๋ค์ํ ํ๋ก์ ํธ ์ ์ฐ์ ๊ฐ์ง ๊ธ๋ก๋ฒ ํ์๊ฒ ๋์์ด ๋ฉ๋๋ค:
- React 16.0:
<React.Fragment>
์ปดํฌ๋ํธ๋ React 16.0์ ๋์ ๋์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ์๋นํ ๊ฐ์ ์ ๊ฐ์ ธ์ ๊ฐ๋ฐ์๋ค์ด ์ถ๊ฐ์ ์ธ DOM ์๋ฆฌ๋จผํธ ์์ด ์ฌ๋ฌ ์์์ ๋ฐํํ ์ ์๊ฒ ํ์ต๋๋ค. - React 16.2: ๋ง์ ์ฌ๋์ ๋ฐ๋ ๋จ์ถ ๋ฌธ๋ฒ์ธ
<></>
๋ React 16.2์ ๋์ ๋์์ต๋๋ค. ์ด๋ ๊ฐ๊ฒฐํจ ๋๋ถ์ Fragment๋ฅผ ๋์ฑ ํธ๋ฆฌํ๊ณ ๋๋ฆฌ ์ฑํ๋๊ฒ ๋ง๋ค์์ต๋๋ค.
๋ง์ฝ ํ๋ก์ ํธ๊ฐ ์ด์ ๋ฒ์ ์ React(์: React 15 ์ดํ)๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด Fragment๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ <div>
๋ํผ๋ ๋ฐฐ์ด ๋ฐํ ๋ฐฉ๋ฒ์ ์์กดํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ React 16 ์ด์์ ๊ด๋ฒ์ํ ์ฑํ๊ณผ ์ด์ ์ ๊ณ ๋ คํ ๋, ๋ชจ๋ ์ ๊ท ๊ฐ๋ฐ ๋ฐ ์ง์์ ์ธ ์ ์ง๋ณด์๋ฅผ ์ํด ์ต์ React ๋ฒ์ ์ผ๋ก ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ด ๊ฐ๋ ฅํ ๊ถ์ฅ๋ฉ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ์ ๊ทผ์ฑ
React Fragment์ ์ด์ ์ ๋จ์ํ ๊ฐ๋ฐ์ ํธ์์ฑ๊ณผ ์ฑ๋ฅ ์งํ๋ฅผ ๋์ด์ญ๋๋ค. ํนํ ๋ค์ํ ํ๋์จ์ด ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์์ ์ ๊ทผ์ฑ๊ณผ ์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ์ ์ธ๊ณ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ค์ง์ ์ธ ๊ธ์ ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ํฅ์๋ ์ ๊ทผ์ฑ: ๊ฐ๋ฐ์๋ค์ด ๋ ๊น๋ํ๊ณ ์๋งจํฑํ HTML ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๊ฒ ํจ์ผ๋ก์จ, Fragment๋ ๋ ๋์ ์ ๊ทผ์ฑ์ ์ง์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค. ์คํฌ๋ฆฐ ๋ฆฌ๋ ๋ฐ ๊ธฐํ ๋ณด์กฐ ๊ธฐ์ ์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ์ํด ํ์ด์ง ์ฝํ
์ธ ๋ฅผ ์ ํํ๊ฒ ํด์ํ๊ธฐ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์กฐํ๋๊ณ ์๋งจํฑํ DOM์ ์์กดํฉ๋๋ค. ๋ถํ์ํ
<div>
์๋ฆฌ๋จผํธ๋ ๋๋๋ก ์ด๋ฌํ ํด์์ ๋ฐฉํดํ์ฌ ํ์๊ณผ ์ฝํ ์ธ ์๋น๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. Fragment๋ ๊ธฐ๋ณธ HTML์ด ๊ฐ๋ฅํ ํ ๊นจ๋ํ๊ณ ์๋งจํฑ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๋๋ก ๋ณด์ฅํ์ฌ ์ ์ธ๊ณ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋ ํฌ์ฉ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. - ์ ์ฌ์ ๊ธฐ๊ธฐ ๋ฐ ๋๋ฆฐ ๋คํธ์ํฌ์์์ ์ฑ๋ฅ ํฅ์: ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์์ ์ธํฐ๋ท ์๋๋ ์ผ์ ํ์ง ์์ ์ ์์ผ๋ฉฐ, ๊ณ ์ฑ๋ฅ ์ปดํจํ
์ฅ์น์ ๋ํ ์ ๊ทผ์ด ๋ณดํธ์ ์ด์ง ์์ต๋๋ค. ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๊ฐ๋ฒผ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณตํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ค์ํฉ๋๋ค. (Fragment๋ฅผ ํตํด ๋ฌ์ฑ๋) ๋ ์๊ณ ๊น๋ํ DOM ํธ๋ฆฌ๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
- ์ ์กํ ๋ฐ์ดํฐ ๊ฐ์: HTML ์์ฒด๋ ํฌ๊ฒ ์์์ง์ง ์์ ์ ์์ง๋ง, ๊ฐ์๋ ๋ณต์ก์ฑ์ ๋ ๋น ๋ฅธ ํ์ฑ๊ณผ ๋ ๋๋ง์ ๋์์ด ๋ฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง: DOM ๋ ธ๋๊ฐ ์ ๋ค๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ด ํ ์ผ์ด ์ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ์ฅ์น์์๋ ๋ ๋น ๋ฅธ ์ด๊ธฐ ํ์ด์ง ๋ก๋์ ๋ ๋ฐ์์ ์ธ ์ ๋ฐ์ดํธ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ํ๋์จ์ด๊ฐ ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฑฐ๋ ์ผ๋ฐ์ ์ด์ง ์์ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ์ง์ ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ๊ตญ์ ํ ๊ฐ์ ์ผ๊ด์ฑ: ๊ฐ๋ฐํ์ด ์ ์ ๋ ๊ธ๋ก๋ฒํ๋๊ณ ๋ถ์ฐ๋จ์ ๋ฐ๋ผ ์ผ๊ด๋ ์ฝ๋ฉ ํ์ค๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Fragment์ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ๊ณผ ๋ณดํธ์ ์ผ๋ก ์ดํด๋๋ ์ด์ ์ ๋ค์ํ ์๊ฐ๋์ ๋ฌธํ์ ๋ฐฐ๊ฒฝ์ ๊ฑธ์ณ UI ๊ฐ๋ฐ์ ์ผ๊ด์ฑ์ ์ฆ์ง์์ผ ๋๊ท๋ชจ ๊ตญ์ ํ๋ก์ ํธ ๋ด์์์ ๋ง์ฐฐ์ ์ค์ด๊ณ ํ์ ์ ํฅ์์ํต๋๋ค.
๊ฒฐ๋ก
React Fragment๋ React ์ํ๊ณ์์ ๋ฏธ๋ฌํ์ง๋ง ์ฌ์คํ๊ฒ ์ํฅ๋ ฅ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ๋ ๋๋ง๋ HTML์ ๊น๋ํจ, ์ฑ๋ฅ ๋๋ ์๋งจํฑ ๋ฌด๊ฒฐ์ฑ์ ์์์ํค์ง ์์ผ๋ฉด์ JSX์ ๊ทผ๋ณธ์ ์ธ ์ ์ฝ, ์ฆ ๋จ์ผ ๋ฃจํธ ์๋ฆฌ๋จผํธ์ ๋ํ ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํฉ๋๋ค. ์๋ฒฝํ๊ฒ ๊ตฌ์กฐํ๋ ํ ์ด๋ธ ํ์ ๋ง๋๋ ๊ฒ๋ถํฐ ์ ์ฐํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋ฐ ํจ์จ์ ์ธ ๋ชฉ๋ก ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ๊น์ง, Fragment๋ ๊ฐ๋ฐ์๋ค์ด ๋ ํํ๋ ฅ ์๊ณ , ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ, ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
ํ๋ก์ ํธ์์ React Fragment๋ฅผ ์ฑํํ๋ ๊ฒ์ ํจ์จ์ ์ผ ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ์ ์ธ๊ณ ๊ณ ๊ฐ์ ์ํด ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ๊ฒฌ๊ณ ํ ๊ณ ํ์ง ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ฒ ๋ค๋ ์ฝ์์ ์๋ฏธํฉ๋๋ค. ๋ถํ์ํ DOM ๋
ธ๋๋ฅผ ์ ๊ฑฐํจ์ผ๋ก์จ ๋๋ฒ๊น
์ ๋จ์ํํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ด๋ฉฐ, ๋ณต์ก์ฑ์ ๊ด๊ณ์์ด CSS ๋ ์ด์์์ด ์๋ํ ๋๋ก ๋์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ช
์์ ์ธ <React.Fragment>
์ ๊ฐ๊ฒฐํ ๋จ์ถ ๋ฌธ๋ฒ <></>
์ฌ์ด์ ์ ํ์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ฌ, key
prop์ด ํ์ํ์ง์ ๋ฐ๋ผ ์ ์ ํ ๊ตฌ๋ฌธ์ ์ ํํ ์ ์๊ฒ ํด์ค๋๋ค.
์์ญ์ต ๋ช ์ด ๋ค์ํ ๊ธฐ๊ธฐ์ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๋ ์ธ์์์ ๋ชจ๋ ์ต์ ํ๋ ์ค์ํฉ๋๋ค. React Fragment๋ React์ ์ฌ๋ ค ๊น์ ์ค๊ณ์ ๋ํ ์ฆ๊ฑฐ์ด๋ฉฐ, UI ๊ฐ๋ฐ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆด ์ ์๋ ๊ฐ๋จํ๋ฉด์๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ง ์ผ์์ ์ธ ์ํฌํ๋ก์ฐ์ ์์ ํ ํตํฉํ์ง ์์๋ค๋ฉด, ์ง๊ธ์ด ์์ํ๊ธฐ์ ์๋ฒฝํ ์๊ฐ์ ๋๋ค. ์ด ์์ ๋ค์ ๊น์ด ํ๊ณ ๋ค์ด ์คํํด๋ณด๊ณ , ๋ ๊นจ๋ํ๊ณ , ๋ ๋น ๋ฅด๋ฉฐ, ๋ ์๋งจํฑํ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฆ๊ฐ์ ์ธ ์ด์ ์ ๊ฒฝํํด ๋ณด์ธ์.