앞서 계좌 생성과 조회 기능을 구현했습니다. 이제 수정과 삭제 기능을 완료해 CRUD를 마무리 하도록 하겠습니다.
고객은 계정 번호를 제외한 모든 정보를 업데이트할 수 있습니다. 업데이트 API는 CustomerDto 객체를 입력으로 받아, 이 객체에 포함된 계정 정보를 데이터베이스에서 검색한 후, 해당 정보를 업데이트합니다.
구현 과정에서는 AccountService 인터페이스에 updateAccount 메서드를 추가하고, 이를 AccountServiceImpl 클래스에서 오버라이드합니다. 업데이트할 계정 정보가 데이터베이스에 존재하지 않을 경우 ResourceNotFoundException을 발생시키며, 존재할 경우 계정 정보를 업데이트하고, 결과를 반환합니다. 마지막으로 AccountController에 업데이트를 처리하는 메서드를 추가하고, 성공적인 업데이트 시 200 상태 코드를 반환합니다.
먼저, AccountService 인터페이스에 계정 업데이트를 위한 추상 메서드를 정의합니다. 이 메서드는 업데이트 작업이 성공했는지 여부를 나타내는 boolean 값을 반환하며, CustomerDto 객체를 입력으로 받습니다.
public interface IAccountService {
boolean updateAccount(CustomerDto customerDto);
}
AccountService 클래스에서 IAccountService의 updateAccount 메서드를 오버라이드하여 구현합니다.
@Override
public boolean updateAccount(CustomerDto customerDto) {
boolean isUpdated = false;
// CustomerDto에서 AccountsDto를 가져옵니다.
AccountsDto accountsDto = customerDto.getAccounts();
if (accountsDto != null) {
// AccountsDto에서 accountNumber를 가져와서 데이터베이스에서 계정 정보 조회
String accountNumber = accountsDto.getAccountNumber();
Optional<Accounts> accountsOptional = accountsRepository.findById(accountNumber);
if (accountsOptional.isPresent()) {
Accounts accounts = accountsOptional.get();
// DTO에서 엔티티로 데이터 매핑
mapper.map(accountsDto, accounts);
// 업데이트된 계정 정보 저장
accountsRepository.save(accounts);
// CustomerDto에서 customerId를 가져와서 고객 정보 조회
String customerId = customerDto.getCustomerId();
Optional<Customer> customerOptional = customerRepository.findById(customerId);
if (customerOptional.isPresent()) {
Customer customer = customerOptional.get();
// DTO에서 엔티티로 데이터 매핑
mapper.map(customerDto, customer);
// 업데이트된 고객 정보 저장
customerRepository.save(customer);
isUpdated = true;
} else {
throw new ResourceNotFoundException("Customer not found with id: " + customerId);
}
} else {
throw new ResourceNotFoundException("Account not found with number: " + accountNumber);
}
}
return isUpdated;
}
AccountsController 클래스에 새로운 엔드포인트를 추가하여 클라이언트가 CustomerDto를 이용해 계정 정보를 업데이트할 수 있도록 합니다.
@RestController
@RequestMapping("/api/accounts")
public class AccountsController {
@Autowired
private IAccountService accountService;
@PutMapping("/update")
public ResponseEntity<ResponseDto> updateAccountDetails(@RequestBody CustomerDto customerDto) {
boolean isUpdated = accountService.updateAccount(customerDto);
if (isUpdated) {
return ResponseEntity.ok(new ResponseDto("200", "Request processed successfully"));
} else {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ResponseDto("500", "An error occurred, please try again or contact dev team"));
}
}
}
코드를 빌드하고 애플리케이션을 재시작합니다. 이후, 새로 생성된 계정을 조회하고, 업데이트 API를 통해 계정 정보를 업데이트한 후, 다시 조회하여 변경된 내용이 반영되었는지 확인합니다.
계정 생성 및 조회:
// POST /api/accounts/create (예시 데이터 전송)
// GET /api/accounts/{mobileNumber} (생성된 계정 조회)
// PUT /api/accounts/update (업데이트할 정보 전송)
{
"customerId": "1",
"name": "Madan Mohan",
"email": "madan@eazybytes",
"mobileNumber": "8888888888",
"accounts": {
"accountNumber": "123456",
"accountType": "current",
"branchAddress": "124 Main Street"
}
}
업데이트된 계정 정보 조회:
GET /api/accounts/{mobileNumber} (업데이트된 계정 정보 확인)
이 과정을 통해 계정 정보 업데이트 기능이 성공적으로 구현되었는지 확인할 수 있습니다.