본문 바로가기

SW Dev Portfolio

Java 백엔드 기반 DBMS (MSSQL , MYSQL)으로 대량의 데이터를 컨트롤 및 서버 과부화를 막기 위한 고찰

반응형

대량의 데이터를 처리하고 서버 과부하를 방지하기 위한 몇 가지 방법을 소개해 드리겠습니다. 

이러한 방법은 전자정부프레임워크와 MySQL 데이터베이스를 사용하는 환경에서 적용할 수 있습니다.

Pagination (페이징):
대량의 데이터를 한 번에 가져오는 대신 페이지별로 일부 데이터만 가져옵니다. 이령 전체 데이터를 동시에 메모리에 로드하지 않고 사용자에게 필요한 부분만 표시합니다.

Spring Framework에서는 LIMIT 및 OFFSET을 사용하여 MySQL 쿼리를 작성할 수 있습니다.

SELECT * FROM your_table LIMIT 10 OFFSET 0; -- 첫 번째 페이지
SELECT * FROM your_table LIMIT 10 OFFSET 10; -- 두 번째 페이지



인덱싱 (Indexing):
데이터베이스에서 인덱스를 생성하여 데이터를 빠르게 검색합니다. 인덱스는 쿼리 성능을 향상시키는 데 도움이 됩니다.

검색 조건에 맞는 열에 인덱스를 생성합니다.

CREATE INDEX index_name ON your_table (column_name);





비동기 처리 (Asynchronous Processing):
백그라운드에서 데이터 가져오기 작업을 수행하여 웹 서버의 주 스레드를 차단하지 않고 대용량 데이터를 처리합니다. Spring에서는 비동기 작업을 위해 @Async 어노테이션 및 CompletableFuture 등을 사용할 수 있습니다.


@Async
public CompletableFuture<List<Data>> fetchDataAsync() {
    // 대량 데이터를 가져오는 작업
}



캐싱 (Caching):
자주 요청되는 데이터를 메모리에 캐싱하여 반복적인 데이터베이스 쿼리를 방지합니다. Spring에서는 Spring Cache Abstraction을 사용하여 캐싱을 구현할 수 있습니다.


@Cacheable("dataCache")
public List<Data> fetchData() {
    // 데이터베이스 쿼리
}




데이터 정규화 및 최적화:
데이터베이스 스키마를 정규화하고, 쿼리를 최적화하여 필요한 데이터만 검색하도록 만듭니다. 또한 MySQL의 EXPLAIN 명령을 사용하여 쿼리 실행 계획을 최적화할 수 있습니다.

백그라운드 작업 스케줄링:
데이터를 주기적으로 백그라운드에서 가져와서 캐시에 저장하거나 가공하는 스케줄링 작업을 구현합니다. Spring에서는 스케줄링을 위해 @Scheduled 어노테이션을 사용할 수 있습니다.

@Scheduled(fixedRate = 3600000) // 1시간마다 실행
public void fetchDataAndCache() {
    // 데이터 가져오고 캐싱
}




이러한 방법 중 하나 또는 여러 가지 방법을 혼합하여 사용하여 대량의 데이터를 효과적으로 처리하고 서버 과부하를 방지할 수 있습니다. 많은 데이터를 다룰 때는 성능 튜닝이 중요하므로 데이터양과 요구 사항에 따라 적절한 방법을 선택하고 구현하세요.

반응형