안녕하세요! 우테코 Car-ffeine 팀의 제이입니다. 저희 팀은 전기차 충전소 관련 서비스를 개발하면서, 실시간으로 변하는 데이터를 어떻게 효율적으로 관리할 수 있을까 많은 고민을 했습니다. 특히 공공 API를 통해 주기적으로 데이터를 받아와 데이터베이스에 반영하는 과정에서 여러 문제점을 발견했고, 이를 해결하기 위해 다양한 시도를 했습니다. 오늘은 저희가 겪었던 문제 상황과 이를 극복하기 위한 전략들을 공유하고자 합니다. 부족한 부분이 있더라도 너그러이 봐주시고, 건설적인 피드백 부탁드립니다! (Car-ffeine 프로젝트 Github 저장소: https://github.com/woowacourse-teams/2023-car-ffeine)
데이터, 효율적으로 관리하는 방법은?
저희 Car-ffeine 팀은 전기차 충전소 공공 API를 활용하여 사용자들에게 충전소 혼잡도 정보를 제공하는 것을 목표로 하고 있습니다. 이를 위해서는 다음과 같은 과정이 필요했습니다.
- 초기 데이터 적재: 서비스 시작 시점에 공공 API로부터 전체 충전소 데이터를 가져와 데이터베이스에 저장합니다.
- 주기적인 업데이트: 충전소 혼잡도는 실시간으로 변동하므로, 주기적으로 API를 호출하여 최신 정보를 갱신해야 합니다.
초기에는 단순하게 API로부터 받은 데이터를 그대로 데이터베이스에 덮어쓰는 방식으로 구현했습니다. 하지만 이 방식은 몇 가지 심각한 문제점을 가지고 있었습니다.
- 불필요한 데이터베이스 부하: 변경되지 않은 데이터까지 매번 업데이트하므로 데이터베이스에 불필요한 부하가 발생했습니다.
- 성능 저하: 데이터 양이 많아질수록 전체 데이터를 갱신하는 데 시간이 오래 걸려 서비스 성능이 저하될 수 있었습니다.
- 데이터 무결성 문제: API 호출 중 오류가 발생하면 데이터가 불완전하게 업데이트될 가능성이 있었습니다.
이러한 문제점을 해결하기 위해 저희는 다음과 같은 개선 전략을 적용했습니다.
- 변경분 감지: API로부터 받은 데이터와 데이터베이스에 저장된 데이터를 비교하여 변경된 데이터만 업데이트하도록 했습니다. 구체적으로는 충전소 ID를 기준으로 데이터를 비교하고, 혼잡도 정보가 변경된 경우에만 업데이트를 수행했습니다.
- Bulk Insert & Update: 변경된 데이터를 한 번에 모아서 데이터베이스에 전송하는 Bulk Insert 및 Update 방식을 사용했습니다. 이를 통해 데이터베이스와의 통신 횟수를 줄여 성능을 향상시켰습니다. 예를 들어, JDBC의
batchUpdate()메서드나 JPA의EntityManager.flush()와EntityManager.clear()를 활용하여 대량의 데이터를 효율적으로 처리할 수 있습니다. - 트랜잭션 관리: 데이터 업데이트 과정에서 오류가 발생하더라도 데이터의 일관성을 유지하기 위해 트랜잭션을 적용했습니다. 트랜잭션을 사용하면 데이터 업데이트 작업이 모두 성공하거나 모두 실패하도록 보장할 수 있습니다.
- 인덱싱 최적화: 데이터베이스 테이블에 적절한 인덱스를 설정하여 데이터 검색 및 업데이트 속도를 향상시켰습니다. 특히 충전소 ID와 같이 자주 사용되는 컬럼에 인덱스를 설정하는 것이 중요합니다.
위 전략들을 적용한 결과, 데이터베이스 부하를 줄이고 서비스 성능을 향상시키는 데 성공했습니다. 예를 들어, 초기에는 전체 데이터 갱신에 몇 분씩 걸리던 작업이 몇 초 만에 완료될 수 있었습니다. 또한, 트랜잭션 관리를 통해 데이터의 무결성을 확보할 수 있었습니다.
지속적인 개선을 향해
이번 경험을 통해 저희는 실시간으로 변하는 데이터를 효율적으로 관리하는 것이 얼마나 중요한지 깨달았습니다. 또한, 문제점을 정확하게 파악하고 다양한 해결 방안을 시도하는 과정에서 많은 것을 배울 수 있었습니다. 앞으로도 저희 Car-ffeine 팀은 지속적인 개선을 통해 더욱 안정적이고 사용자 친화적인 서비스를 제공할 수 있도록 노력하겠습니다. 여러분의 많은 관심과 응원 부탁드립니다!