๐ 08. table & list ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ: ๋ ์ด์์์ฉ table์ ์ด์ ์๋
๐ ๊ฐ์
table thead/tbody/tfoot, scope, caption, ul/ol/dl โ ํ์ ๋ชฉ๋ก์ ์๋งจํฑ ๊ตฌ์กฐ์ ์ ๊ทผ์ฑ, React์์์ ๋ฐ์ดํฐ ํ ์ด๋ธ ํจํด์ ๋ค๋ฃน๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ / ํต์ฌ ํํธ๋ง: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[table์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ๊ธฐ์ค] โ [ํ ์๋งจํฑ ๊ตฌ์กฐ] โ [์ ๊ทผ์ฑ ์์ฑ] โ [ul/ol/dl ์ ํ ๊ธฐ์ค] โ [React ๋ฐ์ดํฐ ํ ์ด๋ธ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋ ์ด์์์ฉ
<table>์ด ์ ์ ๋๋์ง ์ค๋ช ํ ์ ์๋ค. -
<thead>,<tbody>,<tfoot>,<caption>,scope๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ธ ์ ์๋ค. -
<ul>,<ol>,<dl>์ ์ํฉ๋ณ ์ฌ์ฉ ์ฐจ์ด๋ฅผ ์ค๋ช ํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋, ์คํฐ๋ ๋ฉค๋ฒ ๋ชฉ๋ก ํ๋ฉด์ table ๋ก ์ง๋ ๋์ฃ ? ๊ทธ๋ฆฌ๊ณ ์คํฐ๋ ์ผ์ ์... ๊ทธ๋ฅ div ์ญ ๋์ดํด๋ ๋๋ ๊ฑฐ์ฃ ?"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "๋ฉค๋ฒ ๋ชฉ๋ก์ฒ๋ผ 'ํยท์ด ๊ด๊ณ๊ฐ ์๋ ๋ฐ์ดํฐ' ๋ผ๋ฉด table ์ด ๋ง์์. ๊ทผ๋ฐ ์ผ์ ๊ฐ์ด ์์ ์๋ ๋ชฉ๋ก์
<ol>, ์์ ์์ผ๋ฉด<ul>, ์ฉ์ด์ ์ค๋ช ์ด๋ฉด<dl>์ด์์. ์๋งจํฑํ๊ฒ ์ฐ๋ฉด ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ '3๊ฐ์ ํญ๋ชฉ์ด ์๋ ๋ชฉ๋ก' ์ด๋ผ๊ณ ์ฝ์ด์ฃผ๊ฑฐ๋ ์."
๐ 1. table โ ํยท์ด ๊ด๊ณ ์๋ ๋ฐ์ดํฐ๋ง
๋ ์ด์์์ table ์ฐ๋ฉด ์ ๋๋ ์ด์ :
- ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ "ํ ์ด๋ธ, X์ด Yํ" ์ด๋ผ๊ณ ์ฝ์ด๋ฒ๋ฆผ โ ๋ ์ด์์ ์๋์ ํผ๋
- ๋ฐ์ํ ์ฒ๋ฆฌ ๋ณต์ก
- ๋ชจ๋ฐ์ผ์์ ๊ฐ๋ก ์คํฌ๋กค ๋ฐ์
<!-- โ
์ฌ๋ฐ๋ฅธ ์๋งจํฑ table ๊ตฌ์กฐ -->
<table>
<!-- caption: ํ์ ์ ๋ชฉ (์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๋จผ์ ์ฝ์) -->
<caption>์์๋ค ์ปค๋ฎค๋ํฐ ์คํฐ๋ ๋ฉค๋ฒ ํํฉ</caption>
<thead>
<tr>
<!-- scope="col": ์ด ํค๋๊ฐ ์ด ํค๋์์ ์ ์ธ -->
<th scope="col">์ด๋ฆ</th>
<th scope="col">์ง๊ตฐ</th>
<th scope="col">๋ ๋ฒจ</th>
<th scope="col">๊ฐ์
์ผ</th>
</tr>
</thead>
<tbody>
<tr>
<!-- scope="row": ์ด ์
์ด ํ ํค๋์์ ์ ์ธ -->
<th scope="row">์์ฒ </th>
<td>ํ๋ก ํธ์๋</td>
<td>์ ์
</td>
<td><time datetime="2025-01-15">2025.01.15</time></td>
</tr>
<tr>
<th scope="row">์ํธ</th>
<td>ํ์คํ</td>
<td>๋ฆฌ๋</td>
<td><time datetime="2023-03-01">2023.03.01</time></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="4">์ด ๋ฉค๋ฒ: 2๋ช
</td>
</tr>
</tfoot>
</table>์คํฌ๋ฆฐ๋ฆฌ๋๋ ์ด table์ ์ด๋ ๊ฒ ์ฝ์ด:
"ํ: ์์๋ค ์ปค๋ฎค๋ํฐ ์คํฐ๋ ๋ฉค๋ฒ ํํฉ. 4์ด 3ํ. ์ด๋ฆ ์ด ํค๋. ์ง๊ตฐ ์ด ํค๋. ... ์์ฒ ํ ํค๋. ํ๋ก ํธ์๋. ์ ์ . 2025๋ 1์ 15์ผ."
scope ์์ฑ ์์ด <th> ๋ง ์ฐ๋ฉด ๋ณต์กํ ํ์์ ์ด๋ ๋ฐฉํฅ(ํ/์ด)์ ํค๋์ธ์ง ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ํผ๋ํ ์ ์์ด.
๐ 2. ul / ol / dl โ ์ํฉ๋ณ ์ ํ ๊ธฐ์ค
<!-- ul: ์์ ์๋ ๋ชฉ๋ก (ํญ๋ชฉ ๋์ด) -->
<ul>
<li>๋ฆฌ์กํธ ๋ ๋๋ง ์ดํดํ๊ธฐ</li>
<li>TypeScript ๊ธฐ์ด ๋ค์ง๊ธฐ</li>
<li>CSS Flexbox ์ ๋ณตํ๊ธฐ</li>
</ul>
<!-- ol: ์์ ์๋ ๋ชฉ๋ก (๋จ๊ณ, ์์) -->
<ol>
<li>ํ๋ก์ ํธ ๊ธฐํ์ ์์ฑ</li>
<li>์์ด์ดํ๋ ์ ์ ์</li>
<li>๊ฐ๋ฐ ํ๊ฒฝ ์ธํ
</li>
<li>MVP ๊ฐ๋ฐ ์์</li>
</ol>
<!-- dl: ์ฉ์ด(dt) + ์ค๋ช
(dd) ์ ๋ชฉ๋ก -->
<dl>
<dt>DOM</dt>
<dd>๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ํ์ฑํด ๋ง๋ ๋
ธ๋ ํธ๋ฆฌ ๊ฐ์ฒด ๊ตฌ์กฐ</dd>
<dt>CSSOM</dt>
<dd>CSS๋ฅผ ํ์ฑํด ๋ง๋ ๊ฐ์ฒด ๊ตฌ์กฐ, DOM๊ณผ ํฉ์ณ Render Tree ์์ฑ</dd>
</dl>์ ํ ๊ธฐ์ค ํ:
| ์ํฉ | ํ๊ทธ | ์์ |
|---|---|---|
| ์์ ์๋ ๋์ด | <ul> | ๊ธฐ๋ฅ ๋ชฉ๋ก, ๋ฉค๋ฒ ๋ชฉ๋ก |
| ์์ ์๋ ๋จ๊ณ/์์ | <ol> | ํํ ๋ฆฌ์ผ ๋จ๊ณ, ๋ญํน |
| ์ฉ์ด + ์ค๋ช ์ | <dl> | ์ฌ์ , ์ฉ์ด์ง, ๋ฉํ๋ฐ์ดํฐ |
| ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด | <nav> + <ul> | ํค๋ ๋ด๋น, ์ฌ์ด๋๋ฐ |
โ๏ธ 3. React์์ ๋ฐ์ดํฐ ํ ์ด๋ธ
// ํ์
์ ์
interface Member {
id: number;
name: string;
role: string;
level: string;
}
// ์๋งจํฑ ํ
์ด๋ธ ์ปดํฌ๋ํธ
function MemberTable({ members }: { members: Member[] }) {
return (
<table>
<caption>์คํฐ๋ ๋ฉค๋ฒ ํํฉ</caption>
<thead>
<tr>
<th scope="col">์ด๋ฆ</th>
<th scope="col">์ง๊ตฐ</th>
<th scope="col">๋ ๋ฒจ</th>
</tr>
</thead>
<tbody>
{members.map((member) => (
<tr key={member.id}>
<th scope="row">{member.name}</th>
<td>{member.role}</td>
<td>{member.level}</td>
</tr>
))}
</tbody>
</table>
);
}๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๋ณต์กํ ํ ์ด๋ธ์์ ์ ์ด ์ด๋ค ํค๋์ ์ํ๋์ง ์ฌ๋ฐ๋ฅด๊ฒ ์ฝํ๊ฒ ํ๋ ค๋ฉด?
โ
์ ๋ต: <th> ์ scope="col" (์ด ํค๋) ๋๋ scope="row" (ํ ํค๋) ์์ฑ ์ ์ฉ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
scope์์ฑ์ ์คํฌ๋ฆฐ๋ฆฌ๋์๊ฒ "์ด<th>๋ ์ด ๋ฐฉํฅ์ ํค๋์ผ" ๋๋ "ํ ๋ฐฉํฅ์ ํค๋์ผ" ๋ฅผ ๋ช ์ํด์. ๋ณต์กํ ํ์์ ๋ฐฉํฅ ์์ด<th>๋ง ์ฐ๋ฉด ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ์ด๋ ์ ์ ํค๋์ธ์ง ํ์ ํ์ง ๋ชปํ ์ ์์ด์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ด ์ ๋ชฉ
<th>=scope='col', ํ ์ฒซ ์ <th>=scope='row'"
Q2. ์๋ ์ค <ol> ์ด ์๋ <ul> ์ ์จ์ผ ํ๋ ์ํฉ์?
- A) ์คํฐ๋ ์ ์ฒญ ์ ์ฐจ (1๋จ๊ณ โ 2๋จ๊ณ โ 3๋จ๊ณ)
- B) ์ธ๊ธฐ ๊ฒ์๊ธ TOP 5 ๋ญํน
- ๊ฐ) ์ค๋์ ์คํฐ๋ ์ฃผ์ ํ๊ทธ ๋ชฉ๋ก
- ๋ผ) ๋ ์ํผ ์กฐ๋ฆฌ ์์
โ ์ ๋ต: ๊ฐ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์์ ์์ฒด๊ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ(๋จ๊ณ ์์, ์์, ์กฐ๋ฆฌ ์์)๋
<ol>, ํญ๋ชฉ์ ๋จ์ ๋์ดํ๋ ๊ฒฝ์ฐ(ํ๊ทธ ๋ชฉ๋ก, ๊ธฐ๋ฅ ๋ชฉ๋ก ๋ฑ)๋<ul>์ด์์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์์๊ฐ ์ค์ํ๋ค =
<ol>, ์์ ์์ด ๋์ด =<ul>"
Q3. ์์ฒ ์ด์ ํ ์คํธ ํ์
์์๋ค ์ปค๋ฎค๋ํฐ FAQ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๊ฐ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ด ์์ผ๋ก ์๋ค.
์ด๋ค HTML ๊ตฌ์กฐ๋ก ๋งํฌ์ ํด์ผ ํ๋๊ฐ?
โ
์ ๋ต: <dl> + <dt> (์ง๋ฌธ) + <dd> (๋ต๋ณ) ๊ตฌ์กฐ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
<dl>(Description List)์ ์ด๋ฆ-๊ฐ ์์ ๋ํ๋ด๋ ์๋งจํฑ ์์์์.<dt>(Description Term)๋ ์ฉ์ด/์ง๋ฌธ,<dd>(Description Details)๋ ์ค๋ช /๋ต๋ณ์ ํด๋นํด์. FAQ, ์ฉ์ด์ง, ๋ฉํ๋ฐ์ดํฐ ํํ์ ์๋ฏธ๋ก ์ ์ผ๋ก ๊ฐ์ฅ ์ ํฉํฉ๋๋ค. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "Q&A, ์ฌ์ , ์ฉ์ด์ง =
<dl>+<dt>+<dd>"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
<table> ๋ก ๋ ์ด์์ ์ก์ผ๋ฉด ๊ฐํธํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ "ํ
์ด๋ธ 4์ด 10ํ" ์ด๋ผ๊ณ ์ฝ์ผ๋ฉด์ ๋ ์ด์์์ ํ ๋ฐ์ดํฐ๋ก ์ธ์ํ๋ค๋ ๊ฒ ์ถฉ๊ฒฉ์ด์๋ค. ๊ทธ๋ฆฌ๊ณ <dl> ์ ์ฒ์ ์ ๋๋ก ์จ๋ดค๋๋ฐ, ์ฉ์ด์ง/FAQ ๊ฐ์ ๋ฐ ๋ฑ์ด๋ค ์ถ์๋ค.
๐ก "ํ(
<table>)๋ ๋ฐ์ดํฐ ๊ด๊ณ๋ฅผ ๋ํ๋ผ ๋๋ง, ๋ชฉ๋ก์ ์ํฉ์ ๋ง๋ul/ol/dl์ ๊ณ ๋ฅผ ๊ฒ โ ์๋งจํฑ ๊ตฌ์กฐ๊ฐ ์คํฌ๋ฆฐ๋ฆฌ๋์ ๊ฒ์์์ง์๊ฒ ์๋ฏธ๋ฅผ ์ ๋ฌํ๋ค."
๐ ๋ ์์๋ณด๊ธฐ