Spring : JSON 데이터 mysql에 저장하기 (알라딘 OpenAPI)

Chloé·2023년 4월 25일

🌿 Spring

목록 보기
3/4

Json 데이터 mysql에 저장하기


GPT가 알려준 요약본



  • 프로젝트 진행 중 책의 폭 사이즈 데이터가 필요했는데 다행히 알라딘의 OpenAPI에서 내가 필요한 데이터는 물론이고 그 외에도 다양한 데이터를 제공하고 있었다!



알라딘 ttbkey 발급



BookService 코드 작성

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class BookService {
    @Autowired
    private final BookRepository bookRepository;

    RestTemplate restTemplate = new RestTemplate();
    @Transactional
    public void fetchDataFromApi() {
        List<String> isbnCodeList = List.of("9791133487516", "9791133487523", "9791133487530", "9791133487547", "9791133487554", "9791133487561", "9791133487578", "9791133487585", "9791133487592", "9791133487608");
        List<Book> bookList = new ArrayList<>();
        for (String isbnCode : isbnCodeList) {
        	// 알라딘 상품조회 url
            String apiUrl = "https://www.aladin.co.kr/ttb/api/ItemLookUp.aspx?ttbkey={알라딘에서 발급받은 ttbkey}&itemIdType=ISBN&ItemId=" + isbnCode + "&output=js&Version=20131101&OptResult=packing";
            BookApiResponse response = restTemplate.getForObject(apiUrl, BookApiResponse.class);
            BookApiResponse.Item item = response.getItem().get(0);
            Book book = Book.builder()
                    .name(item.getTitle())
                    .author(item.getAuthor())
                    .isbn(item.getIsbn13())
                    .depth(item.getSubInfo().getPacking().getSizeDepth())
                    .title_url(item.getCover())
            bookList.add(book);

        }
        bookRepository.saveAll(bookList);
    }
}
  • 나는 더미데이터로 사용할 몇 권만 DB에 넣으려고 했기 때문에 내가 사용할 책 isbn만 배열로 만들었고 for문을 돌려서 요청 url에 넣어주었다.


BookApiResponse 코드

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class BookApiResponse {
    private String version;
    private String logo;
    private String title;
    private String link;
    private String pubDate;
    private int totalResults;
    private int startIndex;
    private int itemsPerPage;
    private String query;
    private int searchCategoryId;
    private String searchCategoryName;
    private List<Item> item;

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Item {
        private String title;
        private String author;
        private String cover;
        private String isbn13;
        private SubInfo subInfo;

        @Getter
        @Setter
        @NoArgsConstructor
        @AllArgsConstructor
        public static class SubInfo {
            private Packing packing;
            
            @Getter
            @Setter
            @NoArgsConstructor
            @AllArgsConstructor
            public static class Packing {
                private double sizeDepth;
            }
        }
    }
}
  • SubInfo > Packing > SizeDepth 데이터만 필요했기 때문에 저렇게 설정해줌!



BookController 코드

@RestController
@RequiredArgsConstructor
@RequestMapping("/books")
public class BookController {
    private final BookService bookService;

    @PostMapping("")
    @Operation(hidden = true)
    public ResponseEntity<ApiResponse> fetchDataFromApi() {
        bookService.fetchDataFromApi();
        ApiResponse response = new ApiResponse<>(true, "책 데이터 DB 저장 완료");
        return new ResponseEntity<>(response, HttpStatus.OK);
    }
}
  • Controller에서 작성했던 Service를 불러오면 끝!
  • 클라이언트에서는 사용하지 않고 서버에서만 사용할 api이기 때문에 hidden 처리를 해주었다.
profile
안녕하세용

0개의 댓글