현재 팀프로젝트 주제가 도서관인데 책등록을 하려고 보니 isbn을 조회 하면 그 책의 정보를 가져 올 수 있는 api를 발견하여 적용해 보았다.
isbn을 조회 할 수 있는 api를 두가지 찾아서 하나만 사용 하고 싶었지만 한 isbn을 조회 했을때 각 각의 api에서 제공해주는 정보에 차이가 있어서 결국 두가지 api를 한번에 호출하는 방법을 택했다
[1] 외부 API
사용 방법은 각 홈페이지 자세히 나옴
(1) 국립중앙도서관
https://www.nl.go.kr/NL/contents/N31101010000.do
<?xml version="1.0" encoding="UTF-8"?>
<o><PAGE_NO type="string">1</PAGE_NO><TOTAL_COUNT type="string">1</TOTAL_COUNT><docs class="array"><e class="object"><AUTHOR type="string">지은이: 히가시노 게이고 ;옮긴이: 양윤옥</AUTHOR><BIB_YN type="string">Y</BIB_YN><BOOK_INTRODUCTION_URL type="string"/>
<BOOK_SIZE type="string"/><BOOK_SUMMARY_URL type="string"/><BOOK_TB_CNT_URL type="string"/><CIP_YN type="string">N</CIP_YN><CONTROL_NO type="string"/><DDC type="string"/><DEPOSIT_YN type="string">Y</DEPOSIT_YN><EA_ADD_CODE type="string">03830</EA_ADD_CODE>
<EA_ISBN type="string">9788972756194</EA_ISBN><EBOOK_YN type="string">N</EBOOK_YN><EDITION_STMT type="string"/><FORM type="string"/><FORM_DETAIL type="string"/><INPUT_DATE type="string">20130103</INPUT_DATE><KDC type="string"/><PAGE type="string"/><PRE_PRICE type="string"/>
<PUBLISHER type="string">현대문학</PUBLISHER><PUBLISHER_URL type="string">http://www.hdmh.co.kr</PUBLISHER_URL><PUBLISH_PREDATE type="string"/><REAL_PRICE type="string"/><REAL_PUBLISH_DATE type="string"/><RELATED_ISBN type="string"/><SERIES_NO type="string"/><SERIES_TITLE type="string"/>
<SET_ADD_CODE type="string"/><SET_EXPRESSION type="string"/><SET_ISBN type="string"/><SUBJECT type="string">8</SUBJECT><TITLE type="string">나미야 잡화점의 기적</TITLE><TITLE_URL type="string"/><UPDATE_DATE type="string">20170707</UPDATE_DATE><VOL type="string"/></e></docs></o>
(2) 도서관 정보나루
https://www.data4library.kr/apiUtilization
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<response>
<request>
<isbn13>9788972756194</isbn13>
</request>
<detail>
<book>
<no>1</no>
<bookname>
<![CDATA[ 나미야 잡화점의 기적 :히가시노 게이고 장편소설 ]]>
</bookname>
<publication_date>
<![CDATA[ 2012 ]]>
</publication_date>
<authors>
<![CDATA[ 지은이: 히가시노 게이고 ;옮긴이: 양윤옥 ]]>
</authors>
<publisher>
<![CDATA[ 현대문학 ]]>
</publisher>
<class_no>
<![CDATA[ 833.6 ]]>
</class_no>
<publication_year>
<![CDATA[ 2012 ]]>
</publication_year>
<bookImageURL>
<![CDATA[ http://image.aladin.co.kr/product/15848/6/cover/k622533431_1.jpg ]]>
</bookImageURL>
<isbn>
<![CDATA[ 8972756199 ]]>
</isbn>
<isbn13>
<![CDATA[ 9788972756194 ]]>
</isbn13>
<description>
<![CDATA[ 2012년 12월 19일 국내 번역 출간된 이래 6년 연속 베스트셀러 순위 상위권을 차지하며 서점가에서 "21세기 가장 경이로운 베스트셀러"라고 불리는 소설. '2008~2017년, 지난 10년간 한국에서 가장 많이 팔린 소설', 히가시노 게이고의 대표작 <나미야 잡화점의 기적>이 국내 누적 판매 100만 부를 돌파했다. ]]>
</description>
</book>
</detail>
</response>
[2] DTO
api를 호출해서 데이터를 담아 줄 dto
package team1.project.vo;
public class Book {
private String bookLibraryCode;
private String bookName;
private String category;
private String writer;
private String publisher;
private String bookPublishDate;
private String bookPrice;
private String bookIsbn;
private String bookRegDate;
private String bookImageURL;
private String bookDescription;
private String seriesNo;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getBookPublishDate() {
return bookPublishDate;
}
public void setBookPublishDate(String bookPublishDate) {
this.bookPublishDate = bookPublishDate;
}
public String getBookPrice() {
return bookPrice;
}
public void setBookPrice(String bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookIsbn() {
return bookIsbn;
}
public void setBookIsbn(String bookIsbn) {
this.bookIsbn = bookIsbn;
}
public String getBookSituation() {
return bookSituation;
}
public void setBookSituation(String bookSituation) {
this.bookSituation = bookSituation;
}
public String getBookImageURL() {
return bookImageURL;
}
public void setBookImageURL(String bookImageURL) {
this.bookImageURL = bookImageURL;
}
public String getBookDescription() {
return bookDescription;
}
public void setBookDescription(String bookDescription) {
this.bookDescription = bookDescription;
}
public String getSeriesNo() {
return seriesNo;
}
public void setSeriesNo(String seriesNo) {
this.seriesNo = seriesNo;
}
}
[3] Service
두 개의 api 정보를 한 DTO에 setting하기 위해 service에서 api 두개를 차례대로 호출하여 원하는 정보 챡챡 담아주기
public Book searchIsbn(String isbn) {
//컨트롤러에서 isbn을 받아온다 - 받아온 isbn 호출
logger.info("BookService - isbn : {}",isbn);
//중앙 도서관api 이용 url
String seojiUrl = "http://seoji.nl.go.kr/landingPage/SearchApi.do?"
+ "cert_key=발급키&"
+ "result_style=xml&page_no=1&page_size=10&isbn="+isbn;
//도서관 정보나루 api 이용 url
String naruUrl = "http://data4library.kr/api/srchDtlList?"
+ "authKey=발급키&isbn13="
+ isbn;
//Dto 인스턴스화
Book book = new Book();
try {
//도서관 정보나루 api 호출
Document naru = Jsoup.connect(naruUrl).data("isbn",isbn).get();
String bookName = seoji.select("TITLE").text();
String bookPrice = seoji.select("PRE_PRICE").text();
String seriesNo = seoji.select("SERIES_NO").text();
String category = seoji.select("KDC").text();
//국립도서관 api 호출
Document seoji = Jsoup.connect(seojiUrl).data("isbn",isbn).get();
String writer = naru.select("authors").text();
String publisher = naru.select("publisher").text();
String bookDescription = naru.select("description").text();
String bookImageURL = naru.select("bookImageURL").text();
String bookPublishDate = naru.select("publication_date").text();
//DTO setting
book.setBookName(bookName);
book.setWriter(writer);
book.setBookDescription(bookDescription);
book.setBookImageURL(bookImageURL);
book.setPublisher(publisher);
book.setBookPrice(bookPrice);
book.setCategory(category);
book.setBookPublishDate(bookPublishDate);
book.setSeriesNo(seriesNo);
} catch (IOException e) {
e.printStackTrace();
}
//데이터 담은 객체 리턴
return book;
}
[4] Controller
service에서 조회 후 DTO에 담았기 때문에 Controller는 정말 호출만 하는 상태
@GetMapping("/searchIsbn")
@ResponseBody
public Book searchIsbn(@RequestParam("isbn") String isbn) {
Book isbnSearch = bookService.searchIsbn(isbn);
return isbnSearch;
}
[5] view
ISBN 칸에 isbn 13자리를 입력 후 도서 정보 가져오기 버튼을 클릭하면 스크립트로 ajax 호출
$('#isbnBtn').on('click',function(){
var isbn = $('[name=bookIsbn]').val();
if(isbn != null || isbn != undefined || !"".equals(isbn)){
alert(isbn);
var errormsg ="해당 isbn으로 도서 정보를 불러올수 없습니다."
var fn = function( data ) {
console.log(JSON.stringify(data) + " <- ajax");
$('[name=bookName]').val(data.bookName);
$('[name=category]').val(data.category);
$('[name=writer]').val(data.writer);
$('[name=publisher]').val(data.publisher);
$('[name=bookPrice]').val(data.bookPrice);
$('[name=bookPublishDate]').val(data.bookPublishDate);
$('[name=bookDescription]').val(data.bookDescription);
$('[name=bookImageURL]').attr('src',data.bookImageURL);
$('#seriesNo').val(data.seriesNo);
}
commonAjax("/searchIsbn",
{ isbn : isbn },
fn,
'get',
errormsg);
}else{
alert("isbn을 입력하세요");
}
});
controller에서 받아 온 정보를 화면에 뿌려줌
[6] 아쉬운점 && 보완 해야 할 점
사실 ajax 호출을 json으로 해서 api 또한 json방식의 데이터를 제공해주기 때문에 json방식으로 받아와 뿌려주고 싶었다. 그러나 잘 되지 않아 xml 방식으로 호출 하여 데이터를 가공하고 그 후 화면에 보여주었다. 시간만 더 여유로웠다면 json방식으로 호출하는 방법을 찾아 적용하고 싶다.
'Backend > SpringBoot' 카테고리의 다른 글
Thymeleaf 문자열 조합 (0) | 2020.07.22 |
---|---|
에러 일기 (0) | 2020.07.21 |
SpringBoot 파일 업로드 & 다운로드 코드 분석 (0) | 2020.06.16 |
Spring Boot 리다이렉트하기 (0) | 2020.05.26 |
Get방식 parameter 넘기기 (0) | 2020.05.26 |
댓글