트랙
/
Go
Go
/
연습 문제
/
은행 계좌
은행 계좌

은행 계좌

보통

소개

몇 년 동안 서류를 작성하고 기다린 끝에, 마침내 은행업 허가를 받았어요. 이제 공식적으로 자신만의 은행을 세울 자격이 생긴 거예요. 만세!

가장 먼저 할 일은 IT 시스템을 돌아가게 만드는 거예요. 하루 동안 열심히 일한 끝에, 이제 계좌를 열고 닫을 수 있고, 출금과 입금도 처리할 수 있어요.

테스트를 작성하기는 귀찮았던 터라, 친구 몇 명을 불러 시스템 테스트를 도와달라고 해요. 그런데 겨우 5분 만에 친구 한 명이 돈을 잃었다고 하네요! 작성한 Code에는 Bug가 없다고 확신하지만, 그래도 조사해 보려고 로그를 뒤져 보기 시작해요.

아, 역시나 예상대로 친구 잘못이었어요! 친구는 자신의 테스트 계정 정보를 다른 친구에게 공유했고, 둘은 짜고 같은 계좌에서 동시에 입금과 출금을 했던 거예요. 누가 이런 짓을 하겠어요?

누군가 자기 계좌에 동시에 접근하는 건 물리적으로 _불가능_하다고 따지지만, 친구는 은행 규정상 이걸 반드시 지원해야 한다고 능글맞게 알려 줘요. 그래서 동시 접근 지원이 없으면 서비스 오픈 신호도 없어요. 한숨을 쉬며, 내일 이걸 처리해야겠다고 머릿속에 메모해 둬요. 이러면 출시일이 최소한 하루는 더 밀리겠지만, 뭐...

지침

이번 과제에서는 계좌 개설과 해지, 출금, 입금을 지원하는 은행 계좌를 구현해요.

은행 계좌에는 인터넷, 휴대폰, 자동 결제 등 다양한 방식으로 접근할 수 있기 때문에, 은행 소프트웨어는 여러 스레드나 프로세스(용어는 사용하는 프로그래밍 언어에 따라 달라요)에서 계좌에 동시에 안전하게 접근할 수 있어야 해요. 예를 들어 입금과 출금이 동시에 여러 번 일어날 수 있는데, 잔액을 읽는 시점과 새 잔액을 설정하는 시점 사이에 경쟁 상태가 생기지 않도록 해야 해요.

계좌를 해지할 수 있어야 하고, 해지된 계좌에 대한 작업은 실패해야 해요.

테스트

테스트는 몇몇 연산을 동시에 실행해요. Account에 수행하는 연산은 계좌를 일관된 상태로 유지해야 해요. 예를 들어, 여러 고루틴이 동시에 입금하고 출금할 수 있는데, 두 번의 출금이 동시에 일어나더라도 잔액이 음수가 되어서는 안 돼요.

로컬에서 작업할 때 코드가 동시성을 제대로 처리하고 데이터 레이스를 일으키지 않는지 확인하려면 -race 플래그를 켜고 테스트를 실행해요.

cd exercism/project/directory/go/bank-account
go test -race

참고 자료

Go에서 동시성 연산이 처음이라면 sync 패키지, 특히 뮤텍스를 살펴볼 만해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Go Exercism

은행 계좌 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.