๋ฆฌ์กํธ ํ๋ก์ ํธ์์ CSS ๋ฐฉ์, dangerouslySetInnerHTML, ๋ณ๋์ ์ปดํฌ๋ํธ ๋ฐฉ์ ๋ฑ์ผ๋ก ๋ฌธ์์ด ๋ฐ์ดํฐ์ ์ค๋ฐ๊ฟ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํ ํ ์ ์๋ค.
์ต์ข ์ ์ผ๋ก ๊ถ์ฅํ๋ ๋ฐฉ์์ ๋ณ๋์ ์ปดํฌ๋ํธ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ฐ์ฅ ์ ํฉํ๋ค:
- ์ฌ์ฌ์ฉ์ฑ: ๊ฐ์ ์ค๋ฐ๊ฟ ๋ก์ง์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ ์ง๋ณด์: ๋ฉ์์ง ํฌ๋งคํ ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์ด, ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ผ๊ด๋๊ฒ ์ ์ฉํ๊ธฐ ์ฝ๋ค.
- ํ์ฅ์ฑ: ์ถํ์ ๋ฉ์์ง ์ฒ๋ฆฌ ๋ก์ง์ ์ถ๊ฐ์ ์ธ ๋ณํ ๋ก์ง(์: ํน์ ๋จ์ด์ ์คํ์ผ ์ ์ฉ)์ด ํ์ํ ๋ ์ด ์ปดํฌ๋ํธ๋ฅผ ํ์ฅํ๊ธฐ ์ฝ๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ณด์์ ์ผ๋ก ์์ ํ๋ฉฐ, dangerouslySetInnerHTML์ ๋ณด์ ์ทจ์ฝ์ ์์ด ์ ์ฌํ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค. CSS ๋ฐฉ์์ ๋งค์ฐ ๋จ์ํ์ง๋ง, ๋ฉ์์ง ์ฒ๋ฆฌ์ ์์ด ๋ค๋ฅธ HTML ํ๊ทธ ์ ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์์ด ๋ณต์กํ ์๊ตฌ์ฌํญ์๋ ์ ํฉํ์ง ์๋ค.
1. CSS ์ฌ์ฉ - ๊ฐ์ฅ ๊ฐ๋จ
๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. CSS์ white-space: pre-line; ์์ฑ์ ์ฌ์ฉํด ๋ฌธ์์ด ๋ด์ ์ค๋ฐ๊ฟ(\n)์ HTML์์ ์ธ์ํ ์ ์๋๋ก ํ๋ค.
interface Props {
message: string;
}
export default function Intro({ message }: Props) {
return (
<div style={{ whiteSpace: 'pre-line' }}>
{message}
</div>
);
}
2. dangerouslySetInnerHTML ๋ฐฉ์ - ๊ถ์ฅ๋์ง ์์
dangerouslySetInnerHTML๋ฅผ ์ฌ์ฉํ์ฌ HTML๋ก ๋ฉ์์ง๋ฅผ ์ง์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ด๋ค. XSS ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ ๋ ์ฃผ์๊ฐ ํ์ํ๋ค.
interface Props {
message: string;
}
export default function Intro({ message }: Props) {
const formattedMessage = { __html: message.replace(/\n/g, '<br>') };
return (
<div dangerouslySetInnerHTML={formattedMessage} />
);
}
3. ๋ณ๋์ ์ปดํฌ๋ํธ ๋ฐฉ์ โญ๊ถ์ฅ
๋ฉ์์ง ๋ด์ \n์ <br /> ํ๊ทธ๋ก ๋ณํํ์ฌ ๋ ๋๋งํ๋ ๋ณ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ์ฅ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ๋ฐฉ๋ฒ์ด๋ค.
interface Props {
message: string;
}
export default function Intro({ message }: Props) {
const formattedMessage = message.split('\n').map((part, index, array) => (
<React.Fragment key={index}>
{part}{index !== array.length - 1 && <br />}
</React.Fragment>
));
return (
<div>
{formattedMessage}
</div>
);
}
'๐ฉโ๐ป hello, world! > react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
dangerouslySetInnerHTML (1) | 2024.11.18 |
---|---|
date-fns ๋ผ์ด๋ธ๋ฌ๋ฆฌ (1) | 2024.11.12 |
JSON Server ์ฌ์ฉ (1) | 2024.11.05 |
[error] es lint error - ์ค ๋ฐ๊ฟ ํ์ ์๋ฌ(CRLF/LF) (0) | 2024.11.05 |
[error] es lint error - Unknown options: extensions, resolvePluginsRelativeTo - 'extensions' has been removed. (0) | 2024.11.05 |