๐ 05. a ํ๊ทธ ๊น๊ฒ ํ๊ธฐ: href='#' ๋ ์ด์ ๋ฒ๋ฆฌ์
๐ ๊ฐ์
href, target, rel, download, tel:/mailto: โ ์ต์ปค ํ๊ทธ์ ๋ชจ๋ ์์ฑ๊ณผ ๋ณด์ ํจ์ , Next.js Link ์ปดํฌ๋ํธ์์ ์ฐจ์ด๋ฅผ ํํค์นฉ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ / ํต์ฌ ํํธ๋ง: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[a ํ๊ทธ์ ์ง์ง ์ญํ ] โ [href ์์ ํด๋ถ] โ [target + rel ๋ณด์] โ [Next.js Link vs a] โ [๋งํฌ ์ ๊ทผ์ฑ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
href์ ๋ค์ด๊ฐ ์ ์๋ URL ์คํด ์ข ๋ฅ๋ฅผ ์ค๋ช ํ ์ ์๋ค. -
target="_blank"์rel="noopener noreferrer"๋ฅผ ์ ํจ๊ป ์จ์ผ ํ๋์ง ๋ณด์ ์๋ฆฌ๋ก ์ค๋ช ํ ์ ์๋ค. -
<a href="#">๋์<button>์ ์ธ ํ๋จ ๊ธฐ์ค์ ๊ฐ๋๋ค. - Next.js
<Link>์ HTML<a>์ ์ฐจ์ด๋ฅผ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋, ์ ๋ฒํผ์ฒ๋ผ ์๊ธด ๋งํฌ ๋ง๋ค๊ณ ์ถ์ด์
<a href='#'>์ onClick ๋ฌ์์ด์. ๊ทธ๋ฆฌ๊ณ ์ธ๋ถ ๋งํฌ๋ ์ ํญ์์ ์ด๋ฆฌ๊ฒ target='_blank' ๋ฃ์๋๋ฐ ์ด๊ฑฐ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "๋ ๊ฐ์ง ๋ค ๊ณ ์ณ์ผ ํด์.
href='#'์ URL์#์ผ๋ก ๋ฐ๊พธ๋ ๋ถ์์ฉ์ด ์๊ณ , ์ง์ง ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ ์๋ ๊ฑฐ๋ฉด<button>์ด ๋ง์์. ๊ทธ๋ฆฌ๊ณtarget='_blank'์rel='noopener'์์ผ๋ฉด ๋ณด์ ๊ตฌ๋ฉ์ด ์๊ธธ ์ ์์ด์."
๐ค ์ ์์์ผ ํ๋๊ฐ
์์๋ค ์ปค๋ฎค๋ํฐ ๋ณด์ ๊ฐ์ฌ์์ ์ธ๋ถ ๋งํฌ ํ์ด์ง์ ๊ฒฝ๊ณ ๊ฐ ๋ด๋ค.
๐ฆ ์ํธ ๋ฆฌ๋: "์์ฒ ๋, ์ธ๋ถ ๋งํฌ ์ ๋ถ rel='noopener noreferrer' ๋น ์ ธ์์ด์. target='_blank' ๋ก ์ด๋ฆฌ๋ ํญ์ด window.opener ๋ก ์ฐ๋ฆฌ ์๋ณธ ํญ์ ์ ๊ทผํ ์ ์์ด์. ์
์ฑ ์ฌ์ดํธ๊ฐ ๋งํฌ๋ฅผ ํ๊ณ ์ฐ๋ฆฌ ์๋น์ค URL์ ํผ์ฑ ํ์ด์ง๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค."
<!-- โ ์์ฒ ์ด์ ์ํํ ์ธ๋ถ ๋งํฌ -->
<a href="https://external-site.com" target="_blank">์ธ๋ถ ๋งํฌ</a>
<!-- ์ด ์ ํญ์์ window.opener.location = 'https://phishing-site.com' ๊ฐ๋ฅ! -->๐ 1. href โ ๋งํฌ๊ฐ ๊ฐ ์ ์๋ ๋ชจ๋ ๊ณณ
<a> ๋ URL ํ์์ด๋ผ๋ฉด ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ๋งํฌ๋ก ๋ง๋ค ์ ์์ด.
<!-- ์ผ๋ฐ URL -->
<a href="https://example.com">์ธ๋ถ ์ฌ์ดํธ</a>
<a href="/posts">๋ด๋ถ ํ์ด์ง (์ ๋ ๊ฒฝ๋ก)</a>
<a href="./about">ํ์ฌ ๋๋ ํ ๋ฆฌ ๊ธฐ์ค (์๋ ๊ฒฝ๋ก)</a>
<!-- ํ์ด์ง ๋ด ํน์ ์น์
์ผ๋ก ์ด๋ (Fragment Identifier) -->
<a href="#section-2">์น์
2๋ก ์ด๋</a>
<!-- ์ด๋ ๋์ ์์: <h2 id="section-2">์น์
2</h2> -->
<!-- ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ ์ด๊ธฐ -->
<a href="mailto:support@ysdeveloper.community">์ด๋ฉ์ผ ๋ฌธ์</a>
<a href="mailto:help@example.com?subject=์ ๋ชฉ&body=๋ด์ฉ">์ ๋ชฉ ํฌํจ ์ด๋ฉ์ผ</a>
<!-- ์ ํ ๊ฑธ๊ธฐ (๋ชจ๋ฐ์ผ์์ ์๋ ๋ค์ด์ผ) -->
<a href="tel:+82-10-1234-5678">์ ํํ๊ธฐ</a>
<!-- ํ์ผ ๋ค์ด๋ก๋ (๋์ผ ์ถ์ฒ๋ง ์๋) -->
<a href="/files/report.pdf" download="2025-์ฐ๊ฐ๋ณด๊ณ ์.pdf">PDF ๋ค์ด๋ก๋</a>๐ซ
javascript:void(0)์ ๋ ๊ธ์ง
href="javascript:void(0)"๋ JavaScript๊ฐ ๊บผ์ ธ ์๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋๋ฉด ์๋ฌด๊ฒ๋ ์ ๋ผ์.
๋ถ๋งํฌ, ๋งํฌ ๋ณต์ฌ, ์ ํญ ์ด๊ธฐ๋ ์ ๋ถ ๋ง๊ฐ์ ธ์. ๋ฒํผ์ด ํ์ํ๋ฉด<button>์ ์จ์ผ ํด์.
๐ก๏ธ 2. target + rel โ ์ ํญ ๋ณด์์ ์ง์ค
2-1. target="_blank" ์ window.opener ๋ณด์ ์ทจ์ฝ์
<!-- โ ๊ตฌ๋ฒ์ ๋ธ๋ผ์ฐ์ ๊ธฐ์ค ์ํํ ํจํด -->
<a href="https://external-bad-site.com" target="_blank">์ธ๋ถ ๋งํฌ</a>target="_blank" ๋ก ์ด๋ฆฐ ์ ํญ์ window.opener ๋ก ์๋ณธ ํญ์ ์ ๊ทผํ ์ ์์์ด (๊ตฌ๋ฒ์ ๋ธ๋ผ์ฐ์ ). ์
์ฑ ์ฌ์ดํธ๊ฐ ์ด๊ฑธ ์ด์ฉํด์ ์๋ณธ ํญ์ URL์ ํผ์ฑ ์ฌ์ดํธ๋ก ๋ฐ๊ฟ ์ ์์์ด.
<!-- โ
์์ ํ ์ธ๋ถ ๋งํฌ ํจํด -->
<a
href="https://external-site.com"
target="_blank"
rel="noopener noreferrer"
>
์ธ๋ถ ๋งํฌ (์ ํญ, ์์ )
</a>rel="noopener":window.opener๋ฅผnull๋ก ์ค์ โ ์๋ณธ ํญ ์ ๊ทผ ๋ถ๊ฐrel="noreferrer":RefererHTTP ํค๋๋ฅผ ๋ณด๋ด์ง ์์ โ ์ด๋์ ์๋์ง ์ธ๋ถ์ ๋ ธ์ถ ์ ๋จ
๐ ์ต์ ๋ธ๋ผ์ฐ์ ์์๋?
๋ชจ๋ ๋ธ๋ผ์ฐ์ (Chrome 88+, Firefox 79+)๋target="_blank"์ ์๋ฌต์ ์ผ๋กnoopener๋ฅผ ์ ์ฉํด์ค์. ํ์ง๋ง ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ์ง์์ด๋ ๋ช ์์ ์๋ ์ ๋ฌ์ ์ํด ๋ช ์์ ์ผ๋กrel="noopener noreferrer"๋ฅผ ์ฐ๋ ๊ฒ 5๋ ์ฐจ์ ์ต๊ด์ด์์.
2-2. rel ์์ฑ์ ๋ค๋ฅธ ๊ฐ๋ค
<!-- SEO: ์ด ๋งํฌ๋ ๊ฒ์์์ง์ด ๋ฐ๋ผ๊ฐ์ง ๋ง ๊ฒ -->
<a href="https://ads.example.com" rel="nofollow">๊ด๊ณ ๋งํฌ</a>
<!-- ์ด์ /๋ค์ ํ์ด์ง (SEO ํํธ) -->
<a href="/posts?page=2" rel="next">๋ค์ ํ์ด์ง</a>
<a href="/posts?page=1" rel="prev">์ด์ ํ์ด์ง</a>๐ 3. <a> vs <button> โ ๊ฐ์ฅ ๋ง์ด ํท๊ฐ๋ฆฌ๋ ์ ํ
๐ฃ ์์ฒ : "๊ทธ๋ผ href='#' ์ฐ๋ฉด ์ ๋๋ฉด ์ธ์ <a> ์ฐ๊ณ ์ธ์ <button> ์จ์?"
Q. ์ด ์์๋ฅผ ํด๋ฆญํ๋ฉด...
โโ ๋ค๋ฅธ URL/ํ์ด์ง๋ก ์ด๋ํ๋๊ฐ? โ <a href="..."> ์ฌ์ฉ
โโ ํ์ฌ ํ์ด์ง์์ ๋์(toggle, submit, open modal ๋ฑ)์ธ๊ฐ?
โ <button> ์ฌ์ฉ
<!-- โ ์๋ชป๋ ํจํด: ๋งํฌ์ฒ๋ผ ์๊ธด ๋ฒํผ -->
<a href="#" onclick="openModal()">๋ชจ๋ฌ ์ด๊ธฐ</a>
<!-- ํด๋ฆญ ์ URL์ด '#'์ผ๋ก ๋ฐ๋๊ณ , ํ์ด์ง ์๋จ์ผ๋ก ์ ํ -->
<!-- โ
์ฌ๋ฐ๋ฅธ ํจํด -->
<button type="button" onclick="openModal()">๋ชจ๋ฌ ์ด๊ธฐ</button>
<!-- CSS๋ก ๋งํฌ์ฒ๋ผ ์คํ์ผ๋ง ๊ฐ๋ฅ, ๊ธฐ๋ฅ์ ๋ฒํผ -->
<!-- โ
์ฌ๋ฐ๋ฅธ ๋งํฌ: ์ค์ ํ์ด์ง ์ด๋ -->
<a href="/posts/1">๊ฒ์๊ธ ๋ณด๊ธฐ</a>ํค๋ณด๋ ์ ๊ทผ์ฑ ์ฐจ์ด:
<a>: Enter ํค๋ก ํ์ฑํ, Tab์ผ๋ก ํฌ์ปค์ค ์ด๋<button>: Enter + Space ๋ฐ ๋ ๋ค ํ์ฑํ, Tab์ผ๋ก ํฌ์ปค์ค ์ด๋
โ๏ธ 4. Next.js <Link> vs HTML <a>
๐ฃ ์์ฒ : "Next.js์์๋ <Link> ๋ฅผ ์จ์ผ ํ๋ค๊ณ ํ๋๋ฐ, <a> ๋ ๋ญ๊ฐ ๋ฌ๋ผ์?"
import Link from "next/link";
// โ Next.js์์ <a> ์ฌ์ฉ: ํ ํ์ด์ง ๋ฆฌ๋ก๋ ๋ฐ์
<a href="/posts">๊ฒ์ํ</a>
// โ
Next.js <Link>: SPA์ฒ๋ผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ค๋น๊ฒ์ด์
// ์ ์ฒด ๋ฆฌ๋ก๋ ์์ด ํ์ํ ์ปดํฌ๋ํธ๋ง ๊ต์ฒด
<Link href="/posts">๊ฒ์ํ</Link>
// Link ์ฃผ์ props
<Link
href="/posts/1"
prefetch={true} // hover ์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ ๋ก๋ (๊ธฐ๋ณธ๊ฐ)
replace={false} // ํ์คํ ๋ฆฌ push ๋์ replace
>
๊ฒ์๊ธ ๋ณด๊ธฐ
</Link>Next.js <Link> ๊ฐ <a> ๋ณด๋ค ๋์ ์ด์ :
- Prefetching: ๋ทฐํฌํธ์ ๋ณด์ด๋ Link ๋ฅผ ๋ฏธ๋ฆฌ ํจ์น โ ํด๋ฆญ ์ ์ฆ๊ฐ ๋ฐ์
- SPA ๋ฐฉ์ ์ด๋: ๊ณตํต ๋ ์ด์์(
layout.tsx)์ ์ ์งํ๊ณ ๋ณ๊ฒฝ๋ ์ปดํฌ๋ํธ๋ง ๊ต์ฒด - ์คํฌ๋กค ๋ณต์: ๋ค๋ก๊ฐ๊ธฐ ์ ์ด์ ์คํฌ๋กค ์์น ์๋ ๋ณต์
๋จ, ์ธ๋ถ ๋งํฌ๋ Next.js
<Link>๊ฐ ์๋<a target="_blank" rel="noopener noreferrer">์ฌ์ฉ!
โฟ 5. ๋งํฌ ์ ๊ทผ์ฑ โ ๋งํฌ ํ ์คํธ๊ฐ ์ ๋ถ๋ค
์คํฌ๋ฆฐ๋ฆฌ๋๋ ํ์ด์ง์ ๋ชจ๋ ๋งํฌ๋ฅผ ๋ชฉ๋ก์ผ๋ก ์ฝ์ด์ค. ๋งํฌ ํ ์คํธ๊ฐ ๋งฅ๋ฝ ์์ด ๋ถ๋ถ๋ช ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ด๋๋ก ๊ฐ๋์ง ์ ์ ์์ด.
<!-- โ ๋์ ๋งํฌ ํ
์คํธ: ๋งฅ๋ฝ ์์ -->
<p>์์ธํ ๋ด์ฉ์ <a href="/posts/1">์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ธ์</a>.</p>
<!-- ์คํฌ๋ฆฐ๋ฆฌ๋: "์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ธ์" โ ์ด๋๋ก ๊ฐ๋์ง ๋ชจ๋ฆ -->
<!-- โ
์ข์ ๋งํฌ ํ
์คํธ: ๋ชฉ์ ์ง๊ฐ ๋ช
ํํจ -->
<p>์์ธํ ๋ด์ฉ์ <a href="/posts/1">๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๊ฐ์ด๋</a>๋ฅผ ์ฐธ๊ณ ํ์ธ์.</p>
<!-- ์คํฌ๋ฆฐ๋ฆฌ๋: "๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๊ฐ์ด๋" โ ๋ช
ํํ ๋ชฉ์ ์ง -->
<!-- ์์ด์ฝ๋ง ์๋ ๋งํฌ: aria-label ํ์ -->
<a href="/settings" aria-label="์ค์ ํ์ด์ง๋ก ์ด๋">
<svg>...</svg> {/* ์์ด์ฝ๋ง ์์ผ๋ฉด ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ์ฝ์ ๋ด์ฉ์ด ์์ */}
</a>๐ ํต์ฌ ํจํด ์ด์ ๋ฆฌ
| ์ํฉ | ์ฌ๋ฐ๋ฅธ ํจํด |
|---|---|
| ๋ด๋ถ ํ์ด์ง ์ด๋ (Next.js) | <Link href="/path"> |
| ์ธ๋ถ ๋งํฌ ์ ํญ ์ด๊ธฐ | <a href="..." target="_blank" rel="noopener noreferrer"> |
| ํด๋ฆญ ๋์ (๋ชจ๋ฌ, ํ ๊ธ) | <button type="button"> |
| ์ ํ ๋งํฌ | <a href="tel:+821012345678"> |
| ์ด๋ฉ์ผ ๋งํฌ | <a href="mailto:user@example.com"> |
| ํ์ผ ๋ค์ด๋ก๋ | <a href="/file.pdf" download="ํ์ผ๋ช
.pdf"> |
| ์์ด์ฝ ์ ์ฉ ๋งํฌ | <a href="..." aria-label="๋ชฉ์ ์ง ์ค๋ช
"> |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ค ๋ณด์๊ณผ ์ ๊ทผ์ฑ ๋ชจ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ ์ธ๋ถ ๋งํฌ๋?
- A)
<a href="https://example.com" target="_blank">์ธ๋ถ ๋งํฌ</a> - B)
<a href="https://example.com" target="_blank" rel="noopener noreferrer">์ธ๋ถ ๋งํฌ (์ ํญ์์ ์ด๋ฆผ)</a> - ๊ฐ)
<a href="https://example.com" rel="noopener">์ธ๋ถ ๋งํฌ</a> - ๋ผ)
<a href="javascript:window.open('https://example.com')">์ธ๋ถ ๋งํฌ</a>
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
target="_blank"๋ก ์ ํญ์ ์ด ๋rel="noopener"๊ฐ ์์ผ๋ฉด ๊ตฌ๋ฒ์ ๋ธ๋ผ์ฐ์ ์์window.opener๋ฅผ ํตํ ์๋ณธ ํญ ์ ๊ทผ์ด ๊ฐ๋ฅํด์.rel="noreferrer"๋ Referer ํค๋๋ฅผ ์ฐจ๋จํด ๋ฐฉ๋ฌธ ๊ฒฝ๋ก ๋ ธ์ถ์ ๋ง์ต๋๋ค. B๋ ์ฌ์ฉ์์๊ฒ ์ ํญ์์ ์ด๋ฆฐ๋ค๋ ํํธ๋ ํ ์คํธ๋ก ์ ๊ณตํด ์ ๊ทผ์ฑ๋ ์ฐ์ํด์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "
target='_blank'= ๋ฐ๋์rel='noopener noreferrer'์ธํธ๋ก"
Q2. ์๋ ์ฝ๋์ ๋ฌธ์ ์ ๊ณผ ์ฌ๋ฐ๋ฅธ ์์ ๋ฒ์?
<a href="#" onclick="toggleMenu()">๋ฉ๋ด ์ด๊ธฐ</a>โ
์ ๋ต: URL์ด # ์ผ๋ก ๋ฐ๋๋ ๋ถ์์ฉ๊ณผ ์๋งจํฑ ๋ฏธ์ค๋งค์น. <button type="button" onclick="toggleMenu()">๋ฉ๋ด ์ด๊ธฐ</button> ์ผ๋ก ์์
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
<a>๋ "๋ค๋น๊ฒ์ด์ (์ด๋)์ ์ํ ์์" ์ ๋๋ค.href="#"์ ํด๋ฆญํ๋ฉด ํ์ด์ง URL์ด#์ผ๋ก ๋ฐ๋๊ณ ์๋จ์ผ๋ก ์ ํํ๋ ๋ถ์์ฉ์ด ์๊ฒจ์. ๋ฉ๋ด ํ ๊ธ์ ์ด๋์ด ์๋ "๋์(Action)" ์ด๋ฏ๋ก<button>์ด ์๋งจํฑ/์ ๊ทผ์ฑ ๋ชจ๋ ๋ง์ต๋๋ค. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ด๋ํ๋ฉด
<a>, ๋์ํ๋ฉด<button>"
Q3. ์์ฒ ์ด์ ํ ์คํธ ํ์
์์ฒ ์ด๋ Next.js ํ๋ก์ ํธ์์ ๊ฒ์๊ธ ๋ชฉ๋ก ํ์ด์ง๋ฅผ ๋ง๋ค์๋ค.
๊ฐ ๊ฒ์๊ธ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ์์ธ ํ์ด์ง๋ก ์ด๋ํ๋ ์ฝ๋๋ฅผ ์งฐ๋๋ฐ,
์ํธ ๋ฆฌ๋๊ฐ "์ด ๋งํฌ๋ฅผ ํด๋ฆญํ ๋๋ง๋ค ํ์ด์ง ์ ์ฒด๊ฐ ์๋ก๊ณ ์นจ ๋ผ์"๋ผ๊ณ ์ฝ๋ฉํธ๋ฅผ ๋จ๊ฒผ๋ค.์์ฒ ์ด๊ฐ ์ด ์ฝ๋:
<a href="/posts/1">๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๊ฐ์ด๋</a>์ด๋ป๊ฒ ์์ ํด์ผ ํ๊ณ , ์ ๊ทธ๋์ผ ํ๋๊ฐ?
โ
์ ๋ต: import Link from 'next/link' ํ <Link href="/posts/1">๋ฆฌ์กํธ ์ํ๊ด๋ฆฌ ๊ฐ์ด๋</Link> ๋ก ์์
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: HTML
<a>๋ ํด๋ฆญ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ ์ ์ฒด HTML์ ๋ค์ ๋ก๋ํด์. Next.js<Link>๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ผ๋ก ํ์ฌ ํ์ด์ง์ ๊ณตํต ๋ ์ด์์์ ๊ทธ๋๋ก ๋๊ณ , ๋ฐ๋ ํ์ด์ง ์ฝํ ์ธ ๋ง ๊ต์ฒดํด์. ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ๋ค์ด๋ก๋๊ฐ ์์ด์ ํจ์ฌ ๋น ๋ฅด๊ณ , Prefetch ๋๋ถ์ hover ์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํด ํด๋ฆญ ์ฆ์ ๋ฐ์ํด์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "Next.js ๋ด๋ถ ๋งํฌ =
<Link>, ์ธ๋ถ ๋งํฌ =<a target='_blank' rel='noopener noreferrer'>"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ ์ํธ ๋ฆฌ๋ ๋์ด ๋ด PR์์ href='#' ๋ฌ๋ฆฐ ๋ถ๋ถ์ ์ ๋ถ <button> ์ผ๋ก ๋ฐ๊พธ๋ผ๊ณ ํ์ ๋ ์ฒ์์ ์ข ์ต์ธํ๋ค. "์ด์ฐจํผ CSS๋ก ๋๊ฐ์ด ์๊ธฐ์์์" ํ๋๋ ๋ฆฌ๋ ๋์ด ์ง์ Tab ํค๋ก ์์ฐํด์ฃผ์
จ๋ค. ์ ์ง์ง... ํค๋ณด๋๋ก ํ์ํ๋ ์ฌ๋ ์
์ฅ์์ <a href='#'> ๋ '์ด๋๊ฐ๋ฅผ ํ์ํ๋ ๋งํฌ'์ฒ๋ผ ๋๊ปด์ง๋๋ฐ ๋ฒํผ ๋์์ ํ๋๊น ์์ ํ ์ฌ์ฉ์ ๊ธฐ๋๋ฅผ ๋ฐฐ์ ํ๋ ๊ฑฐ์๋ค.
๐ก "
<a>๋ ์ด๋๋ก ๊ฐ ์ด๋ํ ๋,<button>์ ๋ฌด์ธ๊ฐ๋ฅผ ํ ๋.href='#'์ onClick ๋ค๋ ๊ฑด ์ง๋(a)์ ๋ง์น์ง(button)ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค."
๊ทธ๋ฆฌ๊ณ rel='noopener noreferrer' ์ด๊ฑฐ... ์ด๋ ๊ฒ ์ค์ํ ๋ณด์ ์์ฑ์ด์๋์ง ๋ชฐ๋๋ค. ์์ผ๋ก๋ ์ธ๋ถ ๋งํฌ ์ธ ๋ reflexively(๋ฐ์ฌ์ ์ผ๋ก) ๋ถ์ฌ์ผ๊ฒ ๋ค. ์ค๋ ์ ๋
์ ๋ฐฅ ๋จน์ผ๋ฉด์ Next.js Link ์ปดํฌ๋ํธ prefetch ๋์ ๋ ํ๋ด์ผ์ง.
๐ ๋ ์์๋ณด๊ธฐ