Capstone #7. [RN] ์ •์  ๋ฐ์ดํ„ฐ๋Š” ScrollView, ๋™์  ๋ฐ์ดํ„ฐ๋Š” FlatList / FlatList์˜ props ์ข…๋ฅ˜

2024. 11. 15. 21:54ใ†Study_Develop/React Native

๋ฐ˜์‘ํ˜•

 

์•ˆ๋…•ํ•˜์„ธ์š”!

์˜ค๋Š˜์€ React Native์˜ ScrollView์™€ FlatList์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”!

 

์ €์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์„ ํƒ๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”.

(์•„๋งˆ๋‘?? ใ…Žใ…Žใ…Ž....)

 

๋‘ ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋Š” ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ

์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์•„์ดํ…œ์„ ๊ฐ์‹ธ๋Š” ์ปดํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ชจ๋‘ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋ Œ๋”๋ง์ด ๋ผ์š”!

๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ง ์Šคํฌ๋กค์„ ์ง€์›ํ•˜์ง€๋งŒ, horizontal ์†์„ฑ์„ ํ†ตํ•ด ์ˆ˜ํ‰ ์Šคํฌ๋กค๋„ ์ง€์›ํ•œ๋‹ต๋‹ˆ๋‹ค!

 

์ด๋ ‡๊ฒŒ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ธ๋ฐ, 

์–ด๋–ค ์ฐจ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์–ด๋–ค ์ƒํ™ฉ์— ์–ด๋–ป๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ์“ฐ๋Š”์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด

ํ”„๋กœ์ ํŠธ์— ๋”์šฑ ๋” ๋„์›€ ๋˜์‹ค ๊ฑฐ์˜ˆ์š” ~~โค๏ธโค๏ธ

 

ScrollView ์˜ ์“ฐ์ž„

 

 

ScrollView ๋Š” ํ™”๋ฉด ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์š”

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ธด ํ…์ŠคํŠธ, ๊ฐœ์ˆ˜๊ฐ€ ํ•œ์ •๋œ ๋ฆฌ์ŠคํŠธ ๋“ฑ์— ์ ํ•ฉํ•ด์š”.

 

์ €๋Š” ๊ทธ๋ž˜์„œ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด, ๊ธ€ ์ž‘์„ฑํ™”๋ฉด์— ์‚ฌ์šฉํ•˜์˜€์–ด์š”.

 

์™œ๋ƒํ•˜๋ฉด,

ํšŒ์›๊ฐ€์ž…์ด๋‚˜ ํ”„๋กœํ•„ ํ™”๋ฉด, ๊ธ€ ์ž‘์„ฑ ํ™”๋ฉด ๋“ฑ๋“ฑ์€

์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋™์  ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•˜์ง€ ์•Š์ž–์•„์š”.

์ด๋Ÿฐ ํ™”๋ฉด์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์–‘์‹ ํ•„๋“œ, ์ •์  ํ…์ŠคํŠธ ๋ฐ ์ผ๋ถ€ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ฑฐ๋‚˜

๊ณ ์ •๋œ ์–‘์˜ ์ •๋ณด ๊ทธ๋ฆฌ๊ณ  ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„

ํ•ด๋‹น ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ ScrollView๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ต๋‹ˆ๋‹ค.

 

 

 

์ด๋Ÿฐ์‹์œผ๋ฃจ์š”!

์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๊ณ  ๊ณ ์ •๋œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋“ค์€

ScrollView๋ฅผ ์ด์šฉํ•˜์˜€๋‹ต๋‹ˆ๋‹ค.

 

ํŠนํžˆ header๋‚˜ footer ๋ชจ๋‘ ํ•˜๋‚˜์˜ ์Šคํฌ๋กค์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด 

ScrollView๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์„ ํƒ์ด ๋  ๊ฒƒ ๊ฐ™์•„์š”!

 

 

FlatList ์˜ ์“ฐ์ž„

 

 

FlatList๋Š” ScrollVIew์™€ ๋‹ฌ๋ฆฌ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ , ํ˜„์žฌ ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋  ์š”์†Œ๋งŒ ๋ Œ๋”๋ง์„ ํ•ด์ค๋‹ˆ๋‹ค.

์ฒซ ํ™”๋ฉด์—์„œ ํ•ด๋‹น ํ™”๋ฉด๋งŒํผ์˜ ์•„์ดํ…œ์ด ๋ Œ๋”๋ง์ด ๋˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋ž˜๋กœ ์Šค์™€์ดํ•‘ ํ•จ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ์•„์ดํ…œ๋“ค์„

๋ Œ๋”๋ง ํ•˜๊ฒŒ ํ•ด ์ค˜์š”!

 

๋ญ”๊ฐ€ ์ฑ„ํŒ…์ด๋‚˜ ๋˜๊ฒŒ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”~~??

 

