Development
ํ์ด์ง ์์ธ์ด ์์ฑ๋์ง ์์: ์ฌ์ฉ์๊ฐ ์ ํํ ํ์ค์ด ์๋ ์ค๋ณต ํ์ด์ง
9/17/2024


์ ๋ธ๋ก๊ทธ์ ๊ธ์ ๊ตฌ๊ธ ์์น ์ฝ์์ ๋ฑ๋กํ๋ ๊ณผ์ ์์ 'ํ์ด์ง ์์ธ์ด ์์ฑ๋์ง ์์: ์ฌ์ฉ์๊ฐ ์ ํํ ํ์ค์ด ์๋ ์ค๋ณต ํ์ด์ง' ๋ผ๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด ์ค๋ฅ๋ ์ ๋ฐ์ํ ๊น์?

๊ตฌ๊ธ ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, ์ ๋ฌธ์ ๋ ๊ตฌ๊ธ ์ธก์์ ํด๋น ๋ฌธ์๊ฐ ๋ค๋ฅธ ํ์ด์ง์ ์ค๋ณต๋์๋ค๊ณ ํ๋จํ์ฌ ๋ฑ๋ก์ ๊ฑฐ์ ํ ๊ฒ์ด์์ต๋๋ค. ์ ๊ฐ์ด๋๋ผ์ธ๋๋ก URL ๊ฒ์ฌ๋ฅผ ํตํด Google์์ ์ ํํ ํ์ค URL์ ํ์ธํด๋ณด๋ ๋ธ๋ก๊ทธ์ ๋ฉ์ธ์ธ https://petefolio.xyz/ ์ ๊ฐ์ ํ์ด์ง๋ผ๊ณ ํ๋จํ ๊ฒ์ผ๋ก ๋ณด์์ต๋๋ค.

ํ ํธ, ์ ์์ ์ผ๋ก ๋ฑ๋ก๋ ๊ธ์๋ Google์์ ์ ํํ ํ์ค URL์ '๊ฒ์ฌ๋ URL'์ด๋ผ๋ ๊ฐ์ด ๋ณด์ฌ์ง๋๋ค.

๋ ๊ธ์ ์๋ก ์ถฉ๋ถํ ๋ค๋ฅธ ์ฃผ์ ์ ๋ํด ์์ฑ๋์๋๋ฐ ํ๋๋ ์ ์์ ์ผ๋ก ๋ฑ๋ก๋๊ณ ํ๋๋ ์คํจํ ์ด์ ๊ฐ ๋ฌด์์ผ๊น์? ์ค์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์ค URL ์ง์ ํ๊ธฐ
ํ์ค URL์ด๋ ์ฌ๋ฌ ๊ฐ์ ์ ์ฌํ๊ฑฐ๋ ๋์ผํ ์ปจํ ์ธ ๋ฅผ ๊ฐ์ง ํ์ด์ง์ ๋ํด์ ๊ฒ์ ์์ง์ด ๋ฑ๋กํ ๋ํ URL์ ์๋ฏธํฉ๋๋ค.
๋ง์ฝ example.com/page?sort=asc, example.com/page?sort=desc๋ผ๋ URL์ด ์๊ณ , ์ด๋ค๋ก ๋ฆฌ๋ค์ด๋ ํธ๋๋ example.com/page-redirect๋ผ๋ URL์ด ์๋ค๊ณ ๊ฐ์ ํ ๋, ๊ตฌ๊ธ์ ์ด๋ค์ ๋ชจ๋ ์ ์ฌํ ์ปจํ ์ธ ๋ก ํ๋จํ๊ณ ๋ํ URL์ example.com/page๋ก ์ง์ ํ์ฌ ๊ฒ์ ์์ง์ ์ต์ ํ ํฉ๋๋ค.
์น์ฌ์ดํธ ์์ ์ ์ ์ฅ์์๋ ์ด๋ฌํ ๋ํ URL์ ์ง์ ํ๋ ๊ฒ์ ์ ๋ฆฌํ๊ฒ ์์ฉํฉ๋๋ค. ์น์ฌ์ดํธ ์์ ์๋ ํ์ค URL์ ์ฌ์ฉํจ์ผ๋ก์จ ์ด๋ค URL์ด ๊ฒ์๊ฒฐ๊ณผ์์ ์ฌ๋๋ค์๊ฒ ํ์๋ ์ง ๊ฒฐ์ ํ ์ ์๊ณ , ๋จ์ผ ์ฝํ ์ธ ๋ฅผ ๋จ์ผ URL๋ก ๋ ธ์ถํจ์ผ๋ก์จ analytics๋ฅผ ๋น๋กฏํ ์ธก์ ๋ฐ ์ถ์ ์ ํ๋ ๊ธฐ๋ฅ์๋ ๋จ์ํ์ ํจ๊ณผ๋ฅผ ๋๋ฆด ์ ์์ต๋๋ค.
ํ์ค URL์ ๊ธฐ๋ณธ์ ์ผ๋ก Google์์ ํ๋จํ์ฌ ์ง์ ํด์ฃผ์ง๋ง, ์น์ฌ์ดํธ ์์ ์ ์ธก์์ ์ด๋ฅผ ์ง์ ์ง์ ํ ์๋ ์์ต๋๋ค. ์ ์ ๊ฒฝ์ฐ ๊ตฌ๊ธ์ ํ๋จํ ๋ด์ญ์ ๋ํ ์์ ์ ํ๊ธฐ ์ํด, ํ์ค URL์ ์ง์ ์ง์ ํ์ฌ ์์ธ ์์ฑ์ ์คํจํ ๊ธ์ ๋ํด ๋ค์๊ธ ๋ฑ๋ก๋ ์ ์๋๋ก ์๋ํด ๋ณด์์ต๋๋ค.
canonical

