불변
불변은 한 번 생성된 데이터나 객체의 상태가 변경되지 않는 특성을 의미한다.
IT, 특히 프로그래밍, 인프라, 데이터 처리 등 다양한 분야에서 사용되며,
안정성, 예측 가능성, 멀티스레드 환경에서의 안전성 확보 등으로 인해 중요하게 여겨진다.
또한, 인프라에서는 불변 인프라스트럭처(Immutable Infrastructure) 개념으로도 활용된다.
주요 특징
- 값 변경 불가: 객체나 변수는 생성 후 내부 값을 변경할 수 없음.
- 새로운 인스턴스 생성: 값을 바꾸는 대신 수정된 내용을 담은 새 객체를 반환.
- 참조 안정성: 동일 객체에 대한 외부 영향 없이 안전하게 사용 가능.
- 디버깅 용이: 상태 변화가 없기 때문에 예측 가능성이 높음.
- 병렬 처리 안정성: 멀티스레드 환경에서도 동시 접근에 안전함.
장점
- 버그 감소: 상태 변화로 인한 사이드 이펙트 방지.
- 테스트 용이성: 결과가 일정하므로 테스트가 단순해짐.
- 스레드 안전성 확보: 공유 자원 접근 시 동기화 필요 없이 안전함.
- 명확한 상태 관리: 변경 없이 상태 이력을 추적하기 쉬움.
- 재현 가능성: 동일 입력 시 동일 결과 보장.
관련 용어
- Immutable Object: 값이 변경되지 않는 객체 (예: Java의 String, Python의 tuple).
- Functional Programming: 상태 변경을 지양하고 불변성을 중시하는 프로그래밍 패러다임.
- Immutable Infrastructure: 서버나 시스템을 수정하는 대신 새 인스턴스를 배포하는 방식.
- Side Effect: 함수 외부 상태를 변경하는 부작용. 불변성은 이를 줄여줌.
- Pure Function: 동일 입력에 항상 동일한 결과를 반환하고, 외부 상태를 변경하지 않는 함수.
- Snapshot / Versioning: 변경 불가능한 데이터 상태를 보존하고 필요시 복원하는 기법.
주요 솔루션 및 사용 사례
- 주요 솔루션
- Redux: 상태를 불변 객체로 관리하는 프론트엔드 상태 관리 라이브러리.
- Terraform: 변경 불가능한 인프라를 코드로 정의하고 재배포.
- Docker 이미지: 생성 후 변경하지 않고 새로운 버전으로 교체.
- Git: 커밋은 불변이며, 이력을 그대로 보존.
- Immutable.js: JavaScript에서 불변 자료구조를 지원하는 라이브러리.
- 사용 사례
- 프론트엔드 상태 관리: 불변 데이터를 활용해 예측 가능한 UI 상태 유지.
- 함수형 프로그래밍: 데이터 변경 대신 새로운 데이터 생성으로 로직 구성.
- 클라우드 인프라 배포: 기존 서버 수정 없이 새 이미지로 전체 재배포.
- 버전 관리 시스템: 커밋 및 이력 보존을 통한 안정성 확보.
- 멀티스레드 환경 프로그래밍: 상태 충돌 없이 안전한 동시 접근 보장.