์‹ค์ œ๋กœ ๊ธธ๊ณ  ๋™์ ์ธ ํ•ญ๋ชฉ ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ํ™”๋ฉด์— FlatList๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๋ฐ˜๋ณต ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋”๋”์šฑ FlatList๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ๋ฉด ์ข‹์•„์š”!

 

์ €๋Š” ํ”ผ๋“œ ํ˜น์€ ๋ฉ”์‹œ์ง€ ๋ชฉ๋ก, ์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก ๋“ฑ๋“ฑ ๋™์  ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํฐ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ๋“ค์„ 

FlatList๋กœ ํ‘œํ˜„ํ•ด ์ฃผ์—ˆ์–ด์š”.

 

 

 

์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ๋“ค์ด์š”!

๋ฐ์ดํ„ฐ๋“ค์ด ๋™์ ์œผ๋กœ ๋งŽ์ด ์ƒ์„ฑ๋˜์ž–์•„์š”.

๊ทธ๋Ÿฌ๋‹ˆ ์ผ๋‹จ ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋จผ์ € ๋กœ๋“œํ•˜๊ณ  ์Šคํฌ๋กคํ•  ๋•Œ ๋™์ ์œผ๋กœ ๋กœ๋“œ/์–ธ๋กœ๋“œ ํ•˜์—ฌ

๋ Œ๋”๋ง์„ ๋”์šฑ ์ตœ์ ํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ FlatList๊ฐ€ ScrollView๋ณด๋‹ค ์„ฑ๋Šฅ๋ฉด์—์„œ๋Š” ๋›ฐ์–ด๋‚˜๊ฒ ์ฃ ?

 

๊ทธ๋ž˜์„œ์ธ์ง€ ์ฝ”๋“œ ๊ตฌํ˜„๋„ ์กฐ๊ธˆ ๋ณต์žกํ•ด์š” ใ…Žใ…Ž

ํ•˜์ง€๋งŒ ์ดํ•ดํ•˜๊ณ  ๋ณด๋ฉด ํ• ๋งŒํ•˜๋‹ค๋Š” ๊ฑฐ!

 

FlatList ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ / FlatList Props ์ข…๋ฅ˜

 

 

FlatList๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ถ€๋ถ„ or ์„ค์ •ํ•œ ๊ฐœ์ˆ˜๋งŒํผ ๋งŒ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ๋ชจ๋ฅผ ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ์ปดํฌ๋„ŒํŠธ

 

๋ Œ๋”๋ง ์ดˆ๊ธฐ์—๋Š” ์ ์ ˆํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ Œ๋”๋ง ํ•œ ๋’ค, ์œ ์ €์˜ ์ƒํ˜ธ์ž‘์šฉ์— ์˜ํ•ด Scroll์ด ์›€์ง์ผ ๋•Œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข€ ๋” ํ–ฅ์ƒ๋จ

 

์œ„์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”Œ๋žซ๋ฆฌ์ŠคํŠธ!

 

const [posts, setPosts] = useState([]);

 const fetchPosts = async (isInitialLoad = false) => {
    try {
      const response = await Client.users.getBoard();
      setPosts(response.data);
    } catch (error) {
      ... ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค
    }
  };

 const renderPost = ({item}) => {
    return (
      <TouchableOpacity
         ... ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค
      </TouchableOpacity>
    );
  };

<FlatList
          data={posts}
          renderItem={renderPost}
          keyExtractor={(item) => item.id}
          contentContainerStyle={HomeStyle.listContent}
          refreshControl={
            <RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
          }
/>

 

 

๋ฉ”์ธ ํ™”๋ฉด๋‹จ์—์„œ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

FlatList์˜ props๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค!

 

- data : ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ source๋ฅผ ๋‹ด๋Š” props์ž…๋‹ˆ๋‹ค.

fetchPost์—์„œ ๋ฉ”์ธ ํ™”๋ฉด์— ๋ฟŒ๋ ค์ง€๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ posts์— ๋‹ด์•˜์–ด์š”.

 

- renderItem : 1๊ฐœ์˜ item์„ render ์‹œํ‚ค๋Š” props์ž…๋‹ˆ๋‹ค. item์ด๋ผ๊ณ  ์ด๋ฆ„ ์ง“๋Š” ๊ฒƒ์€ ์•ฝ์†๋œ ์ปจ๋ฒค์…˜์ด์—์š”!

 

- keyExtractor : ๊ฐ ํ•ญ๋ชฉ์— ๊ณ ์œ ํ•œ ํ‚ค๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”! ์ด๋Š” react native์˜ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค! (์ œ๋Œ€๋กœ ์•ˆ ํ•ด์ฃผ๋ฉด key์ค‘๋ณต ์›Œ๋‹์ด๋‚˜ ์—๋Ÿฌ๊ฐ€ ์—„์ฒญ ๋– ์š”.. ์ด ๋ถ€๋ถ„ ์ž˜ ์ง€์ •ํ•ด ์ฃผ์„ธ์š”)

 

