Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

Bank App 만들기 - 이체 기능 본문

Spring boot

Bank App 만들기 - 이체 기능

햄발자 2024. 9. 27. 15:24

 

 

 

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()