FN 프로젝트에서 제공하는 기능중에 하나가 공연 정보를 조회하고 검색하는 기능이기 때문에
KOPIS에서 제공하는 공연 정보 Open API를 가져와서 사용해보도록 하겠다
공연예술통합전산망
예술경영지원센터 운영, 공연 예매 정보 집계 및 DB, 예매상황판, 공연통계 등 제공.
www.kopis.or.kr:443
해당 사이트에서 인증키 발급신청을 한다.
Open API 개발 가이드도 제공해주니 확인하면서 진행하면 좋다
ttp://www.kopis.or.kr/openApi/restful/pblprfr?service={서비스키}&stdate=20160101&eddate
=20160630&rows=10&cpage=1
나는 공연 목록을 조회할 것임으로 위와 같은 경로로 진입해보면 공연 목록이 나타남을 확인할 수 있다.
전체적인 흐름
- KOPIS API 요청 (XML 응답을 받음)
- XML → JSON 파싱
- 출력하려는 장르 필터링
- FlatList로 카드 형태로 출력
export const SERVICE_KEY = 'KOPIS SERVICE KEY';
export const kopisURL = 'https://www.kopis.or.kr/openApi/restful';
export const kopisImgURL = 'https://www.kopis.or.kr';
인증키, URL 등 민감한 정보를 담는 파일을 생성하여 정의하고 공연 정보를 출력하는 페이지에서 불러와서 사용할 것이다.
ConcertScreen.tsx
import { SERVICE_KEY, kopisURL } from '../../OAuto2';
const ConcertScreen = ({ navigation }: Props) => {
const [concerts, setConcerts] = useState<any[]>([]);
const fetchConcerts = async () => {
try {
const url = `${kopisURL}/pblprfr?service=${SERVICE_KEY}&stdate=20231201&eddate=20250405&rows=50&cpage=1`;
const response = await fetch(url);
const text = await response.text();
const parser = new XMLParser();
const json = parser.parse(text);
const list = json.dbs?.db;
const concertList = Array.isArray(list) ? list : [list];
const filtered = concertList.filter((item: any) =>
item.genrenm && item.genrenm.includes('대중음악')
);
setConcerts(filtered);
} catch (error) {
console.error('콘서트 데이터를 불러오는 중 오류:', error);
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchConcerts();
}, []);
}
- OAuto2에 정의한 KOPIS 인증키와 URL주소를 사용하므로 import
- url : 20231201부터 20250405까지 50개의 데이터를 현재 페이지로 가져옴
- fetch로 API를 호출하고 text 형태로 읽음
- fast-xml-parser 라이브러리를 사용해 XML을 JavaScript 객체(JSON)로 변환
- json.dbs?.db 형태로 실제 데이터 배열에 접근
- filtered : genrenm(장르명)에 '대중음악'이 포함된 데이터만 출력
<TouchableOpacity
onPress={() => navigation.navigate('ConcertDetail', { id: item.mt20id })}
>
<View style={styles.card}>
{item.poster ? (
<Image
source={{ uri: item.poster }}
style={styles.poster}
resizeMode="cover"
/>
) : (
<View style={[styles.poster, { backgroundColor: '#ccc', justifyContent: 'center', alignItems: 'center' }]}>
<Text>이미지 없음</Text>
</View>
)}
<View style={styles.info}>
<Text style={styles.title}>{item.prfnm}</Text>
<Text style={styles.period}>{item.prfpdfrom} ~ {item.prfpdto}</Text>
<Text style={styles.place}>{item.area} {item.fcltynm}</Text>
</View>
</View>
</TouchableOpacity>
- 공연 정보 카드 하나하나는 터치가 가능하고 눌렀을 때 공연 상세 정보를 확인할 수 있도록 TouchableOpacity로 감싸준다
- Open API에서 제공해주는 해당 공연 포스터(poster)와 공연 제목(prfnm), 공연 시작 ~ 종료 일정(prfpdfrom, to), 지역과 장소(area, fcltynm)을 출력하도록 하였다.
구현 화면
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'ReactNative :' 카테고리의 다른 글
[FN] 공연 정보 조회 페이지 UI 수정 (1) | 2025.04.05 |
---|---|
[FN] 게시판 개발 일지[4] / image-picker를 사용한 AWS S3 이미지 업로드 (3) | 2025.02.05 |
[JH] 학생을 위한 개발 가이드 (9) | 2025.01.25 |
[FN] 게시판 개발 일지[3] / image-picker (7) | 2025.01.24 |
[FN] React Native cli 개발 환경 구축 / 윈도우, 안드로이드 스튜디오 (8) | 2025.01.17 |