- [중급 프로젝트] 2. API 확인2024년 09월 19일
- chantleman
- 작성자
- 2024.09.19.:46
api는 호출 제한 횟수가 있기때문에
처음 데이터를 가져올 때는 api에 요청해서 가져오고 DB에 저장하면
다음에 데이터 불러올 때는 API가 아닌 DB에서 가져옴
영화 목록 가져올 때 먼저 db에 데이터가 있는지 확인하고,
없을 때 api 호출해서 데이터 가져오고 그 가져온 데이터를 DB에 저장
이렇게하면 최초로 검색하는 영화가 아닌 이상 DB에만 접근하게 되므로 API호출 횟수를 줄일 수 있음아니면
크론탭(crontab)으로 시간 주기를 정해서 자동으로 데이터를 꺼내오는 방법이 있음
KMDB API 사용해서 영화 정보 얻기
https://www.kmdb.or.kr/info/api/apiList
API KEY 받아서
검색창에 아래 코드에 '인증키' 부분에 키 넣어서 검색하면
http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&ServiceKey=인증키&detail=N&query="해리포터와비밀의방"
이렇게 영화 정보가 나옵니다.
http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&ServiceKey=인증키&detail=Y&query="해리포터와비밀의방"
만약 detail=Y로 바꾼다면
이런 상세정보까지 나옵니다.
사이트에 샘플 코드 받아서 실행시키면
결과가 잘 출력되는 것을 확인할 수 있습니다.
import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.io.BufferedReader; import java.io.IOException; public class ApiExplorer { public static void main(String[] args) throws Exception { ApiExplorer ae = new ApiExplorer(); ae.process(); } public void process() throws Exception { StringBuilder urlBuilder = new StringBuilder("http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2"); /*URL*/ urlBuilder.append("&" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + URLEncoder.encode("서비스키","utf-8")); /*Service Key*/ urlBuilder.append("&" + URLEncoder.encode("nation","UTF-8") + "=" + URLEncoder.encode("대한민국", "UTF-8")); /*상영년도*/ urlBuilder.append("&" + URLEncoder.encode("val001","UTF-8") + "=" + URLEncoder.encode("2018", "UTF-8")); /*상영년도*/ urlBuilder.append("&" + URLEncoder.encode("val002","UTF-8") + "=" + URLEncoder.encode("01", "UTF-8")); /*상영 월*/ URL url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-type", "application/json"); System.out.println("Response code: " + conn.getResponseCode()); BufferedReader rd; if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) { rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); } else { rd = new BufferedReader(new InputStreamReader(conn.getErrorStream())); } StringBuilder sb = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { sb.append(line); } rd.close(); conn.disconnect(); System.out.println(sb.toString()); } }
주의해야할 점은 urlBuilder에 이미 '?' 가 한 번 들어가서 (rest는 get으로 요청하는데, get은 ?로 표시)
서비스키 연결할 때는 '?'가 아닌 '&'로 연결해줘야합니다.
Java 객체의 직렬화
: 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술
- Java에서 입출력은 스트림이라는 데이터 통로를 통해 이동한다. 다만 객체는 바이트형이 아니라, 스트림을 통해 파일에 저장하거나 네트워크에 전송할 수 없다.
- 따라서 객체를 스트림을 통해 입출력하려면, 바이트 배열로 변환하는 것이 필요하다. 이를 직렬화라고 한다.
- 시스템 적으로는 JVM(Java Virtual Machine)의 메모리에 상주(heap 또는 stack) 되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 말함.
- 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 한다.
json에서 직렬화는 코드 내의 객체나 해시 테이블, 딕셔너리 등을 json으로 변환하는 것을 의미하고,
역직렬화는 반대로 바이트 형태의 데이터(json)을 객체나 해시 테이블, 딕셔너리 등으로 변환하는 것을 의미합니다.
json형태의 데이터를 읽기 위해서는 gson() 라이브러리의 fromJson메소드를 사용하여 역직렬화합니다.
그러고난 후 배열(Array)형태로 만들어준 뒤에 원하는 데이터를 추출하여 DB에 저장합니다.
Gson gson = new Gson(); JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class); JsonArray dataArray = jsonObject.getAsJsonArray("Data");
getAsJsonArray()는 json 객체에서 특정 키에 해당하는 값을 배열로 가져오는 메소드입니다.
위 코드대로라면 Data:[] 에서 key값에 해당하는 array 객체를 뽑아올 수 있습니다.
예고편 url을 따와서 출력해보면
url에 검색했을 때는 이렇게 잘 나오지만
<video id="videoPlayer" preload="metadata" autoplay muted loop controls width="100%"> <source src=<%=url %>> </video>
자바에 video 태그로 넣었을때는 영상 재생이 안되는 대참사 발생
https라서 그런가..? 싶어서 http로 바꿔서 해도 안나온당 ㅜㅜ
문제는
저기 하단에 저 두가지 모드의 기능이 포함된 영상이라서 그런 것
그래서 저 기능 빼고 영상만 나오게 하기 위해 url을 바꿔줬당
"https://www.kmdb.or.kr/trailer/trailerPlayPop?pFileNm=MK061189_P02.mp4"
↓
"https://www.kmdb.or.kr/trailer/play/ MK061189_P02.mp4"
List<MovieVo> boxInfo = (List<MovieVo>) request.getAttribute("boxInfo"); Random random = new Random(); if (boxInfo != null && !boxInfo.isEmpty()) { // 필터링: movieTrailer가 null이 아닌 것만 포함한 리스트 생성 List<MovieVo> validMovies = new ArrayList<>(); for (MovieVo movie : boxInfo) { if (movie.getMovieTrailer() != null) { validMovies.add(movie); } } if (!validMovies.isEmpty()) { int randomIndex = random.nextInt(validMovies.size()); String movieTrailer = validMovies.get(randomIndex).getMovieTrailer(); String urlhead= movieTrailer.split("trailerPlayPop")[0]+"play/"; String urlbody=movieTrailer.split("pFileNm=")[1]; String url = urlhead+urlbody; System.out.println("Movie Trailer URL: " + url); } }
이렇게 바꿔서 하면
된당!!
참고자료
728x90다음글이전글이전 글이 없습니다.댓글