계좌 시스템 2편에서는 계좌 부분을 마무리 하려고 합니다.
2편에서 구현할 부분은 계좌 해지API 와 계좌 확인API 입니다 👩🏼💻
계좌 해지 API 간단 설명
URL : Delete/account
파라미터 : 사용자 아이디, 계좌 번호
성공 응답 : 사용자 아이디, 계좌번호, 해지일시
정책 : 사용자 혹은 계좌가 존재하지 않은 경우, 사용자 아이디와 계좌 소유주가 다른 경우,
계좌가 이미 해지 상태인 경우, 잔액이 있는 경우 -> 모두 실패 응답(예외 처리)
저장이 필요한 정보
요청/응답 구조
요청
{
"userId" : 1,
"initialBalance" : 100
}
응답
{
"userId" : 1,
"accountNumber" : "1234567890",
"registeredAt" : "2022-12-01T23:26:14.123121"
}
DeleteAccount 클래스
- 해당 클래스는 계좌 해지 API 에 대한 요청 & 응답 관련 클래스 입니다.
특징으로는 Request & Response 클래스를 Inner 클래스로 설정하였다는 점입니다.
계좌 해지에 대한 요청 객체는 Request 가 될 것이고, 요청 처리 후 응답 객체는
Response 가 될 것입니다.
또한 여기서 주목해야할 점은 Service Layer 에서 받아온 결과의 타입인 AccountDto 로
요청자에게 리턴하는 것이 아니라, 기존에 정한 계좌 해지 컨트롤러의 반환 타입인 Response 타입으로
번한하기 위해, 정적메소드 FromAccountDto 를 구현하였습니다.
계좌 해지 Controller
- 위에서 설명했던 것처럼, deleteAccount 컨트롤러의 요청 타입은 DeleteAccount.Request 이며,
반환 타입은 DeleteAccount.Reponse 입니다.
또한 accountService(Service Layer) 에서 처리한 결과는 1회용 결과이기에, 해당 결과를 위한
변수를 따로 두는 것이 아니라, DeleteAccount.Response.fromAccountDto 메소드를 통해
Reponse 타입으로 변환 후 한번에 리턴하였습니다.
계좌 해지 Service
- accountUserRepository에서 사용자 아이디 값으로 받은 AccountUser(사용자) 를 변수로 저장합니다.
계좌 해지 관련 서비스는 예외 상황이 4가지가 존재합니다.
가장 먼저 해당 userId 에 해당하는 AccountUser 를 검색합니다. 없다면 예외를 발생합니다.
accountNumber 에 해당하는 Account 또한 검색합니다. 없다면 마찬가지로 예외를 발생시켜야 겠죠?
4가지의 예외 상황을 한번에 코드 블록 안에 넣으면 한번에 너무 많은 기능이 들어감으로(가독성을 위해)
나머지 3가지의 예외상황을 판단하기 위해 validateDeleteAccount 메소드를 구현 했습니다.
해당 메소드에서는 사용자 아이디와 계좌 소유주가 다른 경우, 계좌가 이미 해지 상태인 경우, 잔액이 있는 경우를 판답합니다.
만약 모든 조건에 만족한다면(해지 가능하다면) 해당 계좌의 상태를 변경합니다.
그 후 Account 엔티티 클래스를 fromEntity 메소드를 통해 AccountDto 클래스 타입으로 변경 후 리턴합니다.
Controller Test
- successDeleteAccount()(계좌 해지 성공)
Service Test
- deleteAccountSuccess() (계좌 해지 성공)
- deleteAccountUserNotFound() (해당 사용자 없는 경우)
- deleteAccountNotFound() (해당 계좌 없는 경우)
- deleteAccountFailed_userUnMatch(해당 유저와 계좌 소유자 일치하지 않는 경우)
- deleteAccountFailed_BalanceNotEmpty(해당 계좌에 잔액이 있는 경우)
1) deleteAccountSuccess() (계좌 해지 성공)
2) deleteAccountUserNotFound() (해당 사용자 없는 경우)
3) deleteAccountNotFound() (해당 계좌 없는 경우)
4) deleteAccountFailed_userUnMatch(해당 유저와 계좌 소유자 일치하지 않는 경우)
5) deleteAccountFailed_BalanceNotEmpty(해당 계좌에 잔액이 있는 경우)