본문 바로가기
Backend/SpringBoot

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

by YERIEL_염주둥 2021. 5. 6.
728x90

도서관 정보 나루에서 제공해주는 API를 json 방식으로 호출하여 화면에 보여주기

 

https://www.data4library.kr/

 

도서관 정보나루

function setCookie( name, value, expiredays ) { var todayDate = new Date(); todayDate.setDate( todayDate.getDate() + expiredays ); document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";" } function closeWin(idx

www.data4library.kr

 

프로세서 흐름 : 도서관 이용자의 최근 대여 도서 5건의 isbn을 조회하여 API를 호출하고 추천해준 도서의 isbn을 가져와서 이용하는 도서관에 도서가 있는지 조회하고 도서관에 보유하고 있는 도서를 화면에서 보여주기

1] Controller

@GetMapping("/recommendList")
public String getRecommendList(HttpSession session, Model model) {
  //session에 저장되어있는 회원 id와 도서관 코드를 getting해서 String타입을 업캐스팅
  String memberId = (String) session.getAttribute("SID");
  String libraryCode = (String) session.getAttribute("SLIBRARY");

  //회원 id로 최근 대여한 5건의 도서 isbn을 조회 및 api 호출해서 추천 도서의 isbn을 list형태로 리턴
  List<String> bookIsbn = recommendservice.recommendList(memberId);
  // List 형태로 객체화
  List<Book> book = new ArrayList<Book>();

  //추천된 isbn 갯수만큼 반복문
  for(int i =0 ; i<bookIsbn.size();i++) {
    //isbn과 도서관 코드로 해당 도서가 도서관에 보유중인지 조회
    List<Book> getBook = bookService.isbnSelectBook(bookIsbn.get(i), libraryCode);
    if(getBook != null) {
      book.addAll(getBook);
    }else{
      //getBook이 null 일때 isbn 없이 api 호출(미구현)
    }
  }
  logger.info("book : {}", book);
  model.addAttribute("book", book);
  return "recommend/recommendList";
}

 

2] Service

public List<String> recommendList(String memberId){
  // 회원 아이디로 대여한 도서의 isbn 조회
  List<String> bookIsbn = rentMapper.selectIsbn(memberId);

  //api호출하는 uri
  String uri = "http://data4library.kr/api/recommandList?authKey=d30acf5969608e57f856c36ddd03e661e138d851efb484a2ddffc33ce70627d4"
  + "&isbn13=";
  String line = null;

  //조회한 도서 isbn을 담으려고 list 형태 객체화
  List<String> isbnList = new ArrayList<String>();

  //조회된 도서 isbn 크기만큼 반복문
  for(int i =0; i < bookIsbn.size(); i++) {
  	uri += bookIsbn.get(i)+";";
  }
  uri += "&format=json";
  logger.info("uri : {}",uri); // 완성된 uri 출력
  try {
    //uri 실행
    URL url = new URL(uri);
    URLConnection conn = url.openConnection();


    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

    line = br.readLine();

    //실행하면 json타입을 데이터가 한줄의 String 타입으로 가져와지기 때문에 json 형태로 가공해줘야한다.
    //json 라이브러리가 추가 되어있어야 사용할 수 있는 메서드
    JSONParser parser = new JSONParser();
    JSONObject obj =  (JSONObject) parser.parse(line);
    JSONObject response = (JSONObject) obj.get("response");
    JSONArray docs =  (JSONArray) response.get("docs");

    //최대 200권의 도서를 추천해주는데 100권만 가져와서 리스트 형태로 담기
    for(int i=0; i < 100;i++) {
      JSONObject books = (JSONObject) docs.get(i);
      JSONObject book = (JSONObject) books.get("book");
      String isbn13 = (String) book.get("isbn13");
      if(isbn13 != null) {
      	isbnList.add(isbn13);
      }
    }

  // 각종 예외 처리
  } catch (IOException e) {
  	e.printStackTrace();
  } catch (ParseException e) {
  	e.printStackTrace();
  }
  logger.info("isbnList : {}",isbnList);
  return isbnList;
}

 

위에 JsonParser는 line에 한 줄로 담겨있는 값을

