--- kind: REFERENCE slug: beginning-a-transition-and-the-set-it-covers-are-one-operation title: 전이를 시작하는 쓰기와 그 전이가 덮는 집합은 한 연산이어야 한다 topic: non-atomic-check-then-act project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: reference:beginning-a-transition-and-the-set-it-covers-are-one-operation verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다 --- # 전이를 시작하는 쓰기와 그 전이가 덮는 집합은 한 연산이어야 한다 ## 목적 이제부터 다르게 동작한다고 선언하는 전이에서, 선언과 그 선언이 지배하는 대상의 갱신 사이에 끼어드는 쓰기를 막는다. ## 규칙 1. 전이를 두 단계로 나눴는지 본다 플래그를 세우는 쓰기와 그 플래그가 덮는 대상을 갱신하는 쓰기가 따로 있으면 해당한다. 2. 그 플래그를 읽는 가드를 전부 찾는다 가드를 통과한 뒤 쓰는 코드가 문제의 후보다. 3. 가드 통과와 쓰기 사이에 다른 스레드가 낄 수 있는지 본다 낄 수 있으면 두 단계를 하나로 합치거나 그 구간을 락으로 닫는다. 4. 전이 이후의 쓰기가 무해한지 확인한다 무해하면 두 단계로 나눠도 된다. 다만 무해함은 전이가 덮는 대상 전체에 대해 성립해야 한다. ## 적용 조건 배수, 종료, 회전, 차단처럼 상태 전이로 동작 규칙이 바뀌는 모든 자리. ## 예외 전이 이후에 도착한 쓰기가 결과를 바꾸지 않는 경우. 집합에 다시 넣어도 결과가 같은 종류의 갱신이 그렇다. 대상이 늘어나면 그 무해함을 다시 확인해야 한다. ## 예시 헬스 레지스트리의 배수 시작이 플래그를 쓰고 상태 맵을 바꾸는 두 단계다. 그 사이에 서빙 갱신이 끼면 전역 상태가 서빙으로 되돌아간다. 자격증명 회전에서 배수 완료가 자기가 읽은 값으로 상태를 다시 써서 진행 중인 회전을 되돌린다. 채널 세대 교체가 읽고 판단한 뒤 조건 없이 쓴다. ## 관계 - **원자 타입 위의 검사 후 실행과 비교 후 교체 루프** 이 규칙이 나온 구조다. - **배수를 시작한 뒤에도 한 서비스가 다시 SERVING 이 될 수 있다** 이 규칙을 만든 사례다. - **배수 완료가 자기가 읽은 값으로 상태를 다시 써서 진행 중인 자격증명 회전을 되돌린다** 같은 규칙을 어긴 다른 리프의 사례다.