(KOPO)DONJO은행 개발일지

2 minute read



문제1. SQL 프로시저 JAVA (DAO) 실행.

1. 상황

  • TRANSACTION이라는 SQL프로시저를 생성했다.
  • JAVA DAO에서 실행하려고하니까 부적절한 SQL문이라는 에러 등장.
  • 우선 TRANSACTION 프로시저 코드에는 에러가 없었다.
CREATE OR REPLACE PROCEDURE TRANSACTION(
    V_MYACC           TRANHISTORY.MYACC%TYPE,
    V_MYBANK          TRANHISTORY.MYBANK%TYPE,
    V_INPUTBALANCE    TRANHISTORY.BALANCE%TYPE, -- 입금금액
    V_OTHACC          TRANHISTORY.OTHACC%TYPE, --상대계좌
    V_OTHBANK         TRANHISTORY.OTHBANK%TYPE --상대 은행
) IS
    V_TRANSEQ         TRANHISTORY.TRANSEQ%TYPE         := SEQ_TRANHISTORY_CODE.nextval;
   
BEGIN
    --계좌에 반영(내계좌)
    UPDATE ACCOUNTDB SET BALANCE = BALANCE - V_INPUTBALANCE WHERE ACCOUNT = V_MYACC AND BANK_CODE = V_MYBANK;
    -- 계좌에 반영( 상대계좌 )
    UPDATE ACCOUNTDB SET BALANCE = BALANCE + V_INPUTBALANCE WHERE ACCOUNT = V_OTHACC AND BANK_CODE = V_OTHBANK;
    
    -- 로그저장 (내계좌)
    INSERT INTO TRANHISTORY( TRANSEQ, MYACC, MYBANK, TR_CODE, BALANCE, OTHACC, OTHBANK)
        VALUES ( V_TRANSEQ, V_MYACC, V_MYBANK, 'M', V_INPUTBALANCE, V_OTHACC, V_OTHBANK );
    INSERT INTO TRANHISTORY( TRANSEQ, MYACC, MYBANK, TR_CODE, BALANCE, OTHACC, OTHBANK)
        VALUES ( V_TRANSEQ, V_OTHACC, V_OTHBANK, 'A', V_INPUTBALANCE, V_MYACC, V_MYBANK );
        
        
    COMMIT;
    
    EXCEPTION
        WHEN OTHERS THEN
        rollback;
        
 END;
/
EXEC TRANSACTION('35390201147037','D',7000,'33333333333338','D');

### 해결1

  • JAVA DAO클래스에서 처음에 PreparedStatement로 sql을 실행했는데 주위에 자문을 구해보니
  • CallableStatement를 사용해야 한다는 조언을 얻었다.
  • 또한, SQL에서 exec 트랜잭션명 으로 실행하는 것과는 달리 { call 트랜잭션명() }로 적어야 했다.
/**
	 * 거래로그 및 잔액 업데이트 함수
	 * @param tran
	 * @throws SQLException
	 */
	public void transaction(TransactionVO tran) throws SQLException{
		
		
		Connection conn = new ConnectionFactory().getConnection(); 
                      //이건 미리 만들어둔 DB접속 패키지 함수
                      
		CallableStatement cstmt = null;
		String sql;
		
		try{
			
			sql= "{ call transaction(?,?,?,?,?) }";
			cstmt = conn.prepareCall(sql);
			
			int loc = 1;
			cstmt.setString(loc++, tran.getMyAcc()); // 내계좌
			cstmt.setString(loc++, tran.getMyBank()); // 내은행코드
			cstmt.setInt(loc++, tran.getBalance()); // 넘길금액
			cstmt.setString(loc++, tran.getOthAcc()); // 상대계좌
			cstmt.setString(loc++, tran.getOthBank()); // 상대 은행
			
			int result = cstmt.executeUpdate();
			System.out.println(result);
			cstmt.close();
			
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
  • 오류메시지는 사라졌는데 DB에 변화가 전혀없었다. 뭘까…

### 해결2

  • Parameter값을 받아오면서 오탈자가 있었다… ㅋㅋㅋㅋ
  • 정말 두눈 크게 뜨고 개발해야지 ㅠㅠ




문제2. request영역에 setAttribute한 json리스트 ajax에서 불러오기

1. 상황

  • Java Controller에서 request.setAttribute(“transInfo”, transInfo) 해준 데이터를
  • 전혀 불러들이지 못하는 문제발생

2. 원인

  • 내가 ajax를 잘못이해하고 있었다.
  • 계좌이체화면.jsp 에서 이미 가지고있는 본인 계좌를 불러오려면 바로 불러오는게 아니라 새로운 화면이 필요하다
  • 계좌이체화면(전).jsp와 이를 부르는 controller가 필요하고 이것을 beans.properties에 등록해놔야함.
    • /accountTransferBefore.do= kr.ac.donjo.account.controller.AccountTransferBeforeController

3. 해결코드

  • AccountTransferBeforeController.java
package kr.ac.donjo.account.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.google.gson.Gson;

import kr.ac.donjo.account.dao.AccountInqueryDAO;
import kr.ac.donjo.account.vo.AccountVO;
import kr.ac.donjo.controller.Controller;
import kr.ac.donjo.login.vo.LoginVO;

public class AccountTransferBeforeController implements Controller {

	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  
		AccountInqueryDAO dao = new AccountInqueryDAO();
		HttpSession session = request.getSession();
		LoginVO uservo = (LoginVO)session.getAttribute("userVO");
    // ID로 보유한 계좌 불러오는 부분.
		List<AccountVO> userAcc = dao.showAllAcc(uservo.getId());


		Gson gson = new Gson();// GSON사용하려면 jar파일 먼저 lib에 저장할것
		String transInfo = gson.toJson(userAcc);
		//System.out.println(transInfo);
		
		request.setAttribute("transInfo", transInfo);
		
		
		return "/jsp/account/account_transferbefore.jsp";
	}

}
  • account_transferbefore.jsp
    • 아래처럼 찍어보면 json배열 값이 나옴.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


${ transInfo }

  
  • account_transfer.jsp (계좌이체하는 페이지)
/**
	selection에 따라 값 변경

 */

$(document).ready(function(){
	

	
	$('select[name$=myBank]').change(function(){
		
		//입력받은 은행
		let bank = $('select[name$=myBank]').val()
		
		
		$.ajax({
			type : 'post',
			url  : '/Donjo-Web/accountTransferBefore.do',
		//	contentType : "application/json; charset=utf-8",
		//	dataType : 'json',

			success : callback,
			error : function(){
				alert('실패')
			}
		})
	})
})

function callback(data){
	//var userAcc = $(transInfo);
	console.log(data) // 웹 콘솔창에 찍어보면 json배열이 나옴.
}
  • AJAX때문에 눈물 찔끔 날뻔했다..ㅠㅜ 열심히 공부해야지