๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240418 - React Native ์บ ํ•‘์•ฑ ๋งŒ๋“ค๊ธฐ ํ”„๋กœ์ ํŠธ (2)

๊ฐ€์šค์ด 2024. 4. 19. 09:54

Intro


2์ผ์ฐจ์—” ์ „๊ตญ ์บ ํ•‘์žฅ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๊ณต๋ฐ์ดํ„ฐ API๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

ํ•ด์•ผ ํ•  ์ผ

โœ… ๊ณต๊ณต๋ฐ์ดํ„ฐ API ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

โœ… Home ํ™”๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ

โžก๏ธ Article ํ™”๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ 

 

 

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ƒํ™ฉ


์˜คํ”ˆ API ํ™œ์šฉํ•˜๊ธฐ

https://www.data.go.kr/data/15101933/openapi.do#/layer-api-guide

 

ํ•œ๊ตญ๊ด€๊ด‘๊ณต์‚ฌ_๊ณ ์บ ํ•‘ ์ •๋ณด ์กฐํšŒ์„œ๋น„์Šค_GW

ํ•œ๊ตญ๊ด€๊ด‘๊ณต์‚ฌ ๊ณ ์บ ํ•‘ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ์บ ํ•‘์žฅ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ตญ๊ด€๊ด‘๊ณต์‚ฌ ๊ณ ์บ ํ•‘ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•˜๋Š” ์บ ํ•‘์žฅ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

www.data.go.kr

 

์œ„ ์‚ฌ์ดํŠธ์—์„œ ํšŒ์›๊ฐ€์ž… ํ›„ ํ™œ์šฉ ์‹ ์ฒญ์„ ํ•ด์•ผ API๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋กœ๊ทธ์ธ ํ›„ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์•ผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

IOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ ํ•˜๋Š”๋ฐ ์•ˆ๋ผ์„œ ์›์ธ์„ ์ฐพ์•„๋ดค๋Š”๋ฐ IOS๋Š” HTTPS ํ”„๋กœํ† ์ฝœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๋งŒ ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— HTTP๋กœ ํ˜ธ์ถœ๋˜๋Š” ์˜คํ”ˆ API๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ ios > info.plist ํŒŒ์ผ์— NSAppTransportSecurity๋ฅผ true๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด HTTP๋กœ ํ˜ธ์ถœ๋˜๋Š” API๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

 

 

  • Open API ์กฐํšŒ ์ฝ”๋“œ
import { SERVICE_KEY } from '../../security/openAPIKey';

const BASE_URL = `https://apis.data.go.kr/B551011/GoCamping`;

export const getCampingList = async ({ pageNo = 1 }: { pageNo: number }) => {
  const params = {
    MobileOS: 'IOS',
    MobileApp: 'campingapp',
    serviceKey: SERVICE_KEY,
    _type: 'json',
    pageNo: `${pageNo}`,
  };

  const queryString = new URLSearchParams(params).toString();
  const url = `${BASE_URL}/basedList?${queryString}`;

  try {
    const response = await fetch(url, {
      headers: {
        'Content-Type': 'application/json',
      },
    });

    const result = await response.json();
    return result;
  } catch (e) {
    console.error(e);
  }
};

 

๊ฐœ์ธ ํ‚ค๋Š” security ํด๋” ์•ˆ์— ๋„ฃ์–ด๋‘๊ณ  gitignore์— ํด๋”๋ช…์„ ์ž…๋ ฅํ•ด์„œ git์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

 

์บ ํ•‘ ๋ฐ์ดํ„ฐ๋Š” 1ํŽ˜์ด์ง€๋‹น ๊ธฐ๋ณธ 10๊ฐœ์˜ ์บ ํ•‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋กค ๊ฐ€์žฅ ์•„๋ž˜๋กœ ๋‚ด๋ ค์™”์„ ๋•Œ ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

FlatList์˜ ์†์„ฑ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

์˜ˆ์‹œ ์ฝ”๋“œ)

...
const HomePage = () => {
  const [campingList, setCampingList] = useState([]);
  const [pageNo, setPageNo] = useState(1);
  const [loading, setLoading] = useState(false);

  const fetchCampingList = async () => {
    try {
      const result = await getCampingList({ pageNo });
      return result.response.body.items.item;
    } catch (e) {
      console.log(e);
    }
  };

	...

  const onEndReached = async () => {
    if (!loading) {
      setPageNo(pageNo + 1);
      setLoading(true);
      const result = await fetchCampingList();
      setCampingList([...campingList, ...result]);
      setLoading(false);
    }
  };

  return (
    <SafeAreaView style={styles.wrapper}>
			...
      <View style={styles.mainContainer}>
        <FlatList
          data={campingList}
          keyExtractor={item => item.contentId}
          renderItem={({ item }) => <CampingInfo {...item} />}
          removeClippedSubviews
          showsVerticalScrollIndicator={false}
          style={styles.campingListContainer}
          onEndReached={onEndReached}
          onEndReachedThreshold={0.2}
          ListFooterComponent={
            loading && (
              <View style={styles.loadingIcon}>
                <Icon name="ellipsis-h" size={30} />
              </View>
            )
          }
        />
      </View>
    </SafeAreaView>
  );
};

...

 

 

 

 

 

 

 

์ถ”ํ›„ ๊ฐœ๋ฐœ ์‚ฌํ•ญ


 

๋‹ค์Œ ์ž‘์—…ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค

  • Article UI ๊ตฌํ˜„
  • Home UI ๊ตฌํ˜„
  • ๋ฌดํ•œ์Šคํฌ๋กค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