Queries
GraphQL Query ๋ GreaphQL ์๋ฒ์์ query
ํ๋ ค๋ ๋ฐ์ดํฐ์ ๋ํ ์ค๋ช
์
๋๋ค. query ๋ ์๋ฒ์ ์์ฒญํ๋ ค๋ ํ๋ ์ธํธ ( ์ ์ฌ์ ์ผ๋ก Fragment)๋ก ๊ตฌ์ฑ ๋ฉ๋๋ค. ์ฟผ๋ฆฌํ ์ ์๋ ํญ๋ชฉ์ ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช
ํ๋ ์๋ฒ์ ๋
ธ์ถ๋ GraphQL ์คํค๋ง ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค .
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์ฟผ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ ํ์ ๋ณ์(variables) ์ปฌ๋ ์ ๊ณผ ํจ๊ป ๋คํธ์ํฌ๋ฅผ ํตํด ์์ฒญ์ผ๋ก ๋ณด๋ผ์์์ต๋๋ค.
query UserQuery($id: ID!) {
user(id: $id) {
id
name
...UserFragment
}
viewer {
actor {
name
}
}
}
fragment UserFragment on User {
username
}
์ด ์ฟผ๋ฆฌ๋ ์๋์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
{
"data": {
"user": {
"id": "4",
"name": "Mark Zuckerberg",
"username": "zuck"
},
"viewer": {
"actor": {
"name": "Your Name"
}
}
}
}
Rendering Queries
Relay์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋๋ง ํ๊ธฐ ์ํด์ usePreloadedQuery ๋ผ๋ hook ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. usePreloadedQuery ๋ ์ฟผ๋ฆฌ์ ์ ์์ ์ฐธ์กฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ์ฌ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
import type {HomeTabQuery} from 'HomeTabQuery.graphql';
const React = require('React');
const {graphql, usePreloadedQuery} = require('react-relay');
type Props = {
queryRef: PreloadedQuery<HomeTabQuery>,
};
function HomeTab(props: Props) {
const data = usePreloadedQuery<HomeTabQuery>(
graphql`
query HomeTabQuery($id: ID!) {
user(id: $id) {
name
}
}
`,
props.queryRef,
);
return (
<h1>{data.user?.name}</h1>
);
}
usePreloadedQuery ๋ graphql
์ฟผ๋ฆฌ์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ํด๋น ์ฟผ๋ฆฌ์ ๋ํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
HomeTab ์ด๋ผ๋ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ์๋ Props ๋ก ๋ด๋ ค๋ฐ๋ queryRef๋ฅผ ์ค๋ช ํ๊ณ ์ฐธ์กฐํ์ฌ ์ฟผ๋ฆฌ์ ํด๋น๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
PreloadedQuery๋ relay Complier ๊ฐ ์์ฑํด์ฃผ๋ type parameter ๋ฅผ ํ์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ ๊ฒฝ์ฐ์๋
HomeTabQuery
์ ํ์ ์ด ์ฌ๊ธฐ์ ํด๋น๋ฉ๋๋ค.ํ๋๊ทธ๋จผํธ ์ ์ ์ฌํ๊ฒ ๊ตฌ์ฑ ์์๋ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ๊ตฌ๋ ํฉ๋๋ค . ์ด ์ฟผ๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ฑ์ ์ด๋์์๋ ์ ๋ฐ์ดํธ๋๋ฉด ๊ตฌ์ฑ ์์๋ ์ต์ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
usePreloadedQuery ๋ํ type parameter ๋ฅผ HomeTabQuery ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค.
Relay๋ ๋ค์๊ณผ ๊ฐ์ ์ด๋ฆ ํ์์ผ๋ก ์์ฑ๋ ํ์ผ์์ ๊ฐ์ ธ์ฌ ์ ์๋ ์ ์ธ๋ ์ฟผ๋ฆฌ์ ๋ํด type์ ์๋์ผ๋ก ์์ฑํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์.
<query_name>
.graphql.js
์ฟผ๋ฆฌ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ด์ ์ Relay Environment Provider ๋ก root ๋ฅผ ๊ฐ์ธ Relay ํ๊ฒฝ์ด ์ ๊ณต๋๋์ง ํ์ธํด์ผํฉ๋๋ค.
Fetching Queries for Render
์ฟผ๋ฆฌ๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ ์ธ์๋ ์ฟผ๋ฆฌ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฑ์ ๋ฃจํธ ์ด๋๊ฐ์์ ํ๋ ๋๋ ๋ช๊ฐ์ ์ฟผ๋ฆฌ๋ก ํ๋ฉด์ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ์ถ์ ํ ์์๋๋ก ๋ง๋ค๊ธธ ์ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ์ฑ ๋ ๋๋ง์ ์์ํ๊ธฐ ์ ์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋์ค์ ์ฟผ๋ฆฌ๋ฅผ ์๋ฒ์์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์useQueryLoader
Hook ์ ์ฌ์ฉํ ์ ์์ต๋๋ค .
import type {HomeTabQuery as HomeTabQueryType} from 'HomeTabQuery.graphql';
import type {PreloadedQuery} from 'react-relay';
const HomeTabQuery = require('HomeTabQuery.graphql')
const {useQueryLoader} = require('react-relay');
type Props = {
initialQueryRef: PreloadedQuery<HomeTabQueryType>,
};
function AppTabs(props) {
const [
homeTabQueryRef,
loadHomeTabQuery,
] = useQueryLoader<HomeTabQueryType>(
HomeTabQuery,
props.initialQueryRef, /* e.g. provided by router */
);
const onSelectHomeTab = () => {
// Start loading query for HomeTab immediately in the event handler
// that triggers navigation to that tab, *before* we even start
// rendering the target tab.
// Calling this function will update the value of homeTabQueryRef.
loadHomeTabQuery({id: '4'});
// ...
}
// ...
return (
screen === 'HomeTab' && homeTabQueryRef != null ?
// Pass to component that uses usePreloadedQuery
<HomeTab queryRef={homeTabQueryRef} /> :
// ...
);
}
์ฐ๋ฆฌ๋ useQueryLoader ๋ฅผ AppTabs ์ปดํฌ๋ํธ ์์์ ํธ์ถํ๊ณ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ
HomeTabQuery
์ฟผ๋ฆฌ(์ด์ ์ ์์์ ์ ์ธํ ์ฟผ๋ฆฌ)๊ฐ ํ์ํ๋ฉฐHomeTabQuery.graphql
์์ ์๋ ์์ฑ๋ ํ์ผ์ ์ป์ ์ ์์ต๋๋ค.์ํ์ ์ ์ฅ๋๊ณ useQueryLoader ์ ์ํด ๋ฐํ๋๋
PreloadedQuery
์ ์ด๊ธฐ ๊ฐ์ผ๋ก homeTabQueryRef๋ฅผ ์ฌ์ฉ ์ค์ ๋๋ค.
useQueryLoader ํธ์ถ์ ํตํด ์ฐ๋ฆฌ๋ ๋๊ฐ์ง๋ฅผ ์ป์ ์ ์์ต๋๋ค.
homeTabQueryRef
: ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ฐ์ ธ์จ ์ฟผ๋ฆฌ์ ๋๋ค. ์ด ๊ฐ์ useQueryLoader ๊ฐ ํธ์ถ ๋์ง ์์์ ๊ฒฝ์ฐ null ์ด ๋ฉ๋๋ค. \loadHomeTabQuery
: ์์ง ์บ์๋์ง ์์ ๊ฒฝ์ฐ์๋ ์๋ฒ์์ ์ด ์ฟผ๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ๊ฐ์ ธ์ค๊ณ , ์ฟผ๋ฆฌ๊ฐ ์์ ํ๋ ๋ณ์๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ ํจ์ ์ ๋๋ค. (์ฌ๊ธฐ์๋ {id : 4})
์ด ํจ์๋ฅผ ํธ์ถํ๋ฉด PreloadedQuery ์ฟผ๋ฆฌ ๋์ ์ homeTabQueryRef ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธ ํฉ๋๋ค.
๋ํ
๋ ๋๋ง ์ ์ ๋ฐํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ
์์ ์ด ํจ์๋ฅผ ํธ์ถ ํฉ๋๋ค . ์ด๋ฅผ ํตํด ์ ํญ์ด ๋ ๋๋ง์ ์์ํ๊ธฐ ์ ์๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ํ๋ฉด์ ๋ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค.์ด ํจ์๋ ๋ ๋๋ง ์ค์ ํธ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์ ๋ ๋ ํจ์ ์ธ๋ถ์์ ํธ์ถ ํด์ผ ํฉ๋๋ค . ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
HomeTab ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ AppTabs ์ปดํฌ๋ํธ์์ ํธ์ถํด์ผํฉ๋๋ค.
useQueryLoader ๋ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ ์ ์ฅ ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค. ์ฟผ๋ฆฌ๋ฅผ ์ญ์ ํ๋ฉด Relay๊ฐ ๋ ์ด์ ํด๋น ์ฟผ๋ฆฌ์ ํน์ ์ธ์คํด์ค์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ๋ณด๊ดํ์ง ์์ต๋๋ค. ๋ํ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋, ์ฟผ๋ฆฌ์ ๋ํ ์์ฒญ์ด ์์ง ์งํ ์ค์ธ ๊ฒฝ์ฐ์๋ ์ทจ์๋ฉ๋๋ค.
์ญ์ ๋ง์ง๋ง์ผ๋ก , ์ฟผ๋ฆฌ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ด์ ์ Relay Environment Provider ๋ก root ๋ฅผ ๊ฐ์ธ Relay ํ๊ฒฝ์ด ์ ๊ณต๋๋์ง ํ์ธํด์ผํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๊ธฐ ๋ก๋์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ ์ปจํ ์คํธ ์ธ๋ถ์์ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ useQueryLoader๋ฅผ ์ฌ์ฉํ์ง ์๊ณ loadQuery
๋ฅผ ์ฌ์ฉํด์ API๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import type {HomeTabQuery as HomeTabQueryType} from 'HomeTabQuery.graphql';
const HomeTabQuery = require('HomeTabQuery.graphql')
const {loadQuery} = require('react-relay');
const environment = createEnvironment(...);
// At some point during app initialization
const initialQueryRef = loadQuery<HomeTabQueryType>(
environment,
HomeTabQuery,
{id: '4'},
);
// ...
// E.g. passing the initialQueryRef to the root component
render(<AppTabs initialQueryRef={initialQueryRef} initialTab={...} />)
์ปดํฌ๋ํธ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ ๋ฌํด์ฃผ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ป๊ธฐ ์ํด
loadQuery
ํจ์๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค์ด ๊ฒฝ์ฐ ๋ฃจํธ
AppTabs
์ปดํฌ๋ํธ๊ฐ ์ฟผ๋ฆฌ ์ฐธ์กฐ์ ์๋ช ์ ๊ด๋ฆฌํ๊ณ ์ ์ ํ ์๊ฐ์ ์ญ์ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.์ด ์์ ์์๋ "์ฑ ์ด๊ธฐํ"์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ชจํธํ๊ฒ ๋จ๊ฒจ๋์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค ๋ค๋ฅผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผ ํ ์ค์ํ ์ ์ ๋ฃจํธ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ์์ํ๊ธฐ ์ ์ ์ฟผ๋ฆฌ ์ฐธ์กฐ๋ฅผ ์ป์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํนํ
loadQuery
๋ ๋ ๋๋ง ์ค์๋ ํธ์ถํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ์ ๋ ๋ ํจ์ ์ธ๋ถ์์ ํธ์ถํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Render as you Fetch
์์ ์๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ๊ณ (fetch ๋ฅผ ์์ํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๊ณผ ๋ฐ๋), ์ฌ์ฉ์์๊ฒ ์ฝํ ์ธ ๋ฅผ ํ์ํ ์ ์๋๋ก ๋ฐ์ดํฐ fetch ๊ณผ ๋ ๋๋ง์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ํ waterfalling round trips
์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ fetch๊ฐ ๋ฐ์ํ๋ ์๊ธฐ์ ๋ํด ๋ ๋ง์ ์ ์ด์ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ๋ ๋๋ง ์ค์ ๊ฐ์ ธ์ค๋ฉด fetch๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ฐ์ํด์ผ ํ๋ ์์ ์ ๊ฒฐ์ ํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
์ด๊ฒ์ React Suspense ์ "render-as-you-fetch"ํจํด๊ณผ ์ ๋ง์ต๋๋ค .
์ด๊ฒ์ Relay๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ ํธ๋๋ ํจํด์ด๋ฉฐ ๋ช๋ช์ ์ํฉ์์ ์ ์ฉ์ด ๋๋๋ฐ
์ผ๋ฐ์ ์ผ๋ก๋ ์ฒ์์ UI ๋ณด์ฌ์ง์ง ์๋ค๊ฐ ๋์ค์ ์ํธ ์์ฉ(์: ๋ฉ๋ด, ํ์ค๋ฒ, ๋ํ ์์ ๋ฑ) ๋ฐ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
Lazily Fetching Queries during Render
์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑ ์์๊ฐ ๋ ๋๋ง๋ ๋ ์ฟผ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ฒ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ์ ์ธ๊ธํ๋ฏ์ด ์ ํธ๋๋ ํจํด์ ๋ ๋๋ง ์ ์ ์ฟผ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ๋ ๊ฒ์ ๋๋ค. ์ฃผ์ ์์ด ์ง์ฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ฒฉ ๋๋ waterfalling round trips ํธ๋ฆฌ๊ฑฐ๋๊ณ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ฒ ๊ฐ์ ธ์ค๋ ค๋ฉด useLazyLoadQuery
Hook์ ์ฌ์ฉํ ์ ์์ต๋๋ค .
import type {AppQuery} from 'AppQuery.graphql';
const React = require('React');
const {graphql, useLazyLoadQuery} = require('react-relay');
function App() {
const data = useLazyLoadQuery<AppQuery>(
graphql`
query AppQuery($id: ID!) {
user(id: $id) {
name
}
}
`,
{id: '4'},
);
return (
<h1>{data.user?.name}</h1>
);
}
useLazyLoadQuery
graphql ์ฟผ๋ฆฌ์ ํด๋น ์ฟผ๋ฆฌ์ ๋ํ ์ผ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ํด๋น ์ฟผ๋ฆฌ์ ๋ํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ณ์๋ GraphQL ์ฟผ๋ฆฌ ๋ด์์ ์ฐธ์กฐ ๋๋ ๋ณ์์ ๊ฐ์ ํฌํจํ๋ ๊ฐ์ฒด ์ ๋๋ค.ํ๋๊ทธ๋จผํธ์ ์ ์ฌํ๊ฒ ๊ตฌ์ฑ ์์๋ ์ฟผ๋ฆฌ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ๊ตฌ๋ ํฉ๋๋ค. ์ด ์ฟผ๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์ฑ์ ์ด๋ ๊ณณ์์๋ ์ ๋ฐ์ดํธ๋๋ฉด ๊ตฌ์ฑ ์์๋ ์ต์ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
Relay๋ ์ ์ธ๋ ์ฟผ๋ฆฌ์ ๋ํด type์ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก ๊ฐ์ ธ์ค๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค
useLazyLoadQuery
. ์ด๋ฌํ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ ์ด๋ฆ ํ์์ผ๋ก ์์ฑ๋ ํ์ผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค<query_name>.graphql.js
.
๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํฌ๋ํธ ๋ ๋๋ง๋ ๋ Relay๋ ์ด ์ฟผ๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ
useLazyLoadQuery
(์์ง ์บ์๋์ง ์์ ๊ฒฝ์ฐ) ์ด๋ฅผ ํธ์ถ ๊ฒฐ๊ณผ๋ก ๋ฐํํฉ๋๋ค .์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง ํ๊ณ ์๋ ์ฌ์ฉ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ณ์ ๋ฅผ ์ ๋ฌ ํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์ ๋ณ์๋ก ๋ค์ ๊ฐ์ ธ์์ง๊ณ ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค.
Last updated