온라인 서점 프로젝트 OPEN API 적용 과정

늘보·2025년 4월 9일

Spring

목록 보기
20/24

📌 사용한 OPEN API

전국도서관도서표준데이터
회원 가입 후 open api 사용을 위한 인증 키 받기


open api 사용 흐름

1. 책 등록 API 호출

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

✅ "길벗"이라는 출판사를 검색 키워드로 입력하고 현재 페이지는 "1", 데이터 수는 "100"으로 설정하여 시나리오를 구성하였다.

➡️ 요청 성공 시 조회 된 데이터가 DB에 저장된다.


open api 적용 과정

1. Client 패키지 생성

다른 api가 추가되었을 때를 고려하여 Client 패키지로 따로 관리하도록 하였다.


2. 요청 URI 만들기

발급받은 인증 키는 요청에 필수로 들어가야 한다.

//발급 키
@Value("${book.api.key}")
private String apiKey;

✅ 검색 조건은 total[title, author, publisher(출판사), cheonggu]로 지정하여 책을 조회하도록 하였다.

🚨 apiType은 꼭 json으로 설정한다.

⚠️ kwd (검색어)는 반드시 입력되어야 한다.

{
  "errorCode" : "015",
  "errorMsg" : "REQUIRED PARAMETER MISSING:검색어를 입력하세요. kwd=[검색어]"
}


3. 데이터 가져오기

설정한 URI를 통해 책 조회 요청을 한다.

// String 타입으로 응답을 받아서 메세지 컨버터가 처리할 수 있도록 하였다.
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);

💡 restTemplate

스프링3부터 지원하는 HTTP 통신 기능을 쉽게 사용할 수 있게 설계되어 있는 템플릿이다.

REST API 호출이후 응답을 받을 때까지 기다리는 동기방식으로 처리되며 RESTful 방식을 지키고 있다.

설정한 URI를 통해 요청을 보내고 응답 타입을 지정하여 원하는 타입으로 응답을 받을 수 있다.


📌 json 파싱 실패 오류 트러블 슈팅


BookApiResponse를 만들어 원하는 값들만 추출해서 받아왔다.

➡️ 책 제목, 저자, 카테고리, 책 고유번호만 추출하도록 하였다.

[응답 필드는 아래 사진과 같이 주어진다. 더 자세한 필드는 홈페이지 참고]


4. 데이터 저장하기

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);
        }

✅ restTemplate VS restClient

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 방식을 사용하기 때문에 보기도 쉽고 코드의 가독성이 증가할 수 있다.

profile
누워만 있지 말고 제발 뭐라도 하자.

0개의 댓글