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 을 생성하여 사용한다.
이것도 읽어보세요