{"response":{"request":{"isbn13":"9788972756194;9788943305840;"},"resultNum":200,"docs":[{"book":{"no":1,"bookname":"82년생 김지영 :조남주 장편소설 ","authors":"지은이: 조남주","publisher":"민음사","publication_year":"2016","isbn13":"9788937473135","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/112/111/11211133.jpg?type=m1&udate=20180530"}},{"book":{"no":2,"bookname":"언어의 온도 :말과 글에는 나름의 따뜻함과 차가움이 있다 ","authors":"지은이: 이기주","publisher":"말글터","publication_year":"2016","isbn13":"9791195522125","addition_symbol":"","vol":"","class_no":"818","bookImageURL":"http://image.aladin.co.kr/product/14842/6/cover/k742532452_1.jpg"}},{"book":{"no":3,"bookname":"가면산장 살인사건 ","authors":"지은이: 히가시노 게이고 ;옮긴이: 김난주","publisher":"재인","publication_year":"2014","isbn13":"9788990982575","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/4745/51/cover/899098257x_2.jpg"}},{"book":{"no":4,"bookname":"라플라스의 마녀 :히가시노 게이고 장편소설 ","authors":"지은이: 히가시노 게이고 ;옮긴이: 양윤옥","publisher":"현대문학","publication_year":"2016","isbn13":"9788972757573","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/7288/55/cover/8972757578_1.jpg"}},{"book":{"no":5,"bookname":"채식주의자:한강 연작소설","authors":"한강","publisher":"창비","publication_year":"2007","isbn13":"9788936433598","addition_symbol":"","vol":"","class_no":"813.6","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/033/094/03309417.jpg?type=m1&udate=20180609"}},{"book":{"no":6,"bookname":"7년의 밤 :정유정 장편소설 ","authors":"지은이: 정유정","publisher":"은행나무","publication_year":"2011","isbn13":"9788956604992","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"http://image.aladin.co.kr/product/14712/55/cover/k202532053_1.jpg"}},{"book":{"no":7,"bookname":"살인자의 기억법 :김영하 장편소설 ","authors":"지은이: 김영하","publisher":"문학동네","publication_year":"2013","isbn13":"9788954622035","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/072/622/07262295.jpg?type=m1&udate=20180314"}},{"book":{"no":8,"bookname":"기린의 날개 ","authors":"히가시노 게이고 지음 ;김난주 옮김","publisher":"재인","publication_year":"2017","isbn13":"9788990982674","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/10147/75/cover/8990982677_1.jpg"}},{"book":{"no":9,"bookname":"나는 나로 살기로 했다 :냉담한 현실에서 어른살이를 위한 to do list ","authors":"글·그림: 김수현","publisher":"마음의숲","publication_year":"2016","isbn13":"9791187119845","addition_symbol":"","vol":"","class_no":"818","bookImageURL":"http://image.aladin.co.kr/product/16751/86/cover/k642534567_2.jpg"}},{"book":{"no":10,"bookname":"오직 두 사람 :김영하 소설 ","authors":"지은이: 김영하","publisher":"문학동네","publication_year":"2017","isbn13":"9788954645614","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"http://image.aladin.co.kr/product/10949/50/cover/8954645615_2.jpg"}}]}}

 

이렇게 json 방식으로 재가공시키는 방법이다.

{
  "response":{
	"request":{
		"isbn13":"9788972756194;9788943305840;"},
		"resultNum":200,"docs":[
			{"book":{"no":1,"bookname":"82년생 김지영 :조남주 장편소설 ","authors":"지은이: 조남주","publisher":"민음사","publication_year":"2016","isbn13":"9788937473135","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/112/111/11211133.jpg?type=m1&udate=20180530"}},
			{"book":{"no":2,"bookname":"언어의 온도 :말과 글에는 나름의 따뜻함과 차가움이 있다 ","authors":"지은이: 이기주","publisher":"말글터","publication_year":"2016","isbn13":"9791195522125","addition_symbol":"","vol":"","class_no":"818","bookImageURL":"http://image.aladin.co.kr/product/14842/6/cover/k742532452_1.jpg"}},
			{"book":{"no":3,"bookname":"가면산장 살인사건 ","authors":"지은이: 히가시노 게이고 ;옮긴이: 김난주","publisher":"재인","publication_year":"2014","isbn13":"9788990982575","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/4745/51/cover/899098257x_2.jpg"}},
			{"book":{"no":4,"bookname":"라플라스의 마녀 :히가시노 게이고 장편소설 ","authors":"지은이: 히가시노 게이고 ;옮긴이: 양윤옥","publisher":"현대문학","publication_year":"2016","isbn13":"9788972757573","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/7288/55/cover/8972757578_1.jpg"}},
			{"book":{"no":5,"bookname":"채식주의자:한강 연작소설","authors":"한강","publisher":"창비","publication_year":"2007","isbn13":"9788936433598","addition_symbol":"","vol":"","class_no":"813.6","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/033/094/03309417.jpg?type=m1&udate=20180609"}},
			{"book":{"no":6,"bookname":"7년의 밤 :정유정 장편소설 ","authors":"지은이: 정유정","publisher":"은행나무","publication_year":"2011","isbn13":"9788956604992","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"http://image.aladin.co.kr/product/14712/55/cover/k202532053_1.jpg"}},
			{"book":{"no":7,"bookname":"살인자의 기억법 :김영하 장편소설 ","authors":"지은이: 김영하","publisher":"문학동네","publication_year":"2013","isbn13":"9788954622035","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"https://bookthumb-phinf.pstatic.net/cover/072/622/07262295.jpg?type=m1&udate=20180314"}},
			{"book":{"no":8,"bookname":"기린의 날개 ","authors":"히가시노 게이고 지음 ;김난주 옮김","publisher":"재인","publication_year":"2017","isbn13":"9788990982674","addition_symbol":"","vol":"","class_no":"833.6","bookImageURL":"http://image.aladin.co.kr/product/10147/75/cover/8990982677_1.jpg"}},
			{"book":{"no":9,"bookname":"나는 나로 살기로 했다 :냉담한 현실에서 어른살이를 위한 to do list ","authors":"글·그림: 김수현","publisher":"마음의숲","publication_year":"2016","isbn13":"9791187119845","addition_symbol":"","vol":"","class_no":"818","bookImageURL":"http://image.aladin.co.kr/product/16751/86/cover/k642534567_2.jpg"}},
			{"book":{"no":10,"bookname":"오직 두 사람 :김영하 소설 ","authors":"지은이: 김영하","publisher":"문학동네","publication_year":"2017","isbn13":"9788954645614","addition_symbol":"","vol":"","class_no":"813.7","bookImageURL":"http://image.aladin.co.kr/product/10949/50/cover/8954645615_2.jpg"}}
		]
	}
  }
}

 

JSONObject로 book까지 접근해서 book 안의 isbn을 조회하여 isbnList에 추가해서 isbn을 리턴

반응형

댓글