본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
강의 요약
오늘 강의에서는 Spring WebFlux의 개념과 도입 배경에 대해 다루었다. 핵심 개념인 CPU bound와 IO bound에 대해 학습했으며, 이는 적절한 아키텍처 선택을 위한 기본 판단 기준이 된다는 점을 확인했다. 따라서 해당 두 개념에 대해 차이점에 대해 알아보자.
CPU Bound와 IO Bound의 정의
프로그램의 실행 성능이 어떤 자원에 의해 제한되는지를 나타내는 개념이다. 'I/O 바운드' 는 작업의 성능이 주로 입출력 작업 에 의해 제한됨을 의미한다 . 작업이나 프로그램이 'CPU 바운드' 라는 것은 다른 요인보다는 CPU의 처리 능력 에 의해 성능이 주로 제한됨을 의미한다.

CPU Bound
작업 실행이 CPU 성능에 크게 의존하는 상황을 의미한다. CPU가 유일하게 사용되는 컴포넌트이며, 다른 시스템 구성 요소는 거의 사용되지 않는다. 프로그램을 더 빠르게 실행하려면 CPU 속도를 높여야 한다.
특징
- CPU burst가 적고 길다
- 다른 시스템 구성 요소는 유휴 상태
- 자원 낭비를 방지하기 위해 낮은 우선순위 할당 권장
대표적인 예시
- 고성능 컴퓨팅 시스템
- 복잡한 수학 계산
- 그래픽 렌더링
- 이미지 처리
- 암호화/복호화
- 메모리 내 대용량 데이터 정렬
IO Bound
작업 실행이 입출력 시스템과 그 자원에 의존하는 상황을 의미한다. 디스크 드라이브, 네트워크 등 주변 장치를 통해 자원을 가져오는 것을 기다리는 시간이 대부분이다. 입출력 시스템이 더 빠르게 동작하면 프로그램도 더 빠르게 실행된다.
특징
- CPU burst가 많고 짧다
- CPU는 덜 사용되거나 전혀 사용되지 않음
- 짧은 CPU burst로 인해 스케줄링 시 높은 우선순위 할당
대표적인 예시
- 데이터베이스 읽기/쓰기
- 네트워크 요청
- 파일 시스템 작업
- 사용자 입력 대기
- 워드 프로세싱
- 웹 애플리케이션
- 파일 복사 및 다운로드
작업 구분 방법
애플리케이션이 어느 유형에 속하는지 판단하기 위해 다음 기준을 활용할 수 있다.
판단 질문
- 어떤 자원을 개선하면 프로그램이 더 빠르게 실행되는가?
- 프로그램이 긴 CPU burst를 필요로 하는가, 짧은 CPU burst를 필요로 하는가?
주방 비유를 통한 이해
애플리케이션을 주방의 셰프로 생각하면 이해가 쉽다.
- CPU 작업: 셰프가 요리하는 시간
- IO 작업: 창고에서 재료가 도착하기를 기다리는 시간
셰프는 때로는 요리를 하고(CPU 작업), 때로는 재료를 기다린다(IO 작업). 두 작업의 비율이 전체 성능을 결정한다.
CRUD 애플리케이션에서의 적용
대부분의 CRUD 애플리케이션은 데이터베이스 상호작용으로 인해 IO bound에 해당한다. 하지만 성능 최적화를 위해서는 CPU bound 작업을 식별하는 것도 중요하다.

작업 유형 판단 기준

- 데이터베이스 상호작용 시간
- 쿼리 실행 시간이 전체 응답 시간의 대부분을 차지하면 IO bound
- 데이터베이스 연결 대기 시간이 길면 IO bound

- 데이터 처리 시간
- 애플리케이션 내부 로직 실행 시간이 길면 CPU bound
- 복잡한 계산이나 변환 작업이 많으면 CPU bound
CRUD 작업별 분류
IO Bound 예시
사용자 프로필 조회
public UserProfile getUserProfile(Long userId) {
return userRepository.findById(userId) // 데이터베이스 읽기
.orElseThrow(() -> new UserNotFoundException(userId));
}
- 사용자 프로필 조회
public void updateUserStatuses(List<UserStatus> statuses) {
userRepository.saveAll(statuses); // 여러 건 데이터베이스 쓰기
}
- 일괄 업데이트 쿼리
CPU Bound 예시
public SalesReport generateMonthlyReport(List<Transaction> transactions) {
return transactions.parallelStream()
.collect(groupingBy(Transaction::getCategory,
summarizingDouble(Transaction::getAmount))); // 데이터 처리
}
- 리포트 생성
최적화 전략
작업별 최적화 전략에 대해 알아보자.
IO Bound 작업 최적화

- 비동기 프로그래밍 적용
- 커넥션 풀링 활용
- 캐싱 전략 도입
- 데이터베이스 쿼리 최적화
- 배치 처리 구현
CPU Bound 작업 최적화

- 병렬 처리 구현
- 알고리즘 개선
- 캐싱을 통한 중복 계산 제거
- 더 빠른 CPU로 하드웨어 업그레이드
혼합 환경 고려사항
대부분의 실제 프로그램은 CPU bound와 IO bound 작업이 혼재되어 있다. 따라서 엄격하게 한 그룹에만 속한다고 분류할 수 없다. 동영상 처리 파이프라인을 예로 들면 파일 읽기는 IO bound, 프레임 처리는 CPU bound, 파일 쓰기는 다시 IO bound에 해당한다.
이러한 경우 각 단계에 맞는 최적화 전략을 분리해서 적용해야 하며, 전체 파이프라인에서 가장 느린 구간을 우선적으로 개선하는 것이 효과적이다.
참고 출처
- https://www.baeldung.com/cs/cpu-io-bound
- https://levelup.gitconnected.com/understanding-i-o-bound-vs-cpu-bound-operations-d06ed2c301a0
- https://dev.to/sfundomhlungu/scalability-101-io-vs-cpu-bound-tasks-547o



