JDBC 와 MYSQL 연동하기 3) 커넥션 팩토리 패턴 적용하기

작성: 2021.04.15

수정: 2021.04.15

읽는시간: 00 분

Programming/JPA ⁄ Spring

반응형

 

이제부터는 2) 번에서 했던 코드를 커넥션을 팩토리 패턴을 이용해 받아오도록 해보겠습니다.

코드는 거의 동일한데 커넥션을 받아온다는 것만 다릅니다.

제일 먼저 Resource 소스 폴더에 dbinfo.properties 파일을 생성합니다.

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/본인DB이름
user=아이디
password=비밀번호
initialSize=2
maxTotal=2
maxWait=2000
connectionMessage=connected!

 

이어 적당한 위치에 ConnectionFactory 만들어주는 코드도 생성합니다.

 

package kr.or.ddit.utils.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;

/**
 * Factory Object[Method] Pattern
 *	: 객체 생성을 전담하는 객체를 운영하는 구조.
 * @author shane
 */
public class ConnectionFactory {
	private static String driverClassName;
	private static String url;
	private static String user;
	private static String password;
	private static String connectionMessage;
	private static DataSource ds;
	
	static {
//		Properties properties = new Properties();
//		try(
//			InputStream is = ConnectionFactory.class.getResourceAsStream("dbinfo.properties");
//		) {
//			properties.load(is);
			ResourceBundle bundle = ResourceBundle.getBundle("dbinfo");
		
			driverClassName = bundle.getString("driverClassName");
			url = bundle.getString("url");
			user = bundle.getString("user");
			password = bundle.getString("password");
			connectionMessage = bundle.getString("connectionMessage");
			
			int initialSize = Integer.parseInt(bundle.getString("initialSize"));
			int maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
			long maxWait = Integer.parseInt(bundle.getString("maxWait"));
			
			ds = new BasicDataSource();
			((BasicDataSource)ds).setDriverClassName(driverClassName);
			((BasicDataSource)ds).setUrl(url);
			((BasicDataSource)ds).setUsername(user);
			((BasicDataSource)ds).setPassword(password);
			
			// 풀링을 하려면, 몇개를 만들어 둘지 미리 셋팅을 해야함.
			((BasicDataSource)ds).setMaxTotal(initialSize);
			((BasicDataSource)ds).setInitialSize(maxTotal);
			((BasicDataSource)ds).setMaxWaitMillis(maxWait);
			
	}
	
	public static Connection getConnection() throws SQLException{
		System.out.println(connectionMessage);
		return ds.getConnection();
//		return DriverManager.getConnection(url, user, password);
	}
	
}

 

Apache Commons의 dbcp2를 이용했기 때문에 dependency를 추가하거나 jar 파일을 library에 추가해줘야 합니다.

수업 때 배운 커넥션 풀링까지 적용시켰습니다. 풀링을 적용하지 않는다면 getConnection으로 바로 반환해 줄 수도 있습니다.

 

중요한 건, ResourceBundle.getBundle("dbinfo")에서 괄호 안에 들어가는 데이터는 위에서 만든 dbinfo.properties 파일의 Qualified name이 들어가야 합니다. 맨 마지막에 확장자 명은 뺍니다.

예를 들어서, res/db/dbinfo.properties 파일로 저장되어 있다면, db.properties라고 써주시면 됩니다.

아래의 dbinfo 파일과 Factory 파일을 잘 생성해 두었다면, 

2번에서 했던 코드를 커넥션 받는 부분만 변경해서 돌려봅니다

 

package kr.or.ddit.test;

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

import kr.or.ddit.utils.db.ConnectionFactory;


public class Test03ConnectionFactory {
	
	public static void main(String[] args) {
		
		try(
			Connection conn = ConnectionFactory.getConnection();
		) {
			
			String sql = "select * from alba";
			Statement statement = conn.createStatement();
			ResultSet result = statement.executeQuery(sql);
			
			while(result.next()) {
				String al_id = result.getString(1);
				String al_name = result.getString(2);
				int al_age = result.getInt(3);
				String al_zip = result.getString(4);
				String al_addr1 = result.getString("al_addr1");
				String al_addr2 = result.getString("al_addr2");
				String al_hp = result.getString("al_hp");
				String gr_code = result.getString("gr_code");
				String al_gen = result.getString("al_gen");
				String al_mail =result.getString("al_mail");
				String al_career = result.getString("al_career");
				String al_spec = result.getString("al_spec");
				String al_desc = result.getString("al_desc");
				String al_img = result.getString("al_img");
				System.out.printf("%s %s %d %s %s %s %s %s %s %s %s %s %s %s \n",al_id,al_name,al_age,al_zip,al_addr1,al_addr2,al_hp,gr_code,al_gen,al_mail,al_career,al_spec,al_desc,al_img);
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

커넥션 팩토리 패턴 적용이 완료되었습니다.

반응형