PHpullh
학습 라이브러리/Python/사이드이펙트 관리

PYTHON · 함수형

사이드이펙트 관리

함수형 프로그래밍에서 사이드이펙트를 격리하고 관리하는 패턴입니다.

함수형고급side effect사이드이펙트IO함수형

핵심 설명

함수형 프로그래밍에서 사이드이펙트를 격리하고 관리하는 패턴입니다.

Python code

from typing import Callable, TypeVar
from dataclasses import dataclass

T = TypeVar("T")

@dataclass
class IO:
    """사이드이펙트를 캡슐화하는 IO 모나드"""
    _effect: Callable

    def run(self):
        return self._effect()

    def map(self, func: Callable) -> "IO":
        return IO(lambda: func(self.run()))

    def bind(self, func: Callable) -> "IO":
        return IO(lambda: func(self.run()).run())

# 순수 비즈니스 로직
def format_greeting(name: str) -> str:
    return f"안녕하세요, {name}님!"

def to_upper(text: str) -> str:
    return text.upper()

# IO로 사이드이펙트 래핑
def get_input(prompt: str) -> IO:
    return IO(lambda: prompt)  # 실제: input(prompt)

def put_output(text: str) -> IO:
    return IO(lambda: print(text))

# 사이드이펙트 격리
program = (
    get_input("이름: ")
    .map(format_greeting)
    .map(to_upper)
)

result = program.run()
print(result)  # 안녕하세요, 이름:님! → UPPER

# 실용적 패턴: 의존성 주입
def process_data(data, *, reader=open, writer=print):
    """I/O를 주입받아 테스트 가능하게 만듦"""
    content = f"처리됨: {data}"
    writer(content)
    return content

print(process_data("테스트 데이터"))

학습 팁

의존성 주입으로 I/O를 인자로 전달하면 테스트 시 mock으로 쉽게 교체할 수 있습니다.

주의할 점

모든 사이드이펙트를 제거하려 하면 실용적이지 않습니다. 핵심은 순수 로직과 I/O를 분리하는 것입니다.

자주 묻는 질문

사이드이펙트 관리란 무엇인가요?

함수형 프로그래밍에서 사이드이펙트를 격리하고 관리하는 패턴입니다.

사이드이펙트 관리 학습 시 주의할 점은 무엇인가요?

모든 사이드이펙트를 제거하려 하면 실용적이지 않습니다. 핵심은 순수 로직과 I/O를 분리하는 것입니다.