📌 사용한 OPEN API
전국도서관도서표준데이터
회원 가입 후 open api 사용을 위한 인증 키 받기
1. 책 등록 API 호출

2. 조회된 책 리스트 가져오고 저장하기

✅ "길벗"이라는 출판사를 검색 키워드로 입력하고 현재 페이지는 "1", 데이터 수는 "100"으로 설정하여 시나리오를 구성하였다.
➡️ 요청 성공 시 조회 된 데이터가 DB에 저장된다.

다른 api가 추가되었을 때를 고려하여 Client 패키지로 따로 관리하도록 하였다.
✅ 발급받은 인증 키는 요청에 필수로 들어가야 한다.

//발급 키
@Value("${book.api.key}")
private String apiKey;
✅ 검색 조건은 total[title, author, publisher(출판사), cheonggu]로 지정하여 책을 조회하도록 하였다.
🚨
apiType은 꼭 json으로 설정한다.
⚠️ kwd (검색어)는 반드시 입력되어야 한다.
{ "errorCode" : "015", "errorMsg" : "REQUIRED PARAMETER MISSING:검색어를 입력하세요. kwd=[검색어]" }

설정한 URI를 통해 책 조회 요청을 한다.
// String 타입으로 응답을 받아서 메세지 컨버터가 처리할 수 있도록 하였다.
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
💡 restTemplate
스프링3부터 지원하는 HTTP 통신 기능을 쉽게 사용할 수 있게 설계되어 있는 템플릿이다.
REST API 호출이후 응답을 받을 때까지 기다리는 동기방식으로 처리되며 RESTful 방식을 지키고 있다.

설정한 URI를 통해 요청을 보내고 응답 타입을 지정하여 원하는 타입으로 응답을 받을 수 있다.
BookApiResponse를 만들어 원하는 값들만 추출해서 받아왔다.
➡️ 책 제목, 저자, 카테고리, 책 고유번호만 추출하도록 하였다.
[응답 필드는 아래 사진과 같이 주어진다. 더 자세한 필드는 홈페이지 참고]



api 호출 시 조건에 따라 책이 조회되고 가격, 수량 등의 정보는 랜덤으로 설정하여 데이터 베이스에 저장되도록 하였다.
@Transactional
public void createBookByOpenApi(AuthUser authUser, Integer pageNum, Integer pageSize, String keyword) {
//open api를 통해 책 리스트 가져오기 (외부 api를 호출)
BookApiResponse[] books = bookClient.getBooks(keyword, pageNum, pageSize);
...
//랜덤 가격 및 재고 생성을 위한 Random객체 선언
Random random = new Random();
for (BookApiResponse book : books) {
//랜덤 가격 (Min: 5000, Max: 45000)
long randomPrice = 5000 + random.nextLong(40000);
BigDecimal price = BigDecimal.valueOf(Math.round(randomPrice / 1000.0) * 1000);
//랜덤 재고 (Min: 1, Max:101)
int randomStock = 1 + random.nextInt(100);
//책 고유번호가 없는 경우
if (!StringUtils.hasText(book.getIsbn())) {
continue;
}
//이미 등록된 책인 경우 저장하지 않음
if (bookRepository.existsByIsbn(book.getIsbn())) {
continue;
}
Users findUsers = userService.findByIdOrElseThrow(authUser.getUserId());
Book savedBook = Book.of(findUsers, book, price, randomStock);
bookRepository.save(savedBook);
}
RestClient 알아보기 (RestTemplate이 Deprecated 된다고요?)
🔴 restTemplate
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
🟢 restClient
ResponseEntity<String> responseEntity = restClient.get()
.uri(uri)
.retrieve()
.toEntity(String.class);
restClient의 경우 chain 방식을 사용하기 때문에 보기도 쉽고 코드의 가독성이 증가할 수 있다.