[ํด๋ผ์ฐ๋ฉ ์ดํ๋ฆฌ์ผ์ด์ ์์ง๋์ด๋ง TIL] 240418 - React Native ์บ ํ์ฑ ๋ง๋ค๊ธฐ ํ๋ก์ ํธ (2)
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 ๊ตฌํ
- ๋ฌดํ์คํฌ๋กค์์ ๋ฐ์ํ๋ ์ค๋ฅ ํด๊ฒฐ