
사이드 이펙트 핸드북
핵심 요약: 프로그래밍에서 사이드 이펙트는 함수나 연산이 본래의 입력→출력 이외에 외부 상태를 변경하거나 관찰 가능한 동작을 수행하는 것이다. 이 핸드북은 사이드 이펙트의 정의·분류·원리·관리 기법·활용 방안을 세 단계(기본→심화→현장 적용)로 나누어, 코드의 예측 가능성과 유지보수성을 높이는 실전 지침을 제시한다.
1부: 사이드 이펙트 개념 및 분류
1.1 기본
- 정의: 연산이 인자 값을 읽고 결과를 반환하는 주효과(primary effect) 외에 외부 변수 변경, I/O 수행, 예외 발생 등을 부수적으로 일으키는 현상.1
- 예시:
- 전역 변수 수정
- 파일·DB 쓰기·읽기
- 네트워크 요청
- 콘솔 출력
- 예외 던지기
1.2 심화
- 영향 영역별 분류:
- 로컬 상태 변경 (.mutable 객체 속성 수정, 정적 변수 조작)
- 외부 시스템 접근 (파일·네트워크·DB I/O)
- 런타임 동작 (예외·스레드 생성·타이밍 지연)
- 식별 특성:
- 비가역성: 한 번 발생하면 되돌리기 어려움
- 비결정성: 호출 시점·환경에 따라 결과·부수 효과가 달라짐
- 문맥 의존성: 호출 순서·히스토리에 따라 동작이 달라짐
1.3 현장 적용
- 코드 리뷰 체크리스트:
- 함수가 반환값 없이
void
인 경우 → 사이드 이펙트 의심 - 인자 외 전역 변수 참조·수정 여부 점검
- 외부 API·파일·콘솔 호출 유무 확인
- 함수가 반환값 없이
- 도구 활용:
- 정적 분석기(ESLint
no-side-effects
룰) - 타입·이펙트 시스템 (Effect 시스템, Haskell의
IO
모나드)
- 정적 분석기(ESLint
2부: 발생 메커니즘 및 위험 요인
2.1 기본
- 패러다임 비교:
- 명령형(Imperative): 상태 변경이 중심 → 사이드 이펙트 빈번
- 함수형(Functional): 순수 함수 지향 → 부수 효과 최소화
- 참조 투명성(Referential Transparency):
- 사이드 이펙트 없고 동일 입력에 항상 동일 출력 보장할 때 확보
2.2 심화
- 숨은 부작용(Hidden Effects):
- 어셈블리의 조건 코드 플래그 변경
- 컴파일러 최적화 간 파이프라인 정지 유발
- 비동기·병렬환경 문제:
- 이벤트 루프·스레드 경쟁
- I/O 지연이 로직 흐름에 미치는 타이밍 이슈
2.3 현장 적용
- 테스트 어려움:
- 순수 함수와 부수 효과 분리(의존성 주입·모나드 패턴)
- 사이드 이펙트 선언(
IO<A>
,Task<A>
) vs 실행(.run()
) 분리
- 모범 사례:
- 순수 로직(core) ↔ 부수 효과(shell) 층 분리(헥사고널 아키텍처)
- 부작용은 최상위
main
에서만 수행
3부: 모니터링·관리·최적화
3.1 기본
- 원칙:
- 최소화: 필요 시에만 사이드 이펙트 허용
- 캡슐화: 선언·실행 분리
- 명시화: 타입에 부작용 정보 노출
3.2 심화
- 지연 실행(Lazy Evaluation):
- 함수 호출 시 즉시 실행하지 않고 래퍼 함수(
()⇒A
)로 반환2
- 함수 호출 시 즉시 실행하지 않고 래퍼 함수(
- 모나드·이펙트 시스템:
- Haskell
IO
모나드, Scalacats-effect::IO
, TypeScriptfp-ts
의Task
- 연속
.flatMap
·.andThen
으로 순차적 부작용 서술
- Haskell
3.3 현장 적용
- 의존성 주입(DI):
- 외부 함수(
prompt
,fetch
,console.log
)를 인터페이스로 주입 - 테스트 시 모의 구현(Mock)으로 대체
- 외부 함수(
- 도구·라이브러리:
- fp-ts:
IO
,Task
,ReaderTaskEither
등 부작용 타입 제공 - Redux-Saga/RxJS: 리액티브 스트림으로 부작용 관리
- Typescript ESLint: 규칙(
no-console
,no-implicit-side-effects
)
- fp-ts:
4부: 개발 프로세스 내 활용
4.1 기본
- 코드 스타일 가이드:
- 순수 함수와 부수효과 함수 구분된 디렉토리 구조
utils/
엔 순수 로직,effects/
엔 부작용 모듈 배치
4.2 심화
- CI 파이프라인 검사:
- 정적 분석→부작용 누수 경고
- 병합 전 부수효과 함수 검토 체크리스트 실행
4.3 현장 적용
- 교육·문서화:
- 팀 내 헥사고널 아키텍처·모나드 패턴 워크숍
- 주요 모듈별 부작용 매니페스트 작성 및 공유
- 운영 모니터링:
- APM(Application Performance Monitoring)에서 I/O 지연 추적
- 로깅 시스템에 부작용 발생 로그 레벨·메타데이터 포함
기대 효과: 이 핸드북에 따른 사이드 이펙트 관리로 코드의 예측 가능성, 테스트 용이성, 최적화 가능성이 향상되어 유지보수 비용이 감소하고, 대규모 시스템에서도 안정적인 동작을 보장할 수 있다.
⁂