본문 바로가기
프레임워크/웹 상식

사이드 이펙트(side effect)

by 클레어몬트 2024. 8. 20.

사이드 이펙트(side effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한

다. 쉽게 말하면 '의도하지 않은 결과'를 의미하며 프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용한다.

 

1. 사이드 이펙트의 예시

  • 전역 변수 수정: 함수가 전역 변수를 수정하는 경우.
  • 입력 값 수정: 함수가 전달된 인자의 값을 직접 변경하는 경우.
  • 파일 시스템에 쓰기: 함수가 파일에 데이터를 쓰거나 파일을 수정하는 경우.
  • 데이터베이스 업데이트: 함수가 데이터베이스에 값을 삽입하거나 갱신하는 경우.
  • 콘솔 출력: 함수가 콘솔에 메시지를 출력하는 경우. (System.out.println() 등)
  • 네트워크 요청: 함수가 외부 네트워크 요청을 하는 경우.

 

2. 사이드 이펙트의 문제점

"사이드 이펙트는 프로그램의 예측 가능성을 낮추고, 유지보수성을 떨어뜨리는 요인이 될 수 있다"

  • 디버깅의 어려움: 코드가 예상하지 못한 방식으로 동작하거나, 특정 조건에서만 버그가 발생하는 경우가 많아지게 된다. 이는 코드의 상태가 외부 환경에 따라 달라지기 때문이다.
  • 재사용성 저하: 사이드 이펙트를 가진 함수는 외부 상태에 의존하므로, 코드의 재사용이 어렵다.
  • 병렬 처리 문제: 사이드 이펙트는 함수가 동일한 입력에 대해 항상 같은 출력을 보장하지 않기 때문에, 병렬 처리에서 동기화 문제를 일으킬 수 있다.
  • 테스트 어려움: 사이드 이펙트를 가진 함수는 순수 함수(pure function)와 달리 테스트가 어려울 수 있다. 외부 상태에 의존하기 때문에, 테스트 환경과 실제 환경에서 다르게 동작할 수 있다.

 

3. 사이드 이펙트를 줄이는 방법

① 순수 함수 사용: 순수 함수(pure function)는 입력값만을 사용하여 출력을 결정하고, 함수 외부의 상태를 변경하지 않는다. 순수 함수를 사용하면 사이드 이펙트를 피할 수 있다.

// 순수 함수의 예
public int add(int a, int b) {
    return a + b;
}

 

 

 

② 불변성 유지: 데이터 구조를 불변으로 유지하면, 데이터를 변경하는 대신 새로운 데이터를 반환함으로써 사이드 이펙트를 줄일 수 있다.

// 불변 객체를 반환하는 예
public List<Integer> addElement(List<Integer> list, int element) {
    List<Integer> newList = new ArrayList<>(list);
    newList.add(element);
    return newList;
}

 

 

 

③ 의존성 주입(DI): 객체가 외부 의존성을 주입받아 사용하는 방식으로 코드를 작성하면, 객체가 외부 상태에 의존하는 것을 줄일 수 있다.

// 의존성 주입의 예
class Service {
    private final Repository repository;
    
    public Service(Repository repository) {
        this.repository = repository;
    }
    
    public void saveData(Data data) {
        repository.save(data);
    }
}

 

 

 

④ 명령과 질의 분리 (CQRS, Command Query Responsibility Segregation): 명령(Command)과 질의(Query)를 분리하여, 데이터의 상태를 변경하는 부분과 데이터를 조회하는 부분을 분리하는 방법

 



 

 

모든 사이드 이펙트가 나쁜 것은 아니다. 실제 애플리케이션에서는 사이드 이펙트가 불가피한 경우가 많다. 예를 들어, 데이터베이스 업데이트, 파일 쓰기, 사용자 인터페이스 업데이트 등은 본질적으로 사이드 이펙트가 필요한 작업이다. 이러한 작업에서는 사이드 이펙트가 발생하는 것을 명확히 하고, 사이드 이펙트를 최소화하거나 관리 가능한 범위 내로 제한하는 것이 중요하다.

다시 정리하자면, 사이드 이펙트는 함수나 메서드가 외부 상태에 영향을 미치는 모든 동작을 의미하며, 프로그램의 예측 가능성을 낮추고 디버깅을 어렵게 만들 수 있다. 따라서 사이드 이펙트를 최소화하고 순수 함수 사용, 불변성 유지, 의존성 주입 등을 통해 관리하는 것이 중요하다. 실제 애플리케이션에서는 사이드 이펙트가 불가피한 경우가 있으므로, 이러한 경우에는 사이드 이펙트를 명확하게 관리하는 것이 관건이다.

'프레임워크 > 웹 상식' 카테고리의 다른 글

정적 콘텐츠와 동적 콘텐츠  (3) 2024.10.01
썸머타임과 타임존 계산  (1) 2024.08.28
유지보수 vs 최적화  (0) 2024.08.22
도커(docker)란?  (0) 2024.06.25
웹 기본지식  (1) 2024.06.20