JAVA MVC Pattern, JDBC

이 글에서는 JAVA MVC 패턴의 아키텍처 구현 예시와 JDBC 기본 사용법을 설명합니다.

 
1. MVC Pattern

 

[예시 아키텍처 구현]

* com.sinc.framework.model.sql

1. Dao.java (Interface)

2. OracleDaoImpl (Class) extends Dao

 

* com.sinc.framework.service

1. OopService.java (Interface)

2. OopServiceImpl.java (Class) extends OopService

 

* com.sinc.framework.ctrl

1. Controller.java (Interface)

2. InsertCtrl.java (Class) extends Controller

3. DeleteCtrl.java (Class) extends Controller

4. SearchCtrl.java (Class) extends Controller

 

* com.sinc.framework.factory

1. BeanFactory.java (Singleton 인스턴스로 생성, Controller 와 연결시켜준다.)

 

** View -> FrontController -> Factory(Singleton) -> Controller -> Service -> DAO

 

 

2. JDBC

 

* JDBC

1. Driver Loading

2. Connection (url, user, pwd)

3. Statement (SQL)

4. executeQuery() : ResultSet (SELECT)

    executeUpdate() : INSERT, UPDATE, DELETE

5. ResultSet 사용

6. Connection close

 

( * 이 모든 절차가 예외를 발생시키고 있다. 따라서 try / catch 를 사용한다. )

( * 이 절차를 편하게 해 주는 프레임워크가 MyBatis )

 

package com.sinc.framework.model.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.sinc.oop.sub.model.vo.EmployeeVO;
import com.sinc.oop.sub.model.vo.StudentVO;
import com.sinc.oop.sub.model.vo.TeacherVO;
import com.sinc.oop.sup.model.vo.PersonVO;
public class OracleDaoImpl implements Dao {
    public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    public static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
    public static final String USER = "hr";
    public static final String PASSWORD = "hr";
    public OracleDaoImpl() {
        try {
            Driver Load Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    @Override public List < Object > selectRow() {
        System.out.println("dao selectRow");
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String selectSQL = "SELECT DIVISION, NAME, AGE, ADDRESS, COMM FROM TEST_OOP_TBL";
        List < Object > list = new ArrayList < > ();
        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            pstmt = conn.prepareStatement(selectSQL);
            rs = pstmt.executeQuery(selectSQL);
            while (rs.next()) {
                int division = rs.getInt(1);
                String name = rs.getString(2);
                int age = rs.getInt(3);
                String addr = rs.getString(4);
                String comm = rs.getString(5);
                PersonVO per = null;
                if (division == 1) {
                    per = new StudentVO(division, name, age, addr, comm);
                } else if (division == 2) {
                    per = new TeacherVO(division, name, age, addr, comm);
                } else if (division == 3) {
                    per = new EmployeeVO(division, name, age, addr, comm);
                }
                list.add(per);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return list;
    }
    @Override public Object selectPkRow(Object obj) {
        System.out.println("dao selectPkRow");
        return null;
    }
    @Override public int insertRow(Object obj) {
        System.out.println("dao insertRow");
        Connection conn = null;
        PreparedStatement pstmt = null;
        String insertSQL = "INSERT INTO TEST_OOP_TBL VALUES(OOP_SEQ.NEXTVAL, ?, ?, ?, ?, ?)";
        int flag = 0;
        PersonVO per = null;
        if (obj instanceof PersonVO) {
            per = (PersonVO) obj;
        } else {
            return -1;
        }
        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            pstmt = conn.prepareStatement(insertSQL);
            pstmt.setInt(1, per.getDivision());
            pstmt.setString(2, per.getName());
            pstmt.setInt(3, per.getAge());
            pstmt.setString(4, per.getAddress());
            pstmt.setString(5, per.getCommon());
            flag = pstmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return flag;
    }
    @Override public int updateRow(Object obj) {
        System.out.println("dao updateRow");
        return 0;
    }
    @Override public int deleteRow(Object obj) {
        System.out.println("dao deleteRow");
        return 0;
    }
}

 

 
 
3. Connection Pool

 

요청이 발생할 때마다 DB 와의 세션을 시도하면, 지나치게 큰 오버헤드가 발생한다. 현업에서는 WAS 가 Connection Pool 을 생성하여 사용한다.

 

 

 


이것도 읽어보세요