햄발
Bank App 만들기 - 이체 기능 본문
1. transfer.jsp 파일 생성
2. 이체 기능 만들기
3. 주요 파일 전체 코드 확인
4. 동작 테스트
화면 확인 하기
transfer.jsp
더보기
닫기
transfer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- header.jsp -->
<%@ include file="/WEB-INF/view/layout/header.jsp"%>
<!-- start of content.jsp(xxx.jsp) -->
<div class="col-sm-8">
<h2>이체 요청(인증)</h2>
<h5>Bank App에 오신걸 환영합니다</h5>
<form action="/account/transfer" method="post">
<div class="form-group">
<label for="a">이체 금액 :</label>
<input class="form-control" type="text" id="a" name="amount" value="1000">
<label for="b">출금 계좌 번호 : </label>
<input class="form-control" type="text" id="b" name="wAccountNumber" value="1002-1234">
<label for="c">출금 계좌 비밀 번호 : </label>
<input class="form-control" type="password" id="c" name="password" value="1234">
<label for="d">입금(이체) 계좌번호 : </label>
<input class="form-control" type="text" id="d" name="dAccountNumber" value="1111">
</div>
<div class="text-right">
<button type="submit" class="btn btn-primary">이체하기</button>
</div>
</form>
</div>
<!-- end of col-sm-8 -->
</div>
</div>
<!-- end of content.jsp(xxx.jsp) -->
<!-- footer.jsp -->
<%@ include file="/WEB-INF/view/layout/footer.jsp"%>
TransferDTO
더보기
닫기
TransferDTO
package com.tenco.bank.dto;
import lombok.Data;
@Data
public class TransferDTO {
private Long amount; // 거래 금액
private String wAccountNumber; // 출금계좌 번호
private String dAccountNumber; // 입금계좌 번호
private String password; // 출금 계좌 비밀번호
}
AccountController.java
더보기
닫기
AccountController.java
// 이체 페이지 요청
/**
* 계좌 이체 화면 요청
* @return
*/
@GetMapping("/transfer")
public String transfer() {
User principal = (User) session.getAttribute(Define.PRINCIPAL);
if (principal == null) {
throw new DataDeliveryException(Define.NOT_AN_AUTHENTICATED_USER, HttpStatus.UNAUTHORIZED);
}
return "account/transfer";
}
// 이체 기능 처리 요청
@PostMapping("/transfer")
public String transferProc(TransferDTO dto) {
// 1. 인증 검사
User principal =(User)session.getAttribute(Define.PRINCIPAL);
// 2. 유효성 검사
if(dto.getAmount() == null) { // 출금하는 금액이 공백이면 안된다.
throw new DataDeliveryException(Define.ENTER_YOUR_BALANCE, HttpStatus.BAD_REQUEST);
}
if(dto.getAmount().longValue() <= 0) { // 출금하는 금액이 0 이하이면 안된다.
throw new DataDeliveryException(Define.D_BALANCE_VALUE, HttpStatus.BAD_REQUEST);
}
if(dto.getWAccountNumber() == null || dto.getWAccountNumber().trim().isEmpty()) {
// 계좌번호가 null 이거나 공백이면 안된다.
throw new DataDeliveryException("출금하실 계좌번호를 입력해주세요.", HttpStatus.BAD_REQUEST);
}
if(dto.getDAccountNumber() == null || dto.getDAccountNumber().trim().isEmpty()) {
// 입금 금액이 null 이거나 공백이면 안된다.
throw new DataDeliveryException("이체하실 계좌번호를 입력해주세요", HttpStatus.BAD_REQUEST);
}
if(dto.getPassword() == null || dto.getPassword().trim().isEmpty()) {
throw new DataDeliveryException(Define.ENTER_YOUR_PASSWORD, HttpStatus.BAD_REQUEST);
}
// 서비스 호출
accountService.updateAccountTransfer(dto, principal.getId());
return "redirect:/account/list";
}
AccountService.java
더보기
닫기
AccountService.java
// 이체 기능 만들기
/**
* // 이체 기능 만들기
// 1. 출금 계좌 존재여부 확인 -- select (객체 리턴 받은 상태)
// 2. 입금 계좌 존재여부 확인 -- select (객체 리턴 받은 상태)
// 3. 출금 계좌 본인 소유 확인 -- 객체 상태값과 세션 아이디(ID) 비교
// 4. 출금 계좌 비밀 번호 확인 -- 객체 상태값과 dto 비밀번호 비교
// 5. 출금 계좌 잔액 여부 확인 -- 객체 상태값 확인, dto와 비교
// 6. 입금 계좌 객체 상태값 변경 처리 (거래금액 증가처리)
// 7. 입금 계좌 -- update 처리
// 8. 출금 계좌 객체 상태값 변경 처리 (잔액 - 거래금액)
// 9. 출금 계좌 -- update 처리
// 10. 거래 내역 등록 처리
// 11. 트랜잭션 처리
* @param dto
* @param id
*/
public void updateAccountTransfer(TransferDTO dto, Integer principalId) {
// 출금 계좌 정보 조회
Account withdrawAccountEntity = accountRepository.findByNumber(dto.getWAccountNumber());
System.out.println("출금할 계좌 정보 조회 : " + withdrawAccountEntity);
// 입금 계좌 정보 조회
Account depositAccountEntity = accountRepository.findByNumber(dto.getDAccountNumber());
System.out.println("입금할 계좌 정보 조회 : " + depositAccountEntity);
if (withdrawAccountEntity == null) {
throw new DataDeliveryException(Define.NOT_EXIST_ACCOUNT, HttpStatus.INTERNAL_SERVER_ERROR);
}
if (depositAccountEntity == null) {
throw new DataDeliveryException("상대방의 계좌 번호가 없습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
}
// 출금하는 사용자의 정보를 확인하는 작업
withdrawAccountEntity.checkOwner(principalId); // 계좌 소유자 확인
withdrawAccountEntity.checkPassword(dto.getPassword()); // 패스워드 체크 기능
withdrawAccountEntity.checkBalance(dto.getAmount()); // 잔액 여부 확인 기능
withdrawAccountEntity.withdraw(dto.getAmount()); // 출금 기능
depositAccountEntity.deposit(dto.getAmount()); // 입금 기능
int resultRowCountWithdraw = accountRepository.updateById(withdrawAccountEntity); // 새로 갱신
int resultRowCountDeposit = accountRepository.updateById(depositAccountEntity); // 새로 갱신
if(resultRowCountWithdraw != 1) { // resultRowCountWithdraw 출금 성공여부 확인
throw new DataDeliveryException(Define.NOT_EXIST_ACCOUNT, HttpStatus.INTERNAL_SERVER_ERROR);
}
if(resultRowCountDeposit != 1) { // resultRowCountDeposit 입금 성공여부 확인
throw new DataDeliveryException(Define.NOT_EXIST_ACCOUNT, HttpStatus.INTERNAL_SERVER_ERROR);
}
// history에 값을 넣어서 추가해준다.
History history = History.builder()
.amount(dto.getAmount())
.wAccountId(withdrawAccountEntity.getId())
.dAccountId(depositAccountEntity.getId())
.wBalance(depositAccountEntity.getBalance())
.dBalance(withdrawAccountEntity.getBalance())
.build();
// 이체 기록에 추가
int resultRowCountHistory = historyRepository.insert(history);
if(resultRowCountHistory != 1) { // 쿼리를 추가하게 되면 1이 올라간다 아니라면 실패를 의미한다.
throw new DataDeliveryException(Define.FAILED_PROCESSING, HttpStatus.INTERNAL_SERVER_ERROR);
}
} // end of updateAccountTransfer()


'Spring boot' 카테고리의 다른 글
Spring boot favicon (파비콘) 설정하기 ! (0) | 2024.09.27 |
---|---|
Bank App 만들기 - 계좌 상세보기 (쿼리학습) (0) | 2024.09.27 |
Bank App 만들기 - 입금 기능 (0) | 2024.09.27 |
Bank App 만들기 - 출금 기능 (0) | 2024.09.27 |
Bank App 만들기 - 중간 리팩토링 (0) | 2024.09.27 |