[Spring Boot] 27. 스프링부트 뱅크 v1 (9) 이체하기

김주희's avatar
Mar 25, 2025
[Spring Boot] 27. 스프링부트 뱅크 v1 (9) 이체하기
Integer는 125까지만 int로서 비교되고 이후로는 equals를 사용한 문자열로 비교해야한다!!!

1. 계좌이체 package 구조

1. package 안의 package

  • course - round
    • - subject - unit
    • 예시
      • kdt flutter 과정 - 1회차
        - springboot - springboot controller

2. 계좌이체를 위한 history package 구조 변경

  1. 계좌마다 이체 내역이 생김
  1. account package 내부에서 history package 관리
  1. 이체 내역만 보는 페이지가 있으면 historyController가 필요하지만 계좌상세 페이지에 이체 내역을 확인할 수 있기 때문에 controller는 따로 만들지 않아도 된다.
notion image
 

2. account/transfer-form.mustache

  1. URI 및 입력 받는 데이터 확인하기
notion image
 

3. AccountRequest.transferDTO

  1. account/transfer-form.mustache에서 client로부터 입력 받는 데이터를 필드로 지정한다.
@Data public static class TransferDTO { private Integer amount; private Integer withdrawNumber; private Integer depositNumber; private String withdrawPassword; }
 

4. AccountController

1. 계좌 이체 페이지로 연결되는 메서드

  1. 이때 계좌 이체 또한 로그인한 유저만이 사용 가능한 기능이므로 인증 과정이 필요하다.
  1. history package에 위치해서 주소를 /history/transfer-form 이라고 생각할 수도 있지만 기록 - 이체 보다는 계좌 - 이체가 자연스러운 흐름이므로 /account/transfer-form 으로 주소를 지정한다.
// history/transfer-form : 기록/이체는 약간 어색할수도 @GetMapping("/account/transfer-form") public String transferForm() { //공통 부가 로직 User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("로그인 후 사용해주세요"); // 로그인X시 아예 못들어오도록 return "account/transfer-form"; }

2. 계좌 이체하는 메서드

  1. 인증 과정이 필요하다.
  1. client로부터 받은 데이터를 Service로 넘기면서 이때 로그인한 유저의 id도 함께 넘긴다.
  1. return되는 페이지는 계좌 상세 페이지이면 좋지만 아직 만들지 않았기 때문에 home으로 redirect 연결해둔 뒤 주석으로 TODO를 작성해두면 이후에 찾아서 수정하도록 한다.
@PostMapping("/account/transfer") public String transfer(AccountRequest.TransferDTO transferDTO) { //공통 부가 로직 - aop, intercepter, security filter User sessionUser = (User) session.getAttribute("sessionUser"); if (sessionUser == null) throw new RuntimeException("로그인 후 사용해주세요"); // 로그인X시 아예 못들어오도록 accountService.계좌이체(transferDTO, sessionUser.getId()); return "redirect:/"; // TODO : 계좌상세 페이지로 redirect 수정 }
 

5. AccountService

1. 비지니스 로직

@Transactional public void 계좌이체(AccountRequest.TransferDTO transferDTO, int userId) { // 1. 출금 계좌 조회, 없으면 RuntimeException // 2. 입금 계좌 조회, 없으면 RuntimeException // 3. 출금 계좌의 잔액 검사 // 4. 출금 비밀번호 확인해서 동일한지 체크 // 5. 출금계좌 주인이 맞는지 확인(로그인한 유저가) // 6. Account Update 출금계좌 (핵심 로직) // 6. Account Update 이체계좌 (핵심 로직) // 7. History Save (핵심 로직) }
 
 
Share article

jay0628