본문 바로가기
Backend/SpringBoot

Spring Boot - 외부 API xml 방식으로 호출 하기

by YERIEL_염주둥 2020. 7. 6.
728x90

현재 팀프로젝트 주제가 도서관인데 책등록을 하려고 보니 isbn을 조회 하면 그 책의 정보를 가져 올 수 있는 api를 발견하여 적용해 보았다.

isbn을 조회 할 수 있는 api를 두가지 찾아서 하나만 사용 하고 싶었지만 한 isbn을 조회 했을때 각 각의 api에서 제공해주는 정보에 차이가 있어서 결국 두가지 api를 한번에 호출하는 방법을 택했다

 

 


[1] 외부 API

사용 방법은 각 홈페이지 자세히 나옴

(1) 국립중앙도서관

https://www.nl.go.kr/NL/contents/N31101010000.do

 

국립중앙도서관

국립중앙도서관에 오신 것을 환영합니다

www.nl.go.kr

<?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

 

도서관 정보나루

 

www.data4library.kr

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년간 한국에서 가장 많이 팔린 소설', 히가시노 게이고의 대표작 &lt;나미야 잡화점의 기적&gt;이 국내 누적 판매 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

댓글