일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스택
- unityui
- Unity2D
- Firebase
- BFS
- 프로그래머스
- 포톤
- c#
- 문자열
- 알고리즘
- UnrealEngine
- 유클리드호제법
- Unity3d
- 유니티
- Photon
- 순열
- 언리얼엔진
- 스파르타내일배움캠프
- QueryDSL
- 스파르타내일배움캠프TIL
- 내일배움캠프
- 해시
- C++
- FSM
- 구현
- 이분탐색
- Unity
- UE4
- Inventory
- 워크플로
- Today
- Total
개발 낙서장
[TIL] 내일배움캠프 62일차 - Open API 본문
오늘의 학습 키워드📚
Open API
Open API는 누구나 사용할 수 있도록 공개된 API를 말한다.
가령 소셜 로그인 API가 있는데, 원래대로라면 모든 프로젝트마다 유저 DB가 있고 전부 회원가입, 로그인, 회원탈퇴 등 전부 구현해줘야 해서 귀찮고 DB도 잘 관리해줘야 하고 그런데 소셜 로그인을 활용하면 보다 쉽게 회원가입, 로그인이 가능하고 관리도 편해진다.
Open API는 특정 Key를 발급 받아 해당 API에 요청을 보낼 때 Key 값을 넣어 인증을 받아야 원하는 값을 얻을 수 있다.
나는 영화 진흥 위원회에서 제공하는 영화 목록 오픈 API를 활용해 연습했다.
https://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do
위 사이트에 접속해 먼저 회원가입을 하고 키를 발급받아야 한다.
실제 서비스를 운영할 것이 아니므로 대충 적으면 되고 URL은 굳이 적지 않아도 된다.
발급 키를 복사해 요청에 활용하면 된다.
영화 목록을 가져오는 API 문서를 살펴보면
나는 RestAPI에서 활용할 것이므로 REST 방식 URL을 참고하면 된다.
해당 요청들은 전부 RequestParam 형식으로 요청한다.
필수 부분인 key를 제외하고는 선택 부분이라 적지 않아도 기본 값들이 조회가 된다.
응답 구조는 위와 같은데 XML 혹은 JSON으로 넘어온 데이터를 파싱해 사용하면 된다.
{
movieListResult: {
totCnt: 100838,
source: "영화진흥위원회",
movieList: [
{
movieCd: "20249153",
movieNm: "에스파: 월드 투어 인 시네마",
movieNmEn: "aespa: WORLD TOUR in cinemas",
prdtYear: "2024",
openDt: "",
typeNm: "장편",
prdtStatNm: "개봉예정",
nationAlt: "한국",
genreAlt: "공연",
repNationNm: "한국",
repGenreNm: "공연",
directors: [ ],
companys: [ ]
}
]
}
}
나머지는 기본값, itemPerPage(행의 개수)를 1로 설정해서 요청을 보냈더니 위와 같은 결과가 나왔다.
이처럼 오픈 API의 Key 값을 통해 해당 URI를 커스텀해 요청을 보내 얻은 값을 DB에 저장하거나 가공해 사용하는 등 여러 작업을 편하게 할 수 있다.
예를 들어 영화 예매 서비스를 구현한다 했을 때 영화 목록을 해당 오픈 API를 활용하여 DB에 저장하려면?
public ResponseEntity<String> getMovieList() throws JsonProcessingException {
String apiUrl = "http://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json";
String apiKey = "???";
URI uri = UriComponentsBuilder.fromHttpUrl(apiUrl)
.queryParam("key", apiKey)
.queryParam("itemPerPage", 100)
.build()
.toUri();
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);
JsonNode root = objectMapper.readTree(response.getBody());
JsonNode movieListResult = root.path("movieListResult").path("movieList");
List<Movie> movies = new ArrayList<>();
for (JsonNode movieNode : movieListResult) {
Movie movie = new Movie();
movie.setMovieCd(movieNode.path("movieCd").asLong());
movie.setMovieNm(movieNode.path("movieNm").asText());
movie.setMovieNmEn(movieNode.path("movieNmEn").asText());
movie.setMovieOpenDt(movieNode.path("movieOpenDt").asText());
movies.add(movie);
}
movieRepository.saveAll(movies);
return response;
}
요청을 보낼 Url과 Key, 다른 여러 param을 통해 URI를 생성하고 RestTemplate를 통해 해당 URI에서 값을 가져온다.
그리고 ObjectMapper를 통해 String 값을 Json으로 파싱하는 작업을 거친 후 엔티티를 생성해 저장한다.
이렇게 Movie 테이블에 잘 저장이 된다.
물론 매번 조회하고 저장하는 건 매우 비효율적이므로 특정 시점(매일 자정)마다 업데이트된 데이터만 저장하는 스케줄링 방식을 사용하면 좋을 것 같다.
오늘의 회고💬
오늘부터 본격적인 파이널 프로젝트가 시작됐다. 잘 맞는 조원들을 만난 것 같아 다행이다.
내일의 계획📜
내일부터 기본적인 프로젝트 설계를 마무리하고 구현을 시작할 것 같다.
'Java > Sparta' 카테고리의 다른 글
[TIL] 내일배움캠프 64일차 - STOMP로 실시간 채팅 구현 (0) | 2024.03.28 |
---|---|
[TIL] 내일배움캠프 63일차 - 논리적 참조키 (0) | 2024.03.27 |
[TIL] 내일배움캠프 61일차 - 참조키 인덱싱 (0) | 2024.03.25 |
[TIL] 내일배움캠프 60일차 - 통합 테스트 (0) | 2024.03.22 |
[TIL] 내일배움캠프 59일차 - 낙관적 락 동시성 테스트 (0) | 2024.03.21 |