이전 글에 이어서 미니 프로젝트를 완성해보도록 하겠습니다.

sun cloud

목차

미니 프로젝트(은행 계좌 프로젝트)

sun cloud


기능 구현

image


남은 기능들을 구현해보도록 하겠습니다.

3. 입금

예외 상황을 먼저 파악해보겠습니다.

  • 입금액이 0원을 넘지 않는다면 -> InsufficientMoneyException을 발생시키고 전파합니다.
  • 계좌번호가 존재하지 않으면 -> AccountNotFoundException을 발생시키고 전파합니다.
  • 패스워드가 일치하지 않으면 -> InvalidPasswordException을 발생시키고 전파합니다.
  • 위 사항들을 모두 지킬 경우에만 입금 처리를 합니다.

앞에서 두 개의 기능들을 먼저 만들어봤기 때문에 비교적 수월하게 진행할 수 있었습니다.

마찬가지로 먼저 sql에서 테스트를 해봅니다. 입금이라는 기능이 결국 balance를 더해주는 기능이기 때문에 UPDATE를 사용하면 됩니다.

메서드 작성을 할 때에는 역시 예외 상황을 먼저 생각해보고 다른 작업을 진행하기 전에 예외 상황이 발생할 수 있다면 먼저 처리해주도록 합니다.

예외 처리에서 한 가지 생각해 볼 만한 점은 계좌번호 존재 유무와 비밀번호 일치 여부를 확인하는 부분을 어떻게 처리할 지에 대한 부분입니다.
사실 전에 사용했던 잔액 조회 코드를 재활용해도 계좌번호 존재 유무와 비밀번호 일치 여부 확인은 가능합니다. 그렇지만 이 경우 불필요한 코드를 사용하게 되고 예기치 못한 에러가 발생할 가능성이 생깁니다.

그래서 이 기능을 구현하는 메서드를 따로 떼어내서 만들면 기능적인 측면에서 보다 최적화된다고 보실 수 있습니다. 비록 개발자의 입장에서는 일을 더 하게 되지만 이렇게 꼼꼼한 습관을 길러야 오히려 나중에 일을 덜 할 수 있게 될 거라고 생각합니다.
아래의 checkAccountNoAndPassword() 메서드를 따로 만들어줍니다.

carbon


이렇게 예외 처리를 하고 난 뒤에 테스트해본 sql문을 사용해서 코드를 작성해줍니다.

carbon

그리고 예전 sql문을 배울 때 연산 처리가 가능하다는 점을 가볍게 훑고 넘어갔는데, 여기서 +연산자를 사용하면 간단하게 코드를 작성할 수 있습니다.(11번 라인)


4. 출금

입금 기능과 비슷한 출금 기능입니다. 다른 점은 balance 정보를 이용해서 출금액보다 잔액이 적을 경우 exception을 발생시키고 전파해야 하는 부분입니다. 이 부분에 유의해서 진행해보도록 하겠습니다.

carbon

입금 메서드와 마찬가지로 money가 0원을 초과하도록 예외 처리를 합니다.
그 뒤에는 약간 달라지는데, 입금 메서드에서는 balance정보를 굳이 사용할 필요가 없었기에 새로운 메서드를 작성했지만 출금 메서드는 balance 정보가 필요하므로 전에 작성해둔 계좌 조회 기능인 findBalanceByAccountNo()메서드를 호출해서 사용합니다.
이 부분만 유의해서 balance에 조회 메서드를 호출한 결과값을 할당하고 이를 이용해서 예외 처리를 진행한다면 뒤에는 입금 메서드와 마찬가지로 코드를 작성해주시면 됩니다.


5. 계좌 존재 유무 확인

계좌번호의 존재 유무를 판단해서 true, false를 반환하는 메서드입니다.
갑자기 계좌 존재 유무를 왜 확인하냐면 다음에 만들 계좌 이체 메서드에서 수취인의 계좌 번호를 확인하게 될 때 필요해서 만드는 메서드입니다.

아래와 같이 boolean타입으로 해당 계좌번호와 일치하는 계좌번호가 존재하면 true 존재하지 않으면 false를 반환하도록 코드를 작성합니다.

carbon

크게 어려운 부분은 없고, 12번 라인을 보시면 결과값이 존재하는 경우 행을 조회하고자 rs.next()를 사용합니다. 결과값이 존재하고 또 rs.getInt()로 첫번째 컬럼의 값을 조회한 결과가 1(true)라면 result에도 true를 할당하도록 합니다.
둘 중 하나라도 false인 경우 result의 초기값을 false로 할당해줬기 때문에 그대로 try블록을 나와서 finally블록의 closeAll()을 실행하고 false값 그대로 result를 반환해주게 됩니다.


6. 계좌 이체

이제 가장 핵심 기능이 되는 계좌 이체 기능을 살펴보겠습니다.

계좌 이체를 하기 위해서는 지금까지 작성한 코드들을 종합해서 사용해보고, 출금이나 입금 하나의 작업만 처리되어서는 안되기 때문에 트랜잭션 처리 또한 함께 해주어야 합니다.

  • 이체액이 0원 초과인지를 확인
  • 수금자 계좌번호 확인
  • 송금자 계좌번호와 비밀번호 확인
  • 송금자 계좌잔액을 확인(이체액보다 잔액이 작으면 예외 발생, 전파)

위의 예외 상황들을 처리해야 합니다.

혼자서 진행할 때 애를 먹었던 부분은 인자값에 변수 이름을 잘못 넣어서 생긴 에러였습니다. 이체를 하는 과정에서 출금을 할 때 송금인의 계좌번호와 비밀번호, 이체액을 입력해야 하는데 계좌번호를 두 번 연달아 쓰고는 비밀번호가 잘못되었다는 에러를 보고도 Password가 입력되지 않았다는 것을 못 알아차려서 한참을 헤맸고 다시 찬찬히 살펴본 결과 찾아낼 수 있었습니다.

이 부분을 제외하고도 사실 기능 구현에는 성공했지만 바람직한 코드를 작성하지는 못했습니다.Transaction 처리를 하는데 편의를 위해 출금 메서드를 호출해서 재사용을 했는데, 이게 Connection 내부에서 메서드가 호출되면 다시 메서드 안에서 Connection이 새로 생성되기 때문에 바람직한 코드가 아니라고 합니다.
커넥션 또한 자원이기 때문에 효율적인 사용이 아닐 뿐더러 트랜잭션의 목적에 충실하기 위해서는 하나의 커넥션으로만 작동하도록 하는 것이 코드의 무결성에 더욱 유리하다고 합니다.

carbon


7. 보유 잔액이 가장 높은 계좌 정보 조회(서브쿼리 연습)

마지막 기능입니다. 이 기능은 서브쿼리 연습을 위한 용도로 보유 잔액이 가장 높은 계좌의 정보를 조회하는 메서드입니다.

서브쿼리를 연습하는 목적이기 때문에 sql 작성에 유의해서 진행을 하면 큰 문제는 없을 것 같습니다.

carbon

(참고: 13~14번 라인. get.String()을 사용할 때 인자값으로 column index값 뿐만 아니라 colomn명도 사용할 수 있습니다.)


전체 코드는 아래의 링크를 참조하시길 바랍니다.

깃허브 링크

Database 카테고리 내 다른 글 보러가기

댓글남기기