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

은행 계좌

보통

소개

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

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

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

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

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

지침

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

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

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

Note

Python은 전역 인터프리터 잠금 때문에 "진정한" 동시성을 지원하지 않아요. Python의 free-threading 지원을 만들기 위한 작업이 진행 중이지만, 아직 실험적인 단계예요. multiprocessing과 threading 같은 현재의 표준 라이브러리 해법은 현행 트랙 도구로 구현하기 어려워요.

그래서 이 연습 문제에서는 동시성 요구 사항을 잠시 내려놓았어요. 계좌 연산은 단일 스레드에서 순차적으로 실행되고, 동시성이나 "경쟁 상태" 테스트는 실행되지 않아요.

free-threading이나 동시성 테스트를 실험해 보고 싶다면 로컬에서 진행하는 걸 권해요. 연습 문제를 로컬로 내려받아 작업하는 데 도움이 필요하면 Exercism CLI를 추천해요.


예외 메시지

때로는 예외를 발생시켜야 할 때가 있어요. 그럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 함께 넣어야 해요. 그러면 코드를 읽기 쉬워지고 디버깅에도 큰 도움이 돼요. 오류의 원인이 특정 유형일 것이라고 알고 있는 상황이라면 내장 오류 유형 중 하나를 발생시켜도 되지만, 이때도 의미 있는 메시지를 함께 넣어야 해요.

이 연습 문제에서는 계좌가 열려 있거나 열려 있지 않은 경우, 또는 출금/입금 금액이 올바르지 않은 경우에 ValueError를 "던지기" 위해 raise 문을 사용해야 해요. 테스트는 exception을 raise하면서 메시지도 함께 넣어야만 통과해요.

메시지와 함께 ValueError를 발생시키려면, 메시지를 exception 유형의 인자로 적어요:

# account is not open
raise ValueError('account not open')

# account is already open
raise ValueError('account already open')

# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')

# withdrawal is too big
raise ValueError('amount must be less than balance')
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

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

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