설계 면접 문제 09 · 3부 동시에 들어올 때

동시 수정 덮어쓰기 면접 질문: 나중 저장이 앞의 수정을 지울 때 (Lost Update)

시스템 디자인 Vol.1 · 09장 「나중에 누른 저장이 앞의 수정을 지울 때」에서

이런 화면입니다

관리자 두 명이 같은 상품 설명을 각자 고치고 있습니다. 한 명이 오타를 고쳐 저장하고, 몇 분 뒤 다른 한 명이 문단을 다듬어 저장합니다. 그런데 먼저 고친 오타가 다시 살아나 있습니다.

둘 다 정상 요청이고 에러도 없습니다. 사라진 수정만 있습니다. 로그를 봐도 이상한 줄이 하나도 없어서 오래 못 찾는 사고입니다.

면접관이 이렇게 묻습니다

면접관

운영자 둘이 같은 상품 페이지를 열어 각자 고치고 저장했습니다. 먼저 저장한 사람의 수정이 사라집니다. 어떻게 막으시겠어요?

범위부터 좁힙니다

얼마나 자주 벌어지는지부터 묻습니다. 운영자가 다섯 명이고 상품이 수천 개입니다. 벌어지면 데이터가 조용히 사라집니다.

그다음 한 줄로 좁힙니다. 먼저 저장한 사람의 수정이 말없이 사라지지 않게 한다. 누구의 수정이 이길지 정하는 정책은 그다음입니다.

이 문제의 무게

각자 화면을 열어 둔 사이 벌어지는 덮어쓰기를 어떻게 막을지가 핵심 질문입니다.

가장 많이 나오는 답

화면이 보낸 내용을 그대로 UPDATE합니다.

UPDATE products
SET    description = :desc, price = :price
WHERE  id = :id;

혼자 쓰는 관리 화면에서는 아무 문제가 없습니다.

그런데 여기서 깨집니다

나중에 누른 저장이 화면을 열던 시점의 내용 전체를 들고 와서 앞의 수정을 조용히 덮습니다. 데이터베이스 입장에서는 정상적인 UPDATE 두 번일 뿐입니다.

그렇다고 화면을 여는 순간부터 저장할 때까지 행을 잠글 수도 없습니다. 운영자가 화면을 열어 둔 채 4분 동안 다른 일을 하면, 그 4분 동안 다른 사람은 아무것도 못 고칩니다.

떨어지는 답은 이런 모양입니다

  • 화면을 열 때 행을 잠그겠다고 답합니다.
  • 마지막 저장이 이기면 된다고 넘깁니다.
  • 조회한 뒤 코드에서 if로 비교합니다. 비교와 저장 사이에 또 틈이 생깁니다.

면접관은 여기서 멈추지 않습니다

  1. 저장이 막혔을 때 사용자에게 무엇을 보여 주나요?

    막는 것에서 끝내지 않고 사용자가 다음에 할 일을 설계하는지 봅니다.

  2. 그럼 쿠폰이나 재고에는 왜 이 방식을 안 쓰나요?

    이 문제의 방법을 쿠폰이나 재고에 그대로 쓰지 않는 이유를 설명하는지 봅니다.

VOL.1 · 09장

이 다음 판단은 책에서 이어집니다

책은 이 덮어쓰기를 어떻게 막을지 정한 뒤, 실제 요청이 흐르는 순서와 이미 쓰고 있는 프레임워크 안에 이 장치가 어떻게 들어 있는지까지 보여 줍니다.

09장에서 이어지는 것

  • 앞선 수정이 지워지는 일을 다루는 방법
  • 실제 요청이 흐르는 순서
  • 이미 쓰고 있는 프레임워크 안의 같은 장치
  • 넣지 말아야 할 데이터
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기