Skip to content

Commit e09a3e0

Browse files
authored
docs: page layout example translated into Korean (#742)
1 parent 6ffd3d1 commit e09a3e0

File tree

1 file changed

+104
-0
lines changed
  • i18n/kr/docusaurus-plugin-content-docs/current/guides/examples

1 file changed

+104
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
---
2+
sidebar_position: 3
3+
---
4+
5+
# Page layouts
6+
7+
์ด ๊ฐ€์ด๋“œ๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ , ์ฃผ์š” ๋‚ด์šฉ๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” _ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ_ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
8+
9+
:::info
10+
11+
์ด ๊ฐ€์ด๋“œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์งˆ๋ฌธ์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ์˜ค๋ฅธ์ชฝ ํŒŒ๋ž€์ƒ‰ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์„ ๋ฐ˜์˜ํ•ด ๊ฐ€์ด๋“œ๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค!
12+
13+
:::
14+
15+
## ๊ฐ„๋‹จํ•œ ๋ ˆ์ด์•„์›ƒ
16+
17+
๊ฐ„๋‹จํ•œ ๋ ˆ์ด์•„์›ƒ ์˜ˆ์‹œ๋กœ ์„ค๋ช… ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” ์‚ฌ์ดํŠธ ๋‚ด๋น„๊ฒŒ์ด์…˜์ด ํฌํ•จ๋œ ํ—ค๋”, ๋‘ ๊ฐœ์˜ ์‚ฌ์ด๋“œ๋ฐ”, ์™ธ๋ถ€ ๋งํฌ๊ฐ€ ํฌํ•จ๋œ ํ‘ธํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์—†์œผ๋ฉฐ, ๋™์ ์ธ ๋ถ€๋ถ„์€ ์‚ฌ์ด๋“œ๋ฐ”์™€ ํ—ค๋” ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ํ…Œ๋งˆ ์ „ํ™˜ ๋ฒ„ํŠผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ ˆ์ด์•„์›ƒ์€ shared/ui ๋˜๋Š” app/layouts์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ์‚ฌ์ด๋“œ๋ฐ” ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
18+
19+
```tsx title="shared/ui/layout/Layout.tsx"
20+
import { Link, Outlet } from "react-router-dom";
21+
import { useThemeSwitcher } from "./useThemeSwitcher";
22+
23+
export function Layout({ siblingPages, headings }) {
24+
const [theme, toggleTheme] = useThemeSwitcher();
25+
26+
return (
27+
<div>
28+
<header>
29+
<nav>
30+
<ul>
31+
<li> <Link to="/">Home</Link> </li>
32+
<li> <Link to="/docs">Docs</Link> </li>
33+
<li> <Link to="/blog">Blog</Link> </li>
34+
</ul>
35+
</nav>
36+
<button onClick={toggleTheme}>{theme}</button>
37+
</header>
38+
<main>
39+
<SiblingPageSidebar siblingPages={siblingPages} />
40+
<Outlet /> {/* ์—ฌ๊ธฐ์— ์ฃผ์š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค */}
41+
<HeadingsSidebar headings={headings} />
42+
</main>
43+
<footer>
44+
<ul>
45+
<li>GitHub</li>
46+
<li>Twitter</li>
47+
</ul>
48+
</footer>
49+
</div>
50+
);
51+
}
52+
```
53+
54+
```ts title="shared/ui/layout/useThemeSwitcher.ts"
55+
export function useThemeSwitcher() {
56+
const [theme, setTheme] = useState("light");
57+
58+
function toggleTheme() {
59+
setTheme(theme === "light" ? "dark" : "light");
60+
}
61+
62+
useEffect(() => {
63+
document.body.classList.remove("light", "dark");
64+
document.body.classList.add(theme);
65+
}, [theme]);
66+
67+
return [theme, toggleTheme] as const;
68+
}
69+
```
70+
71+
์‚ฌ์ด๋“œ๋ฐ”์˜ ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ๋ถ„ ์ƒ์ƒ์— ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜‰.
72+
73+
## layout์— widget ์‚ฌ์šฉํ•˜๊ธฐ
74+
75+
์ƒํ™ฉ์— ๋”ฐ๋ผ layout์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ [React Router][ext-react-router]์™€ ๊ฐ™์€ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๊นŠ์ด ์ค‘์ฒฉ๋œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ด๋Ÿฌํ•œ ์š”๊ตฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ layout์„ shared๋‚˜ widgets ํด๋”์— ๋‘๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” [layer์— ๋Œ€ํ•œ import ๊ทœ์น™][import-rule-on-layers] ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:
76+
77+
> slice์˜ module์€ ์ž์‹ ๋ณด๋‹ค ํ•˜์œ„ layers์— ์œ„์น˜ํ•œ ๋‹ค๋ฅธ slice๋งŒ importํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
78+
79+
์ด ๋ฌธ์ œ๊ฐ€ ์ •๋ง ์ค‘์š”ํ•œ์ง€ ๋จผ์ € ๊ณ ๋ คํ•ด ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ์ด _์ •๋ง๋กœ ํ•„์š”ํ•œ๊ฐ€์š”?_ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ ˆ์ด์•„์›ƒ์ด _์ •๋ง๋กœ widget์ด์–ด์•ผ ํ• ๊นŒ์š”?_ ๋งŒ์•ฝ ํ•ด๋‹น ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด 2-3๊ฐœ์˜ ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ , ๋ ˆ์ด์•„์›ƒ์ด ๊ทธ widget์„ ๊ฐ์‹ธ๋Š” ์—ญํ• ์ด๋ผ๋ฉด, ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”:
80+
81+
1. **App ๋ ˆ์ด์–ด์—์„œ ์ธ๋ผ์ธ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์ž‘์„ฑํ•˜๊ธฐ**
82+
App ๋ ˆ์ด์–ด์—์„œ ์ง์ ‘ ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘์ฒฉ๋œ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠน์ • ๊ฒฝ๋กœ ๊ทธ๋ฃน์—๋งŒ ํ•ด๋‹น ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
83+
84+
2. **๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ**
85+
์ฝ”๋“œ ์ถ”์ƒํ™”๋Š” ํ•ญ์ƒ ์ข‹์€ ์„ ํƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ ๋ ˆ์ด์•„์›ƒ์€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ํŽ˜์ด์ง€๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์›๋“ค์ด ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฑธ ์žŠ์„๊นŒ ๋ด ๊ฑฑ์ •๋œ๋‹ค๋ฉด, ํŽ˜์ด์ง€ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋ณด์„ธ์š”. ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ํ˜‘์—…์ด ๋” ํŽธํ•ด์งˆ ๊ฑฐ์˜ˆ์š”.
86+
87+
์œ„์˜ ๋‚ด์šฉ์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ ˆ์ด์•„์›ƒ์— widget์„ ํฌํ•จํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค:
88+
89+
1. **render props๋‚˜ slots ์‚ฌ์šฉํ•˜๊ธฐ**
90+
๋Œ€๋ถ€๋ถ„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํ‘œ์‹œ๋  UI ์š”์†Œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. React์—์„œ๋Š” [render props][ext-render-props]๋ผ๊ณ  ํ•˜๋ฉฐ, Vue์—์„œ๋Š” [slots][ext-vue-slots]์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
91+
2. **๋ ˆ์ด์•„์›ƒ์„ App ๋ ˆ์ด์–ด๋กœ ์ด๋™ํ•˜๊ธฐ**
92+
๋ ˆ์ด์•„์›ƒ์„ `app/layouts` ๋“ฑ App ๋ ˆ์ด์–ด์— ์ €์žฅํ•˜๊ณ  ์›ํ•˜๋Š” widget์„ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
93+
94+
## ์ถ”๊ฐ€ ์ž๋ฃŒ
95+
96+
React ๋ฐ Remix(React Router์™€ ์œ ์‚ฌ)์˜ ์ธ์ฆ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์ถ•์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” [ํŠœํ† ๋ฆฌ์–ผ][tutorial]์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
97+
98+
99+
[tutorial]: /docs/get-started/tutorial
100+
[import-rule-on-layers]: /docs/reference/layers#import-rule-on-layers
101+
[ext-react-router]: https://reactrouter.com/
102+
[ext-render-props]: https://www.patterns.dev/react/render-props-pattern/
103+
[ext-vue-slots]: https://vuejs.org/guide/components/slots
104+

0 commit comments

Comments
ย (0)