1. 네이버 Developers 가입 및 Client ID, Client Secret 발급
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
위 사이트에서 네이버 아이디로 로그인 후
애플리케이션 > 애플리케이션 등록 > 등록 진행(검색 API 선택)
이 순서로 진행하면 된다.
그다음 '내 어플리케이션'에서 내가 만든 이름을 클릭하면 Client ID와 Client Secret이 생성된 것을 확인할 수 있다.
2. TypeDef 작성
developers.naver.com/docs/serviceapi/search/book/book.md#%EC%B1%85
책 - Search API
책 NAVER Developers - 검색 API 책 검색 개발가이드 검색 > 책 네이버 책 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출할 때 HTTP Header에 애플리케이션 등록 시 발급받은 C
developers.naver.com
위 사이트는 책 검색 api의 Docs이며, 어떠한 값들을 얻을 수 있는지 확인 할 수 있다.
필자는 프론트로 부터 '검색어', '검색 결과 개수' 이렇게 2가지를 입력값으로 받고
책의 '제목', '검색 결과 링크', '이미지 링크', '저자', '출판사', 'isbn(책 고유번호)'를 출력값으로 설정하기 위해
아래와 같이 TypeDef를 정의했다.
type SearchBook {
title: String!
link: String
image: String
author: String!
publisher: String!
isbn: String!
}
// word: 검새어, display: 검색 결과 개수
type Mutation {
searchBook(word: String!, display: Int!): [SearchBook!]!
}
3. Resolver 작성
1) request를 위한 기본 세팅 정의
const { word, display } = args // 입력값
let bookList = [] // 검색 결과 들어갈 배열
// request Import
var request = require("request-promise-native")
// 검색어, 요청 결과 개수를 반영한 api_url
var api_url =
"https://openapi.naver.com/v1/search/book.json?query=" +
encodeURI(word) +
"&display=" +
display
// request에 사용될 최종 옵션, Client 번호는 환경변수 처리
var options = {
url: api_url,
headers: {
"X-Naver-Client-Id": process.env.NAVER_CLIENT_ID,
"X-Naver-Client-Secret": process.env.NAVER_CLIENT_SECRET,
},
}
- request의 비동기 처리를 위해 "requset-promise-native" 모듈 설치 후 선언
- 검색어, 검색 결과 개수 반영하여 api_url 작성 (추가 요청 변수는 &를 붙여서 추가하시면 됩니다)
- 1.에서 받은 Client ID&Secret을 입력 (저는 값을 숨기기 위해 환경변수로 처리했습니다)
2) request 선언 및 오류 검증
await request.get(options, function(error, response, body) {
// Naver api 검색 결과 에러 검증
if (!error && response.statusCode == 200) {
// 후처리 작업 들어갈 공간
} else {
console.log("error = " + response.statusCode)
throw Error(`검색기능에 오류가 있습니다.(code: ${response.statusCode})`)
}
})
- 1)에서 정의한 options를 넣어서 naver api로 request를 요청
- 검색 결과 후처리 작업을 모두 완료 후 값을 return 하기 위해서 await 비동기 처리 (request-promise-native 사용)
- error, statusCode를 통해 검색 결과 정상처리 검증
3) 검색 결과 후처리
2)의 후처리 작업 공간에 들어갈 코드
// JSON to JavaScript
const realBody = JSON.parse(body)
// 검색 결과값 후처리
bookList = realBody.items.map((book) => {
// 필요없는 값 제거
delete book.price
delete book.discount
delete book.pubdate
delete book.description
// 제목에서 <b>태그 제거
book.title = book.title.replace(/(<([^>]+)>)/gi, "") // 모든 태그 제거
// book.title = book.title.replace(/<(\/b|b)([^>]*)>/gi, "") // <b>태그만 제거
// isnb에서 <b>태그 제거 및 뒷자리만 출이기
book.isbn = book.isbn.replace(/(<([^>]+)>)/gi, "") // 모든 태그 제거
book.isbn = book.isbn.split(" ")[1]
return book
})
- JSON.parse() : body로 들어온 JSON 형식의 결괏값을 사용하기 용이하게 JS 객체로 변환
- delete : 검색 결과 중 필요 없는 Properties 제거
- 책 제목에 Html 태그(<b></b>)값이 같이 들어와서 replace 정규식으로 제거
- isbn 값이 '8948382818 <b>1234567891234</b>'이런 식으로 들어오는데, 뒤에 13자리 숫자만 필요하기 때문에 replace와 split로 후처리 진행
- 후처리 된 검색 결과가 bookList에 객체의 배열 형태로 저장
4) 최종 결과 리턴
if (bookList.length === 0) {
throw Error(`"${word}"에 대한 검색 결과가 없습니다.`)
} else {
return bookList
}
드디어~! 후처리까지 완료된 검색 결과를 리턴해줍니다~!
검색 결과가 없을 때 피드백해 주는 센스는 잊지 마시길 바랍니다😁😁😁😁👍
4. 결과물
'Back-end > NodeJS' 카테고리의 다른 글
| [JWT] Json Web Token을 이용한 로그인 메커니즘(요약) 정리 (3) | 2021.05.17 |
|---|