글로벌한 상태 관리

상태에 대한 저장을 어떻게 하는 게 좋을까. 개발하다가 흔하게 아래와 같은 코드를 볼 수 있다.

SomeSingleton.Instance.CurrentState = SomeState.State1;

이 글로벌한 전역 변수에 상태가 바뀔 때 마다 저장을 하고 그 저장된 상태 정보를 조회하여 많은 로직들이 실행된다. 저 상태를 바꾸는 곳은 처음에는 한 지점이었겠지만 개발이 진행될 수록 여기저기서 상태를 바꾸기 시작한다. 그러다 보면 실제 현재 상태와 CurrentState에 저장된 상태가 맞지 않는 경우가 발생한다. 때때로 전역 변수를 사용하기는 뭔가 찔리는 개발자는 SetState라는 메서드를 만들어 그 안에서 CurrentState의 상태를 바꾸기도 한다. 그러나 여기저기서 SetState를 호출하는 것은 동일하기 때문에 이전과 별반 차이가 없다. 바쁘고 빠르게 개발을 해야 하는 현실이지만 그래도 저렇게 글로벌한 상태 관리는 나중에 더 많은 시간을 소비하게 만든다.

하지만 글로벌하게 상태를 관리하는 것이 항상 나쁜 것은 아니다. 상태를 변경하는 부분이 정해져 있다면 문제될 것이 없다. 예를 들어 상태 머신을 사용하고 상태가 변경할 때 마다 글로벌한 변수를 같이 업데이트 해준다면 실제 현재 상태와 틀어질 일이 없을 것이다. 애니매이션 상태 관리를 한다고 하면, idleState => runState => walkState로 상태가 변경될 때, 이때마다 CurrentState가 업데이트 된다면 상태의 일관성을 유지할 수 있을 것이다. 요지는 상태에 대한 저장이 실제 상태가 변경되는 부분과 일관성을 유지할 수 있다면 글로벌로 변수를 유지해도 문제는 없다는 의미이다. 물론 상태 머신이 있는데 굳이 따로 전역 변수를 유지할 필요는 없다.

반드시 상태만의 문제는 아니다. int도 될 수 있고, bool 변수도 될 수 있다. 숫자를 카운트 한다던지 어떤 곳의 입장 여부를 관리한다던지 모두 마찬가지이다. 여기저기에서 카운트를 올리고 내리고, true와 false가 여기저기서 바뀌는 로직은 관리하기가 어렵다. 글로벌하게 관리하기 보다는 그러한 목적의 클래스 또는 컴포넌트를 만들어 관리하도록 하여야 한다. 그것이 처음에는 귀찮고 사소해 보일지라도 간과해서는 안될 것이다.


Leave a Reply

Your email address will not be published. Required fields are marked *