Statement & Prepared Statement 차이점

미묘한 차이가 있음
1. PreparedStatement 구문은 ?를 사용하여 문장을 좀 더 간결하고 직관적으로 표현할 수 있음
2. Statement는 Connection의 createStatement() 함수에서 사용됨
3. PreparedStatement는 set() 함수가 사용됨, 정수일 경우 setInt()를 사용함
4. executeUpdate() 함수를 호출할 때 Statment는 sql문을 입력 파라미터로 전달하고 
   PreparedStatement는 executeUpdate() 함수에 파라미터를 입력하지 않음
   

Statement = "INSERT INTO user(id, password, name) VALUES
			('' " + uid + " ' , " + upass + " ' , '" + uname + "')";
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);

PreparedStatement

String sql = "INSERT INTO user(id, password, name) VALUES (?,?,?)"
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, uid);
pstmt.setString(2, upass);
pstmt.setString(3, uname);
pstmt.executeUpdate();

데이터베이스 커넥션 풀

왜?
JDBC로 DB에 접근할 때 가장 많은 자원이 소모되는 부분은 DB연동에 필요한 conn 객체를 생성하는 부분
지금까지는 SQL문을 수행하기 위해서 conn 객체를 생성하고 제거하는 과정을 반복해왔음
접근하는 유저들이 증가할 경우 시스템의 성능을 급격하게 저하시키게 됨

이러한 문제점을 해결하는 방법 중에 하나가 바로 database connection pool을 이용하는 방법임
커넥션 풀을 이용하게 되면 사용자가 요청할 때마다 매번 새로운 conn 객체를 생성하는 것이 아니라 
일정한 개수의 conn 객체를 미리 생성한 다음 사용자의 요청이 있을 때마다 가용한 객체를 할당하는 방식을 사용함
WebContent - META-INF
Java Resources - src - util
context.xml - DB연결 설정, 아이디, 비번, 사용 DB 커넥션 갯수, 최소 유지 커넥션 수 등등 기본 설정

<?xml version="1.0" encoding="UTF-8"?>
<Context>	// 설정 시작
	<Resource name = "jdbc/dantalk"	//자원 정의 DB명을 넣어줌
		auth = "Container"	// 사용할 DB 인증 데이터 설정
		type = "javax.sql.DataSource"
		driverClassName = "com.mysql.jdbc.Driver"
		url = "jdbc:mysql://localhost:3306/dantalk?serverTimezone=UTC"
		username = "root" //데이터베이스 아이디
		password = "1104jy" //데이터베이스 비번
		maxTotal = "16"	//커넥션 풀에서 유지될 수 있는 conn 객체의 최대 개수
		maxIdle = "4" 	//커넥션 풀에서 유지되어야 할 conn 객체의 최소 개수
		maxWaitMillis = "-1" /> 커넥션 풀에서 가용한 conn 객체가 없을 경우 대기 시간을 지정
								-1로 설정하면 대기 시간 없이 바로 가용 자원이 없음을 알려주는 오류 메세지 전달

ConnectionPool.java

package util;

import javax.sql.DataSource;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

public class ConnectionPool {

	private static DataSource _ds = null;
	public static Connection get() throws NamingException, SQLException{
		if(_ds == null) {
			_ds = (DataSource) (new InitialContext()).lookup(
					"java:comp/env/jdbc/dantalk");
		}
		return _ds.getConnection();
	}
}

테이블마다 1개의 DAO 1개의 DTO
DAO data access object		모든 sql구문들을 통합
DTO data transfer object	해당 테이블과 연결을 위한 객체
