개발/JSP

웹 어플리케이션의 일반적인 구성 및 방명록 구현

까망군 2011. 10. 21. 14:34
>> 자바는 객체 지향 언어로서 역할에 따라 클래스를 설게함으로써 효율적인 프로그래밍을 할수 있다. JSP의 기반 기술은 자바이기 때문에, 객체 지향에서 비롯되는 자바 언어의 효율성을 JSP 프로그래밍에서도 그대로 적용할 수 있다. 웹 어플리케이션을 개발할 때 클래스를 구성하는 전형적인 구조가 있는데 오늘은 이부분에 대해서 공부해 본다.

01. 어플리케이션의 전형적인 구성 요소

 웹 어플리케이션을 포함한 다수의 소프트웨어는 개발 비용 이상으로 유지 보수 비용을 필요로 한다. 특히 웹 어플리케이션의 경우는 일반 어플리케이션에 비해서 개발이 완료된 뒤에도 지속적으로 수정 요구 사항이 발생한다. 이는, 개발이 완료된 이후에도 지속적으로 웹 어플리케이션의 코드를 수정하거나 새롭게 작성해야 한다는 것을 의미한다.

간혹 JSP만 이용해서 웹 어플리케이션을 개발하는 경우가 있는데, 이 경우 개발된 웹 어플리케이션을 유지 보수하는 것이 쉽지 않다. 유지 보수가 어려워지는 가장 큰 이유는 동일하거나 비슷한 기능을 제공하는 코드가 여러 파일에 중복되어 있기 때문이다. 

중복된 코드를 만들지 않는 여러가지 방법이 있는데 그 중 하나는 화면을 보여주기 위한 코드와 상관없이 사용자의 요청을 처리하기 위한 코드를 별도 클래스로 분리하는것이다. 또한, DB 처리와 같이 여러 기능에서 사용될 수 있는 코드를 별도 클래스로 분리하기도 한다. 개발자마다 클래스를 분리하는 기준이 다를 수 있지만 클래스를 알맞은 단위로 분리함으로써 중복된 코드로 인한 문제를 없애고 추가적으로 클래스의 재사용 비율도 높일 수 있게 된다.

1.1 웹 어플리케이션의 주요 구성 요소

웹의 일반적인 구성 요소


 
1.2 데이터 접근 객체(Data Access Object) 구현

DAO 클래스는 이름 그대로 데이터에 접근할 때 사용되는 객체를 위한 클래스를 의미한다. 일반적으로 한 개의 DB 테이블 당 한 개의 DAO 클래스를 작성한다. 각 DAO 클래스는 INSERT, SELECT, UPDATE, DELETE 쿼리르르 실행해 주는 메서드를 제공한다.

DAO 클래스는 테이블로부터 테이터를 읽어와 자바 객체로 변환하거나 또는 자바 객체의 값을 테이블에 저장해 주므로, 테이블의 칼럼과 매핑되는 프로퍼티를 갖는 자바 클래스를 작성해 주어야 한다.

(1) DAO에서 Connection에 접근하는 방식 

DAO가 쿼리를 실행하려면 Statement나 PreparedStatement가 필요한다, 이 두 객체는 Connection 객체로부터 구할 수 있다. 따라서 DAO 클래스는 Connection 객체에 접근할 수 있어야 하는데, Connection 객체를 구하는 방법에는 다음과 같이 세가지 방식이 있다.
  • DAO 클래스의 메서드에서 직접 Connection을 생성
  • DAO 객체를 생성할 때 생성자에서 Connection을 전달받기
  • DAO 클래스의 메서드 파라미터로 Connection을 전달 받기
첫 번째 방식의 단점은 메서드를 실행할 때마다 매번 Connection을 생성한다는 점이다. 하나의 기능을 실행할 때 두 개의 DAO 메서드를 호출하는 경우, 각 DAO 메서드에서 Connection을 생성하므로 두개의 Connection객체를 생성하게 된다. 이는 각 메서드가 서로 다른 Connection 객체를 사용한다는 것을 의미하는데, 이 경우 두 메서드를 한 트랜잭션으로 처리할 수 없게 된다.(JDBC 기반의 트랜잭션은 한 개의 Connection 객체에서만 유효하다.)

두 번째 방식은 DAO 객체의 메서드들이 하나의 Connection 객체를 사용하기 때문에 JDBC, 트랜잭션을 이용할 수 있지만, 매번 새로운 DAO 객체를 생성해야 하는 단점이 있다.

세 번째 방식은 두 번째 방식과 마찬가지로 한 개의 Connection 객체를 사용하므로 JDBC  트랜잭션을 사용할 수 있으며 DAO 객체를 매번 생성하지 않아도 된다는 장점이 있다. 하지만, DAO 객체의 메서드를 실행할 때마다 Connection 객체를 파라미터로 전달해 주어야 하므로 첫 번째나 두 번재 방식에 비해 메서드 호출 코드가 다소 길어진다는 단점이 있다.

(2) 간단한 close() 및 rollback() 처리 코드를 위한 JdbcUtil

WEB-INF\src\kame\jdbc\JdbcUtil.java
package kame.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcUtil {
	public static void close(ResultSet rs){
		if(rs != null){
			try{
				rs.close();
			} catch(SQLException ex){
			}
		}
	}

	public static void close(Statement stmt){
		if(stmt != null){
			try{
				stmt.close();
			} catch(SQLException ex){
			}
		}
	}

	public static void close(Connection conn){
		if(conn != null){
			try{
				conn.close();
			} catch(SQLException ex){
			}
		}
	}
	public static void rollback(Connection conn){
		if(conn != null){
			try{
				conn.rollback();
			} catch(SQLException ex){
			}
		}
	}
}