ํ์ค URL์ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ๋ฌธ์์ ์์ผ๋ฉฐ, ์ ๋ ๊ฐ์ฅ ๊ฐ๋จํ <link> ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก URL ํ์คํ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค.
ํ์ง๋ง link ํ๊ทธ๋ฅผ javascript๋ฅผ ํตํด ์ฝ์ ํ๋ ๊ฒ์ ํฌ๋กค๋ง์ ๋ถ๋ฆฌํฉ๋๋ค. ํ๋์ ํฌ๋กค๋ฌ๋ค์ javascript๋ฅผ ์คํ ํ ๋ค ์ ๋ณด๋ฅผ ์ฝ๊ธฐ๋ ํ์ง๋ง, ๋ณด๋ค ๋ค์ํ ํฌ๋กค๋ฌ์ link ํ๊ทธ๋ฅผ ์ธ์์ํค๋ ค๋ฉด link ํ๊ทธ๊ฐ ์ ์ ํ์ผ์ ํฌํจ๋์ด์๋ ๊ฒ์ด ์ ๋ฆฌํฉ๋๋ค. ์ ๋ ํ์ฌ ๊ตฌ๊ธ ๊ฒ์ ์์ง์๋ง ํ์ด์ง๋ฅผ ๋ฑ๋กํ๊ณ ์๊ณ , ๊ตฌ๊ธ์ ํฌ๋กค๋ฌ๋ javascript๋ฅผ ์คํ์์ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฏ๋ก, ์คํํ๊ฒฝ์์ ํ๊ทธ๋ฅผ ๋ฃ๋ ๋ฐฉ์์ผ๋ก๋ง ๊ตฌํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
react-helmet์ React component ๋ฐฉ์์ผ๋ก html ๋ฌธ์์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
npm i react-helmet @types/react-helmetimport React from "react";
import {Helmet} from "react-helmet";
class Application extends React.Component {
render () {
return (
<div className="application">
<Helmet>
<link rel="canonical" href="http://mysite.com/example" />
</Helmet>
...
</div>
);
}
};์์ ๊ฐ์ด Helmet ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ๋ด๋ถ์ canonical ๋งํฌ ํ๊ทธ๋ฅผ ๋ฃ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๊ฒฝ์ฐ๋ href๊ฐ ๋์ ์ผ๋ก ๋ฐ๋์ด์ผ ํ๋ฏ๋ก, ๊ฒ์๊ธ ํ์ด์ง ์ปดํฌ๋ํธ์์ Helmet ํ๊ทธ๋ฅผ ์ฌ์ฉํ ๋ค href์ window.location.href ๊ฐ์ ๋ฃ์ด์ฃผ์์ต๋๋ค.

๋ฐฐํฌ ์ดํ URL ๊ฒ์ฌ๋ฅผ ์ํํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ์ธํ ํ์ค URL์ ํด๋น ํ์ด์ง์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ํตํด ๊ตฌ๊ธ์ด ์ค์ธํ ํ์ค URL์ ์๋ง๊ฒ ์ ์ ํ ์ดํ, ์ธ๋ฑ์ค ์ฌ ์์ฑ์ ์์ฒญํ์ฌ ์ ์์ ์ผ๋ก ๊ฒ์์์ง์ ๊ธ์ ๋ฑ๋กํ ์ ์์์ต๋๋ค.