brunch

기획자도 동시성 문제에 대해 알아야 한다구요?

동시성 문제가 발생할만한 부분 캐치하기

by 야타

purpose 동시성 문제가 무엇인지 비전공자도 이해할 수 있다.


동시성 문제에 대해 아시나요?


'동시성'이라는 단어는 보통 프로그래밍 단어로 자주 쓰입니다. 비전공자의 입장에서 친근하지 않은 단어죠. 그런데 어느날 개발을 하다가 동시성 문제는 개발자만의 문제가 아닌 것 같다는 생각이 들었습니다.


동시성 문제는 개발자 뿐만 아니라 기획자, 기획자 뿐만 아니라 PM, CEO 등 제품을 만드는 사람들이 모두 인지하고 있어야 할 문제 같았습니다. 더 안정적이고 좋은 품질의 제품을 만들기 위해서요. 그러나 동시성 문제를 검색해 보았을 때 기획자를 위한 글은 찾을 수 없었습니다.


동시성 문제는 어디에서나 발생할 수 있습니다. 오늘은 동시성 문제를 쉽게 이해해보려고 합니다. 사실 이해라는 말은 너무 거추장스럽습니다. 오늘은 우리 주위에 있는 동시성 문제를 인지하는 것이 목표입니다.


평소에 동시성에 대해 궁금하셨던 분들, 심심하신 분들, 개발자들이 무엇을 고려하는지 알고 싶으신 분들에게 추천합니다.




동시성 문제란?

동시성에 대해 검색해보면 멀티 스레드, 병렬성, 프로세스 등 이상한 단어들이 많이 나옵니다. 우리는 알 필요 없는 단어들입니다.


동시성 문제란 '여러 스레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제' 라고 많은 곳에서 이야기 하고 있는데요.

쉽게 정리하자면, 한정되어있는 물건(자원)을 동시에 건드려서 일어나는 문제라고 정리할 수 있습니다.


마트 세일에서 사과가 단 하나 남았습니다. 호랑이랑 다람쥐가 마지막 남은 사과를 아주 우연히도 동시에 집었어요. 그럼 어떻게 될까요? 만약 누가 먼저인지 가려줄 사람이 없다면요? 그럼 아주 치열한 사투가 벌어질겁니다. 아니면 둘의 힘싸움으로 인해 사과가 반으로 쪼개질 수도 있죠.


현실에서 일어날 수 있는 문제를 예시로 볼까요? 한 번 상상하며 이야기를 따라가주세요.

우리 나라의 호텔 A에는 두 명의 관리인이 있습니다. 두 관리인의 데스크는 멀리 떨어져있어서 소통이 불가능해요. 그리고 호텔 예약 관리는 D 데스크에서 이루어집니다.

어느날 손님 두 분이 각각 B 관리인과 C 관리인을 찾아왔습니다. 그리고 물었습니다. "최고로 좋다고 말하는 바다뷰의 S룸 남아있나요?"


B 관리인은 D 데스크로 가서 S룸에 대한 확인을 하고 돌아옵니다. 다행히 남아있어요. C 관리인도 몇 초 뒤 데스크에 S룸 확인을 다녀옵니다. 아직도 S룸은 남아있죠. 예약한 사람이 없으니까요.

돌아온 두 관리인은 손님에게 말합니다. "네! 남아있어요. 예약 도와드릴까요?"


두 손님은 아주 기쁜 얼굴로 끄덕입니다. 하지만 결과는 어떻게 될까요? 두 손님이 S룸에 예약이 되는 상황이 발생하게 됩니다. 두 손님은 S룸 문 앞에서 마주치게 될 수도 있습니다. 이게 바로 동시성 문제입니다. S룸은 한정되어 있는데, 두 호텔 관리인이 예약하는 작업을 동시에 하다보니 문제가 발생한 것이죠.

스크린샷 2025-02-02 오전 12.38.59.png 숫자 순서대로 상황이 일어난다고 상상해보세요.


티켓을 예매할 때도, 상품을 구매할 때도, 은행에서 돈을 출금할 때도 동시성 문제는 일어날 수 있습니다. 그렇기때문에 우리가 동시성 문제를 경계하고, 인지해야 하는 것입니다.


조금 더 딥하게 들어가볼까요? 실제 코드를 예시로 확인해 볼 거예요. 궁금하지 않으신 분들은 넘어가셔도 좋아요. 동시성을 인지한다는 우리의 목적은 이미 달성했거든요.

그런데 궁금하실걸요? 왜 서버에서 동시성 문제가 발생하죠? 서버는 하나인데 그냥 오는 요청을 순.서.대.로. 처리하면 되는 거 아닌가요?


서버에서는 왜 동시성 문제가 발생할까?

물론 A요청을 완료하고 B요청을 처리한다면 동시성 문제가 발생하지 않습니다. 하지만 서버는 그렇게 요청을 순차적으로 처리하지 않기 때문에 동시성 문제가 발생합니다.

예를 들어 "브런치 글을 읽어와줘!"라는 요청이 있다고 생각해 봅시다. 서버가 요청들을 순차적으로 처리한다면 글 하나 읽는데도 아주 오랜 시간을 기다려야 할 것 같지 않나요? 이런 불상사를 방지하기 위해 서버는 여러 요청을 동시에 처리합니다.


```

티켓_예매_요청() {

티켓_예매_가능_여부();

티켓_예매();

}

```


이번에는 티켓 예매를 예시로 들어보겠습니다. 우리가 티켓을 예매하겠다고 버튼을 누르는 순간 서버는 이런 동작을 수행합니다. 우선 티켓예매 가능 여부를 파악 하고 (이를 유효성 검사라고 합니다.) 만약 존재하고 사용 가능한 티켓이라면 티켓 예매를 하게 됩니다. 그런데 요청 두 개가 거의 동시에 왔을 경우는 어떻게 될까요?

스크린샷 2025-02-01 오후 5.31.55.png


위의 호텔 예시랑 똑같은 상황이 발생합니다. 결국 요청은 각자 일어나는데, 같은 자원(티켓)을 공유하기때문에 발생하는 문제가 발생합니다.

그래서 같은 자원에 동시에 접근하는 것을 막아 동시성 문제가 발생하지 않도록 하기도 합니다.


마무리하며

동시성 문제를 고려하지 않게 되면 여러 가지 문제가 발생할 수 있습니다.

읽으시면서 아 이런것들이 동시성 문제였구나, 이런 상황에서 동시성 문제를 생각할 수 있겠구나라는 생각이 드셨다면 오늘 글은 성공이라고 생각합니다.


오늘 글이 조금이나마 도움이 되었으면 좋겠습니다. 피드백이나 의견은 항상 감사히 받고 있으니 편하게 댓글 남겨주세요. 감사합니다.

keyword
작가의 이전글질척 질척 쿠팡 멤버십 해지 절차는 어떻게 될까?