두 캐릭터가 같은 틱에 같은 빈 칸을 예약하려 할 때 서버는 조회와 점유 확정을 어떻게 원자적으로 처리하나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
두 캐릭터가 같은 틱에 빈 셀을 읽고 각각 이동을 확정하면, 두 요청 모두 성공해 같은 셀을 점유하는 경쟁이 생깁니다. ‘비어 있는가’라는 조회와 ‘내가 예약했다’라는 변경을 분리해서 수행하면 안 되고, 서버의 권위 있는 틱 실행이나 저장소의 원자적 조건부 갱신 안에서 검사와 예약을 함께 처리해야 합니다. 예약에는 셀, 대상 틱, 소유자, 세대·만료를 기록하고 실패한 의도에는 대기·재경로·거절 정책을 적용합니다. 이 원자적 조건부 점유를 예약 선점(reservation acquisition)으로 볼 수 있습니다.
같은 틱의 결정
입력이 서버에 도착한 순서를 그대로 우선순위로 쓰면 네트워크 지연이 공정성을 결정하고 재현성이 흔들릴 수 있습니다. 캐릭터 ID·현재 틱·라운드 로빈 순서처럼 재현 가능한 우선순위를 정해 같은 틱의 의도를 정렬하고, 하나를 예약한 뒤 다음 의도가 최신 점유 스냅샷을 보게 합니다. 셀 점유만이 아니라 A와 B가 서로의 현재 셀을 동시에 바꾸는 간선 교환, 경로 중간의 교차, 큰 캐릭터의 다중 셀 점유도 규칙으로 검사합니다. 여러 셀을 예약할 때 일부만 성공하면 몸체가 겹칠 수 있으므로 전체 집합의 조건 확인과 변경을 한 원자적 단위로 묶거나 실패 시 모두 되돌립니다. 저장소를 사용한다면 cellId와 tick을 키로 두고 비어 있을 때만 삽입하는 조건부 쓰기, 또는 버전 조건부 갱신을 사용할 수 있습니다. 단순히 먼저 조회한 뒤 나중에 쓰는 방식은 조회와 쓰기 사이에 다른 예약이 들어오는 TOCTOU 경쟁을 남깁니다. 단일 공간 서버가 해당 셀의 모든 확정을 맡으면 틱 루프가 단순해지지만, 공간 경계에 걸친 이동은 두 서버가 서로 다른 결정을 내리지 않도록 셀 소유권을 한곳에 두거나 확정 순서를 조정해야 합니다.
lease와 복구
연결 종료·취소·서버 장애 뒤 예약이 영원히 남으면 유령 점유가 됩니다. 예약에 소유자 세대와 lease 만료를 넣고, 만료를 실제 서버 시각만으로 믿지 말고 복구한 권위 실행 경로에서 현재 틱·소유자 상태와 함께 재검증합니다. 소유자가 새로 재접속하면 예전 예약을 자동 승계하지 말고 새 세대와 요청 ID를 확인합니다. 낮은 우선순위 캐릭터가 계속 실패하면 aging이나 라운드 로빈으로 우선순위를 조정하되, 우선순위 변경도 틱 로그에 남겨 재현성을 유지합니다. 테스트는 동일 목적지, 교환, 연쇄 이동, 큰 캐릭터, 취소·재접속, 만료 직전 경쟁, 서버 재시작, 공간 경계 이동을 포함합니다. 중복 점유뿐 아니라 영구 대기, 오래된 예약 재사용, 부분 성공, 서버 간 이중 확정이 없는지를 확인하겠습니다. 핵심은 경로 가능성 조회가 아니라 점유 조건과 변경의 원자성(atomic occupancy transition)입니다. 원자적 예약의 성공은 이동 완료가 아닙니다.
예약 후 실제 틱에서 충돌·속도·행동 취소를 다시 확인하고 실행하지 못한 예약은 소유 세대와 함께 해제해야 합니다. 다중 셀 몸체는 전체 셀을 조건부로 잡거나 임시 준비 상태를 기록한 뒤 모든 셀 성공 후 확정해 부분 노출을 막겠습니다. 분산 공간 서버에서는 경계 이동을 별도 프로토콜로 다루고 두 서버가 각자 성공하지 않게 확정 순서를 둡니다. 예약 만료와 새 예약이 같은 틱에 발생하면 만료를 먼저 적용할지 기존 소유자의 실행을 인정할지 고정해야 합니다. 재현 로그에는 선택 우선순위와 실패 이유를 남겨 교착을 분석하겠습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 빈 셀 조회와 조건부 점유 확정을 하나의 원자적 경계로 묶는다.
- 동일 목적지·교환·다중 셀·결정적 우선순위를 설명한다.
- lease 만료·복구·공간 서버 소유권의 실패를 다룬다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 경로가 가능하면 이동 확정도 반드시 성공한다고 말한다.
- 조회 결과를 믿고 나중에 변경해 경쟁을 남긴다.
- 취소·장애·재접속 뒤 예약 정리와 부분 성공을 무시한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- NPC 예약의 기아를 줄이려 aging을 적용합니다. 우선순위 변경과 리플레이 결정성을 어떻게 함께 유지하나요?
- 큰 캐릭터의 여러 셀 예약에서 한 셀만 선점된 경우 원자적 롤백을 어떻게 구현하나요?
- 예약 lease가 만료되는 틱과 새 요청이 들어오는 틱의 경계 규칙을 어떻게 정의하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.