데이터 처리 어디서 할까?

break 없는 while loop·2025년 4월 13일
post-thumbnail

1. 데이터 처리?

대부분의 개발자는 데이터를 필터링하고, 정렬하고, 가공하는 작업을 매일 한다.
그런데 이 데이터를 "어디서" 처리할지는 의외로 명확하지 않을 때가 많다.

  • SQL에서 미리 필터링해서 넘기는 게 좋을까?
  • 아니면 백엔드에서 Java의 Stream API로 처리하는 게 더 유연할까?
  • 혹은 프론트에서 JS의 filter/map으로 처리해도 괜찮을까?

이 글에서는 DB, Backend, Frontend에서 데이터를 처리하는 각각의 방식
성능, 유지보수, UX 관점에서 비교하고, 언어별 예제까지 함께 정리해보려고 한다.

2. 비교

데이터를 처리하는 위치는 보통 다음 세 군데 중 하나이다.

  • DB (SQL): 쿼리에서 직접 필터링/정렬/집계
  • 백엔드 (Java, Python 등): 서버에서 비즈니스 로직과 함께 처리
  • 프론트엔드 (JS, C# 등): 화면단에서 즉석 처리

아래는 이 세 가지 방식의 장단점을 간단히 정리한 표이다.

처리 위치장점단점추천 상황
DB (SQL)빠름, 네트워크 ↓, 인덱스 활용로직 복잡, 유지보수 어려움대용량 필터/정렬/집계
백엔드로직 분기 유연, 재사용 용이네트워크 부하, CPU 사용 ↑비즈니스 로직 존재 시
프론트엔드UX 빠름, 서버 부하 ↓느림, 보안 취약소량 데이터, 인터랙션 필터링

1. DB에서 처리 (SQL, View, Procedure 등)

✔️ 장점

  • 데이터 필터링/집계 속도 최강 (인덱스 최적화 가능)
  • 네트워크 전송량 최소화 (필요한 데이터만 전송)
  • 트랜잭션, 동시성, 일관성 확보에 유리

❌ 단점

  • 복잡한 로직 표현 어려움 (if-else, 복잡한 비즈니스 조건)
  • 유지보수가 어려워짐 (SQL이 길고 복잡해짐)
  • 비즈니스 로직이 퍼져 관리가 어려움

✅ 추천 상황

  • 대용량 테이블 조인, 집계, 단순 필터링
  • API 성능이 중요할 때
  • 다수 클라이언트가 동일한 쿼리 구조를 쓸 때

2. Backend에서 처리 (Java, Python, Node 등)

✔️ 장점

  • 복잡한 로직/비즈니스 요구 처리 가능 (OOP, 함수 재사용 등)
  • 유닛 테스트, 로그, 예외 처리 쉽게 가능
  • 공통 비즈니스 로직을 여러 API에서 재사용 가능

❌ 단점

  • 많은 데이터를 가져와 처리하면 네트워크/메모리 부하
  • 병목이 생길 수 있음 (GC, CPU 부하 등)

✅ 추천 상황

  • 비즈니스 로직이 복잡하거나 외부 시스템 연동 필요
  • 로직 재사용, 테스트, 유지보수성이 중요한 경우
  • 사용자 별 커스터마이징된 처리 필요할 때

3. Frontend에서 처리 (JS, React 등)

✔️ 장점

  • 사용자 맞춤 필터/정렬 즉시 반응 (UX 개선)
  • 서버 부하 분산
  • 필터/정렬 옵션을 UI로 제어하기 쉬움

❌ 단점

  • 데이터가 클 경우 브라우저 부담 커짐
  • 보안 이슈 (클라이언트는 신뢰할 수 없음)
  • 느림 (특히 모바일, 저사양 기기)

✅ 추천 상황

  • 화면에 출력된 데이터만 정렬/필터
  • UX 개선 목적의 가벼운 데이터 처리
  • 이미 백엔드에서 필터된 소량 데이터만 가져올 경우

🧠 실무적 판단 기준

판단 포인트처리 위치 추천
데이터 양 많다DB
조건이 복잡하다백엔드
사용자 UI 반응성이 중요하다프론트엔드
보안이 중요하다백엔드 / DB
성능이 최우선이다DB + 백엔드 최적화
다수 API에서 로직 재사용백엔드

🔥 현실적 예시

  • 회원 목록 페이지
    • 필터/검색: DB
    • 정렬/페이지네이션: DB
    • JSON 응답 포맷 조작: Backend
    • 컬럼 숨김/정렬 UI: Frontend
  • 매출 통계 API
    • 집계: DB
    • 통계 가공: Backend
    • 시각화: Frontend

3. 예시

✅ 1. DB에서 처리 예시 (SQL 쿼리)

🛠️ 환경: Oracle / MySQL / PostgreSQL 등

📌 예시: "status = 'dormant'이고 age ≥ 30인 고객을 ID 기준 오름차순으로 조회"

SELECT id, name, age, status
FROM customers
WHERE status = 'dormant' AND age >= 30
ORDER BY id ASC;

💡 특징:

  • 네트워크 비용 최소화
  • 가장 빠르고 최적화된 방식 (인덱스 활용 가능)
  • UI와 로직 분리 잘 됨

✅ 2. 백엔드(Java)에서 처리 예시 (Stream API)

🛠️ 환경: Spring Boot, Java 11+

List<Customer> result = customers.stream()
	.filter(c -> "dormant".equalsIgnoreCase(c.getStatus()) && c.getAge() >= 30)
    .sorted(Comparator.comparing(Customer::getId))
    .collect(Collectors.toList());

💡 특징:

  • 복잡한 조건/분기문/로직을 함수형으로 유연하게 표현
  • 다양한 데이터 가공 가능 (groupBy, toMap, etc)
  • 트랜잭션/로깅/검증 추가 용이

✅ 3. Frontend(WPF C# LINQ, JavaScript React)에서 처리 예시

🛠️ 환경: WPF .NET Core, JavaScript React

var result = customers
	.Where(c => c.Status == "dormant" && c.Age >= 30)
    .OrderBy(c => c.Id)
    .ToList();
const result = customers
	.filter(c => c.status === "dormant" && c.age >= 30)
	.sort((a, b) => a.id - b.id);

💡 특징:

  • 이미 가져온 데이터(UI 바인딩 된 데이터)를 즉석 필터링
  • 서버 재요청 없이 빠른 UX 제공

4. 처리 위치는 트레이드 오프다

데이터를 어디서 처리할지는 속도 vs 유지보수 vs 유연성의 싸움이다.
정답은 없지만, 아래처럼 기준을 정리해두면 매번 고민하지 않아도 될 것 같다.

  • 빠르게 보여줘야 한다? → DB
  • 조건이 많고, 유저마다 달라진다? → Backend
  • 작은 데이터에 즉시 반응 필요하다? → Frontend
profile
프로그래밍 지식 아카이브용

0개의 댓글