์ œ ์ฝ”๋“œ์—์„œ

 

keyExtractor={item => item.id}

 

๊ฐ ํ•ญ๋ชฉ์— ๊ณ ์œ ํ•œ id๋ฅผ ์ง€์ •ํ•ด์ฃผ๊ณ  ์žˆ์ฃ 

๊ฐ๊ฐ ์•ˆ์ •์ ์ธ ์‹๋ณ„์ž๋ฅผ ๊ฐ–๋„๋ก ๋ณด์žฅํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค!

์„ฑ๋Šฅ์„ ๋”์šฑ ํ–ฅ์ƒํ•˜๊ณ  ๋ชฉ๋ก์˜ ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ถ€์ ์ ˆํ•œ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ui ๊ฒฐํ•จ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค!

 

- refreshControl : ๋‹น๊ฒจ์„œ ์ƒˆ๋กœ ๊ณ ์นจ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜์˜€์–ด์š”

 

 

+) ์ถ”๊ฐ€ ์•Œ์•„๋‘๋ฉด ๋„์›€ ๋˜๋Š” props๋“ค

 

- onEndReachedThreshold : ๋ชฉ๋ก์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์•„์ดํ…œ์˜ ์–ด๋А ๋†’์ด์— ๋„๋‹ฌ ์‹œ onEndReached์ด ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์ง€์ •( ๊ฐ’ : 0~1, ๋†’์„์ˆ˜๋ก ๋นจ๋ฆฌ onEndReached๊ฐ€ ์ˆ˜ํ–‰)

 

- onEndReached : ์Šคํฌ๋กค์ด ๋ชฉ๋ก์˜ ํ•˜๋‹จ์— ๋„๋‹ฌํ•  ์‹œ ์•ก์…˜ ์ง€์ •

 

- ListHeaderComponent : ๋ชฉ๋ก์˜ ์ƒ๋‹จ, ํ•ญ๋ชฉ ์•ž์— ๋ Œ๋”๋ง ํ•  ๊ตฌ์„ฑ์š”์†Œ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ—ค๋”, ์ œ๋ชฉ ๋˜๋Š” ๊ธฐํƒ€ ์†Œ๊ฐœ ์ฝ˜ํ…์ธ ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์š”!

 

- ListFooterComponent : ๋ชจ๋“  ํ•ญ๋ชฉ ๋’ค ๋ชฉ๋ก ํ•˜๋‹จ์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด์š”. 

 

- initialNumToRender : ์Šคํฌ๋กคํ•˜๊ธฐ ์ „์— ์ฒ˜์Œ ๋ Œ๋”๋ง ํ•  ํ•ญ๋ชฉ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ชฉ๋ก์ด ํด ๋•Œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๋ฐ ์œ ์šฉํ•ด์š”

 

- maxToRenderPerBatch : ํ•œ ๋ฐฐ์น˜๋กœ ๋ Œ๋”๋ง ํ•  ์ตœ๋Œ€ ํ•ญ๋ชฉ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๋ Œ๋”๋ง ๋˜๋Š” ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

- horizontal : true๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ์„ธ๋กœ๊ฐ€ ์•„๋‹Œ ๊ฐ€๋กœ๋กœ ์Šคํฌ๋กค๋ฉ๋‹ˆ๋‹ค.

 

- extraData : ๋ชฉ๋ก์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋ชฉ๋ก์˜ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

 

- listEmptyComponent : data ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ์„ ๋•Œ ๋ Œ๋”๋งํ•  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•ด์š”!

 

- ItemSeparatorComponent : ๋ชฉ๋ก์˜ ํ•ญ๋ชฉ ์‚ฌ์ด์— ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. 

๋ชฉ๋ก ํ•ญ๋ชฉ ์‚ฌ์ด์— ์ค„์ด๋‚˜ ๊ฐ„๊ฒฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์š”!

 

 - onRefresh : ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฉ๋ก์„ ์ƒˆ๋กœ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ๋‹น๊ธธ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ ๋ฉ๋‹ˆ๋‹ค.

 

- scrollEnabled : ๋ชฉ๋ก ์Šคํฌ๋กค์„ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

false๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 


 

์œ ์šฉํ•œ props๋“ค์ด ์ •๋ง ๋งŽ์ฃ !

์ด props๋กœ ์ •๋ง ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”

 

๋‚˜์˜ ํ”„๋กœ์ ํŠธ ํ™”๋ฉด์˜ ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ

์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ค„ ์•„๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋ฉ์‹œ๋‹น~~ ๐Ÿคฉ๐Ÿคฉโค๏ธโค๏ธ๐Ÿ˜๐Ÿ˜โญโญ๐Ÿ‘๐Ÿ‘

 

๊ทธ๋Ÿผ 20000..