앞서 계좌 개설 기능을 구현했습니다. 이제 생성한 계좌를 읽을 수 있도록 기능을 구현해보겠습니다.
메서드명은 fetchAccount 입니다
그래서 먼저 AccountService 인터페이스와 구현 클래스 부분을 수정해보겠습니다.
AccountService 인터페이스에 fetchAccount 메서드를 추가하고 (=추상 메서드)
/**
*
* @param mobileNumber - Input Mobile Number
* @return Accounts Details based on a given mobileNumber
*/
CustomerDto fetchAccount(String mobileNumber);
AccountServiceImpl 클래스 내 아래와 같이 fetchAccount 라는 메서드를 추가합니다.
/**
* @param mobileNumber - Input Mobile Number
* @return Accounts Details based on a given mobileNumber
*/
@Override
public CustomerDto fetchAccount(String mobileNumber) {
return null;
}
이제 fetchAccount의 실제 로직을 구성하면 됩니다.
fetchAccount 메서드는 입력값인 mobileNumber를 가지고 데이터베이스로부터 mobileNumber와 일치하는 Account 정보를 가져옵니다.
정상적으로 가져오면 해당 Account 정보를 반환합니다. 하지만 없을 경우엔 어떻게 해야할까요?
이럴 경우, 앞서 작성한 예외 기능을 활용해 강제로 예외를 발생시키면 좋을거 같습니다.
리소스가 없을 경우 발생하는 예외를 직접 생성해보겠습니다.
기존 exception 패키지에 ResourceNotFoundException 클래스를 새롭게 생성하고 아래와 같이 예외 처리 로직을 작성합니다.
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String resourceName, String fieldName, String fieldValue) {
super(String.format("%s not found with the given input data %s : '%s'", resourceName, fieldName, fieldValue));
}
}
그 다음 스프링의 전역 예외 처리 기능을 활용해 ResourceNotFoundException 를 처리하는 전역 처리 코드를 작성해보겠습니다.
GlobalExceptionHandler 클래스 내에 아래 코드를 추가합니다.
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponseDto> handleResourceNotFoundException(ResourceNotFoundException exception,
WebRequest webRequest) {
ErrorResponseDto errorResponseDTO = new ErrorResponseDto(
webRequest.getDescription(false),
HttpStatus.NOT_FOUND,
exception.getMessage(),
LocalDateTime.now()
);
return new ResponseEntity<>(errorResponseDTO, HttpStatus.NOT_FOUND);
}
다시 서비스 클래스로 돌아와 예외처리 코드를 포함한 로직을 작성해봅니다.
@Override
public CustomerDto fetchAccount(String mobileNumber) {
Customer customer = customerRepository.findByMobileNumber(mobileNumber).orElseThrow(
() -> new ResourceNotFoundException("Customer", "mobileNumber", mobileNumber)
);
Account account = accountRepository.findByCustomerId(customer.getCustomerId()).orElseThrow(
() -> new ResourceNotFoundException("Account", "customerId", customer.getCustomerId().toString())
);
CustomerDto customerDto = CustomerMapper.mapToCustomerDto(customer, new CustomerDto());
customerDto.setAccountsDto(AccountMapper.mapToAccountsDto(account, new AccountDto()));
return customerDto;
}
위 코드는 mobileNumber를 통해 customerRepository에서 고객정보를 가져오고 만약 고객 정보가 없을 경우 ResourceNotFoundException 예외 클래스를 발생시킵니다. 고객 정보가 있으면 해당 고객의 id로 계좌를 가져옵니다. 마찬가지로 해당 계좌 정보가 없을 경우 ResourceNotFoundException 예외를 발생시킵니다.
모두 정상적으로 객체를 가져올 경우 매퍼로 변환해 응답할 객체로 변환 후 응답합니다.
마지막으로 컨트롤러 단에 클라이언트의 요청을 응답할 처리 메서드를 아래와 같이 추가합니다.
@GetMapping("/fetch")
public ResponseEntity<CustomerDto> fetchAccountDetails(@RequestParam
String mobileNumber) {
CustomerDto customerDto = accountService.fetchAccount(mobileNumber);
return ResponseEntity.status(HttpStatus.OK).body(customerDto);
}
위 컨트롤러의 메서드는 클라이언트로부터
/fetch?mobileNumber=0101112222
이런 형식의 요청을 처리할 수 있는 메서드입니다.
코드 작성을 완료했으면 조회 기능이 정상 동작하는지 Postman으로 테스트 해봅니다.