본문 바로가기
JAVA

[JAVA ] JDBC 활용한 미니 프로젝트 - 1단계

by 방준이 2021. 9. 8.
반응형

 

0. 계좌관리 프로그램

해당 프로젝트는 KOSTA EDU 교육에서 진행하는 수업의 일부를 공부하는 목적으로 올리는 용도입니다 :) 단계별로 프로젝트를 실습할 예정이며 TestUnit 클래스를 먼저 만들고 여러가지 예외적인 상황에 대해서 생각해 본 후 해당 기능을 구현하는 순서로 진행하였습니다. 참고로 TestUnit 클래스는 하나의 기능을 테스트하는 목적으로 설계된 클래스입니다.

 

 

 

1.  요구사항 분석

소프트웨어 설계에 앞서 첫 단계로 요구 사항을 분석하는 것이 첫 번째다. 하지만 요구사항 분석에도 여러가지 모델링 기법이 존재하며 깊게 하고자 한다면 매우 복잡하기에 매우 간단한 프로그램의 설계인 만큼 간단하게 분석해보고 넘어가보고자 한다. 

 

계좌관리 프로그램인 만큼 당연히 계좌를 개설하고, 잔액조회, 입출금, 계좌이체 등등 대표적인 기능을 수행할 수 있다. 더불어 연습문제 느낌삼아 최고잔액 계좌정보를 조회하는 기능을 추가시켜 보자. (이는 잔액이 가장 많은 계좌정보를 조회하는 것과 동일하다.)  이외에 존재하는 여러 요구사항은 다음과 같다.

 

  1.  사용자는 계좌 개설이 가능하다.
  2. 계좌 개설시 계좌번호, 계좌주명, 비밀번호, 잔액정보가 저장되어야 한다. 
  3. 최초 계좌 개설시 초기 납입액이 1000원 이상이 되어야 한다.
  4. 계좌번호는 유일해야 하고 시스템에서 자동 발급한다. 
  5. 잔액조회는 계좌번호가 존재해야 하고 계좌번호에 맞는 비밀번호가 일치해야 한다.
  6. 입금액, 출금액, 계좌이체액은 모두 0원을 초과해야 한다.
  7. 입금시에는 계좌번호, 비밀번호가 일치해야 한다.
  8. 출금시에는  계좌번호, 비밀번호가 일치해야 하고 잔액확인 절차가 필요
  9. 계좌이체시에는 송금자 및 수금자의 계좌가 존재해야 한다
  10. 이체액은 0원을 초과해야 하며 송금자의 비밀번호가 일치해야 하며 송금자의 잔액확인 절차가 필요
  11. 송금 및 입금 처리가 정상적으로 수행될 경우에만 실제 이체 처리가 되도록 한다 
  12. 계좌 잔액이 가장 높은 계좌주명과 잔액을 조회할 수 있다

 

2.  UML 을 활용한 Class Diagram 정의

 

아직은 구체적으로 요구사항을 완전히 반영한것이 아니기 때문에 AccountDAO 클래스도 계좌를 개설하는 것과 위에서 언급한 요구사항 12번 최고 잔액계좌정보 조회하기 기능을 반영해 보았다. 또한 여러 기능을 사용하다 발생할 수 있는 예외들을 정의를 해보았고 이는 사용자 정의 예외로 클래스를 만들어 주었다.

 

 

3.  DB account 테이블 정의


1
2
3
4
5
6
7
8
create table account(
    account_no number primary key,
    name varchar2(100not null,
    password varchar2(100not null,
    balance number not null
)
 
create sequence account_seq;
 

 

account_no를 number 로 정의 하는 이유는 데이터베이스에서 계좌번호를 sequence 테이블을 이용해서 발급을 받을 것이고 반환 값은 정수이기 때문에 number타입으로 정의하였다. 

 

 

4.  요구사항 1~4  createAccount() 구현 전 TestUnit Class 작성

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
32
33
34
35
36
37
38
39
40
41
package test;
 
import java.sql.SQLException;
import model.AccountDAO;
import model.AccountVO;
import model.CreateAccountException;
 
/*
 * 계좌개설 기능 단위 테스트
 */
 
public class TestUnit1 {
    public static void main(String[] args) {
        try {
            AccountDAO dao=new AccountDAO();
            //계좌 개설 
            //1.정상흐름테스트   
            /*
             * AccountVO vo=new AccountVO("아이유","1234",1000); dao.createAccount(vo);
             * System.out.println("계좌 개설");
             */
 
            //2. 대안흐름테스트 
            /*
             *AccountVO vo=new AccountVO("박보검","1111",999); dao.createAccount(vo);
             * System.out.println("계좌 개설");
             */
            
            AccountVO vo=new AccountVO("이강인","1",2000);
            dao.createAccount(vo);
            System.out.println("계좌 개설");
            
         }catch(CreateAccountException ce){
             System.out.println(ce.getMessage());// 계좌 개설시 초기 납입금은 1000원 이상이어야 합니다
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch(SQLException se) {
            se.printStackTrace();
        }
    }
}
 

 

바로 계좌개설 기능을 구현하는 것이 아니라 TestUnit 클래스에서 여러가지 상황에 대해서 테스트해 볼 수 있도록 다양한 호출을 시도하였다. 즉 의도적으로 예외를 발생시키도록 하기위하여 납입금이 1000미만이 되게 매개변수를 지정하고 함수를 호출해 보았다. 납입금이 1000원 미만일 경우 CreateAccountException 예외 를 발생시키도록 하였다.

 

 

5.  createAccount() 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void createAccount(AccountVO accountVO) throws CreateAccountException, SQLException {
        
        if(accountVO.getBalance()<1000)
            throw new CreateAccountException("계좌 개설시 초기 납입금은 1000원 이상이어야 합니다");
        
        Connection con=null;
        PreparedStatement pstmt=null;
        try {
            con=getConnection();
            StringBuilder sql=new StringBuilder("insert into account(account_no,name,password,balance) ");
            sql.append("values(account_seq.nextval,?,?,?)");
            pstmt=con.prepareStatement(sql.toString());
            pstmt.setString(1, accountVO.getName());
            pstmt.setString(2, accountVO.getPassword());
            pstmt.setInt(3, accountVO.getBalance());
            pstmt.executeUpdate();
        }finally {
            closeAll(pstmt, con);
        }
    }
 
 

 

계좌 개설 기능의 경우 간단하게 위와 같이 구현하였다. 첫 번째로 납입금이 1000원 이상인지를 확인하고 미만일 경우 예외를 발생시켜 호출한 쪽으로 예외를 throw 해주었다. 그렇지 않다면 데이터베이스 시퀀스 넘버로 계좌번호를 자동발급하고 입력으로 들어온 매개변수를 통해서 이름, 패스워드를 DB에 등록해 주었다.

 

 

 

 

 

 

반응형