
https://github.com/ppyong11/teamProject
대량 데이터 DB 적재 로직 개발 (KIPRIS API 활용)

KIPRIS에서 제공하는 API와 CPC 분류 코드를 이용해 데이터를 수집하고 DB에 적재하였습니다.
효율적인 적재를 위해 Pageable로 각 CPC 코드당 500건씩 조회하고 JDBC의 배치 처리 기술을 이용해 한 번의 Insert문으로 저장했습니다.
하나의 특허 데이터가 가지는 CPC 코드가 여러 개이기 때문에 고유한 속성인 출원번호를 기본키로 두고 INSERT IGNORE 문법을 활용하여 겹치는 데이터는 저장되지 않게 하였습니다. 또한 날짜 포맷과 null 값 및 예외 처리 로직을 구현하여 안정성을 높였습니다.
RESTful API 개발

KIPRIS API는 단일 CPC 코드 검색만 지원하기 때문에 프로젝트의 목적인 관계 기반 지식 그래프를 구축하기 위해 교집합 검색이 가능한 API를 구현하였습니다.
JPA와 Hibernate를 사용하여 DB 데이터를 객체처럼 다루고, 복잡한 문자열 로직 조작을 위해 JPQL을 활용해 교집합 검색 조회 쿼리를 처리했습니다. 검색 가능한 CPC 코드 개수는 3개로 제한해 동적 쿼리를 쓰는 대신 정적 JPQL을 분기 처리하여 성능과 유지보수성을 확보했습니다.
조회된 모든 데이터를 출력하면 부하가 심해 Pageable 함수를 이용해 결과 데이터 값을 500개로 설정했으며 필요한 필드만 DTO로 전환해 클라이언트로 보냅니다.
데이터 특성을 기반한 저장 방식 개선
처음 데이터를 적재할 때, 노트북과 DB 성능을 고려하지 않고 빠른 DB 작업을 위해 1-depth(A, B, C)로 적재하려 했습니다. 한 번에 20만 개 이상의 데이터를 페이지별 병렬 처리를 활용하여 저장을 시도했고, 조회부터 적재까지 총 4시간이 걸렸습니다.
문제 해결을 위해 효율적인 대용량 데이터 처리 방식에 대한 검색해 보니, 별도의 배치 처리를 하지 않아 발생한 문제였습니다. 배치 단위로 병렬 처리해 적재해도 노트북 성능상 수십 만 개의 데이터는 담아내지 못할 것 같아 팀 회의를 통해 3-depth 카테고리당 500건씩만 저장하는 방식을 채택했습니다. 효율적인 저장을 위해 3-depth 카테고리당 500건씩 페이지 처리한 후, 배치 처리 단위로 묶어 DB에 INSERT해 1~2분으로 처리 속도를 개선할 수 있었습니다.
이 경험을 바탕으로 추후 유사한 상황에 안정적인 데이터 적재 구조를 설계하고, 시스템 성능에 맞는 데이터 처리 기술을 활용할 수 있을 것이라 생각합니다.