더북(TheBook)

4.2.1 스레드에 안전한 방식으로 데이터를 수정하기

먼저 알아야 할 것은 비동기식 웹 서버를 운영할 때는 요청 수천 개(또는 그 이상)가 동시에 들어올 수 있고, 각 요청에서 저마다 데이터를 읽고 쓰려 한다는 것이다. 지금은 애플리케이션의 상태를 제공하는 단일한 데이터 구조가 있다. 이때 요청 두 개 이상이 동일한 구조에 쓰거나 읽으려 한다면 어떻게 될까?

우리는 저장소에 대한 접근 권한을 각 요청에 개별적으로 부여하여 Store에서 이전 요청의 읽기나 쓰기가 완료될 때까지 기다리라고 알려야 한다. 프로세스 두 개 이상이 동일한 데이터 구조를 업데이트한다고 하자. 이때 한 번에 한 프로세스만 데이터를 변경할 수 있도록 다른 프로세스를 대기 목록에 올려야 한다.

또한, 3장에서 러스트가 소유권에 대한 고유한 관점을 가지고 있다는 것을 배웠다. 러스트에서는 한 인스턴스 또는 프로세스만 특정 변수나 객체에 대한 소유권을 가질 수 있다. 이는 경합 상태나 더 이상 존재하지 않는 데이터를 참조하는 널 포인터에 의한 문제를 방지하기 위한 것이다. 그런데 Store의 소유권을 다음 요청으로 전달하려면 요청 하나가 완료될 때까지 기다려야 하는 것 같다. 이는 비동기식 사고 방식과는 완전히 반대되는 것이다.

지금 우리는 두 가지 문제에 직면해 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.