brunch

You can make anything
by writing

C.S.Lewis

by 에디의 기술블로그 Feb 06. 2019

포털 검색 OpenAPI 연동 샘플

Reactive WebClient 사용, 포털 OpenAPI 연동 샘플

이번 설 연휴도 금방 지나가버렸다. 연휴 푹 쉬었으니, 이제 다시 공부 모드로 돌입해보겠다. 이번 글에서는 스프링 부트 환경에서 [네이버, 카카오, 유튜브]의 검색 오픈 API를 연동해보겠다. 테스트 코드는 작성하지 않았고, 연동 자체는 매우 쉽기 때문에 글을 모두 읽을 필요는 없다. 샘플 코드만 확인해도 이해가 쉽게 될 것이다.


오픈 API 란?


자세한 설명은 생략한다.



오픈 API 사용 권한 얻기


오픈 API를 사용하기 위해서는 개발자 도구에서 권한을 얻어야 한다. 


카카오 


카카오 개발자도구에서 애플리케이션을 등록해야 한다. 아주 간단하다. 

https://developers.kakao.com

등록을 하게 되면 아래 캡처와 같이 앱 키를 확인할 수 있다. 


네이버 


네이버 역시 개발자도구에서 애플리케이션을 등록하면 된다. 아주 쉽다. 

https://developers.naver.com/apps/

등록을 하게 되면, 아래 캡처와 같이 Client ID와 Client Secret를 얻을 수 있다. 

카카오는 앱키 하나만 알면 되지만, 네이버는 Client ID 와 Client Secret 두 개를 알아야 한다. 


유투브 


유투브 역시 애플리케이션을 등록하는데 콘솔 페이지를 제공한다. 

https://console.developers.google.com

여기서 YouTube Data API V3를 등록해야 한다.

사용자 인증 정보에서 API 키를 확인할 수 있다. 


오픈 API 사용 제한 


대부분의 오픈 API는 호출 제한이 있다. 잘 확인해보고 호출 제한에 맞게 호출하도록 하자. 필자는 호출 제한 이상으로 호출해본 적이 없어서, 어떤 일이 발생하는지는 모르겠다. 또한, 오픈 API를 사용해서 상용 서비스를 하는 것에 대해서도 잘 모르겠다. 실제로 서비스에 연동할 계획이라면 각 포털사 (카카오, 네이버, 유투브)에 직접 문의를 하기를 바란다. 


오픈 API 명세 확인


오픈 API를 사용하기 위한, 기본적인 호출 명세를 확인해본다. 참고로 필자는 이번 테스트에서 아래와 같이 검색 API를 호출하겠다. 


카카오 : 책 검색, 번역

네이버 : 블로그 검색

유투브 : 동영상 검색


카카오 - 책 검색


필자가 연동할 카카오 책 검색 API는 아래 링크에서 확인하면 된다.

https://developers.kakao.com/docs/restapi/search#책-검색

Request 는 아래와 같다. 

응답 바디는 JSON 객체로 meta 와 documents 로 구성된다. 


카카오 - 번역


생략한다. 아래 링크를 참고하자.

https://developers.kakao.com/docs/restapi/translation


네이버


네이버는 블로그 검색을 연동하겠다. 아주 쉽다. 

https://developers.naver.com/docs/search/blog/

Request 명세를 확인한다. 

응답은 아래와 같다. 참고로 필자는 JSON 포맷으로 호출할 것이다. 



유투브


유투브는 라이브러리에서 응답객체를 제공해준다. 유투브는 소스를 보면서 다시 설명하겠다. 



오픈 API 연동 샘플


아주 간단하게, 빠르게 연동을 해보겠다. 


디펜던시


스프링 부트 2.0.8.RELEASE 환경에서 아래와 같이 디펜던시를 추가한다. 카카오, 네이버 는 별도의 라이브러리를 추가할 필요가 없다. 하지만 유투브는 아래와 같이 라이브러리를 추가해야 한다. 


