마지막 삭제 기능만 구현하면 계좌에 대한 CRUD가 완성됩니다.
먼저, CustomerRepository에서 findByMobileNumber 메서드를 사용하여 고객 정보를 조회합니다. 입력된 휴대폰 번호로 고객 정보를 찾고, 해당 고객이 존재하지 않으면 ResourceNotFoundException을 던집니다.
Optional<Customer> customerOptional = customerRepository.findByMobileNumber(mobileNumber);
if (!customerOptional.isPresent()) {
throw new ResourceNotFoundException("Customer not found with mobile number: " + mobileNumber);
}
Customer customer = customerOptional.get();
조회된 Customer 엔터티에서 customerId를 가져온 후, 이를 사용해 CustomerRepository와 AccountsRepository에서 데이터를 삭제합니다. 여기서 deleteById는 기본 제공 메서드이지만, deleteByCustomerId는 직접 작성해야 합니다.
// Customer 삭제
customerRepository.deleteById(customer.getCustomerId());
// Account 삭제 (customerId로 삭제)
accountsRepository.deleteByCustomerId(customer.getCustomerId());
AccountsRepository에 deleteByCustomerId 메서드를 추가합니다. 이 메서드는 customerId를 기반으로 계정을 삭제하며, @Transactional과 @Modifying 애노테이션을 사용하여 데이터베이스 변경을 트랜잭션으로 처리합니다.
@Repository
public interface AccountsRepository extends JpaRepository<Accounts, String> {
@Transactional
@Modifying
void deleteByCustomerId(String customerId);
}
@Transactional과 @Modifying 애노테이션을 추가하여 Spring Data JPA가 해당 메서드를 트랜잭션으로 처리하도록 합니다. 이로 인해 실행 중 오류가 발생하면 모든 변경 사항이 롤백됩니다.
@Transactional
@Modifying
public void deleteByCustomerId(String customerId) {
// 실제 삭제 로직은 Spring Data JPA가 생성
}
AccountsController 클래스에 삭제 API 엔드포인트를 추가합니다. 이 엔드포인트는 @DeleteMapping을 사용하여 HTTP DELETE 요청을 처리합니다. 삭제 작업이 성공하면 HTTP 200 응답을 반환하며, 실패하면 HTTP 500 오류를 반환합니다.
@RestController
@RequestMapping("/api/accounts")
public class AccountsController {
@Autowired
private IAccountService accountService;
@DeleteMapping("/delete")
public ResponseEntity<ResponseDto> deleteAccountDetails(@RequestParam String mobileNumber) {
boolean isDeleted = accountService.deleteAccount(mobileNumber);
if (isDeleted) {
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} (생성된 계정 조회)
계정 삭제:
// DELETE /api/accounts/delete?mobileNumber={mobileNumber} (계정 삭제 요청)
삭제된 계정 정보 조회:
// GET /api/accounts/{mobileNumber} (삭제된 계정 정보 확인 시 404 오류 발생)
이 과정을 통해 계정 삭제 기능이 성공적으로 구현되었음을 확인할 수 있습니다.
이렇게 모든 CRUD (Create, Read, Update, Delete) 작업을 마이크로서비스에서 구현하게 되었습니다. 각각의 단계에서 중요한 부분은 트랜잭션 관리를 통해 데이터의 무결성을 유지하는 것이며, 오류 발생 시 롤백을 통해 안전한 데이터 처리를 보장하는 것입니다.