숏컷 코드
원본 값 변경
-> dirty = true
-> 필요할 때만 다시 계산
-> 계산 후 dirty = false문법과 예시
더티 플래그는 "매번 계산"과 "즉시 계산" 사이의 중간 선택이다
파생 값이란 원본 데이터에서 다시 계산할 수 있는 값입니다. 장비 총합 스탯, 월드 변환 행렬, 정렬된 UI 리스트, 미니맵 아이콘 배치가 대표적입니다. 이 값을 매번 다시 계산하면 낭비가 생기고, 원본 값이 바뀔 때마다 즉시 계산하면 변화가 잦은 구간에서 비용이 커집니다. 더티 플래그는 "필요해질 때 한 번만 다시 계산"하기 위한 패턴입니다.
핵심은 원본 변경 지점과 읽기 지점을 분리하는 것이다
원본 데이터가 바뀌는 곳에서는 dirty = true만 하고, 실제 계산은 값이 필요한 시점에 수행합니다. 이때 어떤 값이 원본이고 어떤 값이 파생 값인지 구분이 안 되면 더티 플래그가 금방 무너집니다.
equipment changed
-> statsDirty = true
UI가 총 공격력 필요
-> dirty면 RebuildStats()
-> 캐시 값 반환Unity에서는 Transform, UI, ScriptableObject 기반 표시값에 잘 맞는다
Transform 계층, 인벤토리 총합 수치, 퀘스트 패널 정렬 결과처럼 "변화는 가끔, 조회는 자주"인 경우에 특히 유리합니다. 반대로 값이 거의 안 읽히거나 계산 비용이 아주 작다면 더티 플래그보다 단순 재계산이 더 읽기 쉽습니다.
실패는 dirty를 켜는 곳보다 끄는 시점에서 자주 난다
원본 값이 바뀌었는데 dirty를 안 켜면 오래된 값을 쓰게 됩니다. 반대로 재계산 뒤 dirty를 안 끄면 매번 다시 계산하는 꼴이 됩니다. 그래서 더티 플래그는 "누가 원본을 바꾸는가"와 "누가 캐시를 재생성하는가"를 한 카드처럼 같이 봐야 합니다.
dirty flag가 맞는 순간은 "조회 빈도"가 "변경 빈도"보다 높을 때다
변경이 훨씬 잦고 조회는 드문 값이라면 즉시 계산이나 단순 재계산이 더 나을 수 있습니다. 더티 플래그는 캐시를 위한 패턴이라서, 실제로는 조회가 반복되는 값일수록 이점이 커집니다.
더티 플래그를 고를 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 원본 변경은 가끔, 조회는 자주일 때 | dirty flag + 캐시 |
| 계산 비용이 크고 조회가 반복될 때 | dirty flag 후보 |
| 계산 비용이 매우 작고 코드 단순성이 중요할 때 | 매번 재계산 |
| 원본과 파생 값 경계가 불분명할 때 | 먼저 데이터 구조 정리 |
| 변경 지점이 많아 dirty 누락 위험이 클 때 | 중앙 갱신 경로 또는 이벤트 기반 갱신 |
특이 케이스와 주의할 점
흔한 실패는 "성능 최적화"라는 이름으로 모든 파생 값에 더티 플래그를 붙이는 것입니다. 조회가 드물거나 계산이 싼 값까지 캐시하면 코드만 복잡해지고, 오래된 값 버그만 늘어날 수 있습니다.
실패 예시
- 작은 문자열 표시값까지 전부 dirty flag로 관리
결과
- 캐시 무효화 코드만 늘어남
- 실제 성능 이득은 거의 없음참고 링크
1 sources