Response 객체 정의


API 를 호출해서 받는 데이터를 매핑할 Response 클래스를 정의한다. 참고로, 위에도 설명했지만 유투브의 경우에는 라이브러리에서 Response 클래스를 제공한다. 


카카오 책 검색


카카오 번역


네이버 블로그 검색


유투브 동영상 검색

유투브는 아래와 같이 라이브러리에서 응답 클래스를 제공해준다. 



유스케이스 정의(서비스 레이어)


서비스 레이어를 정의한다. 필자는, Webflux 환경에서, Mono 로 전달할 예정이다. 

데이터를 중간 과정에서 변환하지 않고 그대로 전달할 예정이다. 만약, 데이터를 2개 이상의 데이터로 전달한다면 Flux 로 정의하면 된다. 카카오, 네이버, 유투브 데이터 모두 1개의 응답 클래스로 매핑할 수 있기 때문에 Mono 를 사용하겠다. 



Property 정의


프로퍼티를 정의한다. 



API 호출 컴포넌트 정의


이제 가장 중요한 API 호출 함수를 작성한다. 기본적으로 모든 API 호출은 WebClient 를 사용하였다. WebClient 가 생소하다면, RestTemplate 를 사용해도 된다. 


카카오 책 검색

WebClient 의 마지막 체인 메서드를 보면, .bodyToMono(ResponseKakaoBook.class); 를 호출한다. 최종 리턴을 Mono 로 전달하면서 ResponseKakaoBook 클래스에 데이터를 매핑한다. 리턴 타입은 Mono<ResponseKakaoBook> 이다. 



카카오 번역

자세한 설명은 생략한다.


네이버 블로그 검색

자세한 설명은 생략한다. 카카오 API 와 다른점은, 네이버는 Client-Id 와 Client-Secret 두개의 헤더 값을 전달해야 한다. 

카카오와 마찬가지로 리턴은 Mono 으로 구현한다. 


유투브 동영상 검색

유투브는 Webclient를 사용하지 않았다. 아래와 같이 유투브 라이브러리에서 제공하는 메서드를 사용한다.

setApplicationName("애플리케이션이름") 에서는, 각자 등록한 애플리케이션 이름을 입력하면 된다. 연동 자체는 어렵지는 않지만, 필자가 Mono.create 구문을 사용하였다. sink.success(searchResponse) 를 호출하여 결과를 리턴해주면 된다. 만약, Reactor 와 Mono 에 익숙하지 않다면 다른 방법으로 구현해도 된다. 


컨트롤러 구현


유스케이스를 호출하는 컨트롤러를 작성하자. 실무에서 테스트 코드를 이렇게 작성하면 안된다. 지금 이 글은 아주 빠르게 설명을 위해 작성하는 글이므로, 대충 이해해주길 바란다. 어쩃든, 아래와 같이 Mono 로 리턴한다. 


참고로, Mono 또는 Flux 는 subscribe 가 발생하기 전까지는 어떤 데이터 전달도 발생하지 않는다. Webflux 는 Mono 또는 Flux 로 리턴하면, 내부 로직에서 subscribe 를 실행함으로서 데이터 전달을 한다. 


샘플 코드는 아래 github 에서 확인하길 바란다. 

https://github.com/sieunkr/openapi-sample



마무리


간단하게, 오픈API를 연동하였다. 별 내용이 없는 글이라서, 이만 빠르게 글을 마치겠다. 글을 쓰는데 한시간 밖에 걸리지 않았다. 글 쓰는 속도가 점점 빨라지고 있지만, 글의 퀄러티는 점점 떨어지는 것 같다. 시간적으로 더 여유가 생겼으면 좋겠다. 시간 여유가 많으면 더 좋은 글을 쓸수 있을텐데... 아쉽지만 이만 글을 마치곘다. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari