기록/BACKEND

[WEB] Java에서 DB연결하기

5월._. 2022. 4. 2.
728x90

두 경우 모두 FactoryDao를 사용한다고 가정한다.

FactoryDao는 싱글톤 패턴을 적용했다. 따라서 getInstance, getConnection, close 함수가 존재한다.

필요할 때마다 DB Connection 생성해서 사용하기

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class FactoryDao {

	private final String driverName = "com.mysql.cj.jdbc.Driver";
	private final String url = "jdbc:mysql://127.0.0.1:3306/스키마이름?serverTimezone=UTC";
	private final String user = "아이디";
	private final String pass = "비밀번호";

	private static FactoryDao instance = new FactoryDao();

	private FactoryDao() {
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static FactoryDao getInstance() {
		return instance;
	}

	public Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, user, pass);
	}

	public void close(AutoCloseable... closeables) {
		for (AutoCloseable c : closeables) {
			if (c != null) {
				try {
					c.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

미리 DB Connection Pool 생성해서 사용하기

이 방식을 사용하려면 꼭! close를 하는 것에 유의해야 한다. 앞의 방식도 close가 필요하지만, 이 방식은 한정된 pool을 빌려쓰는 개념이기 때문에 close를 하지않으면 다음 connection 얻는 게 불가능하다.

앞의 방식에서 달라진 점만 짚어보려고 한다. 

먼저 driverName, url, user정보를 class 내부에 설정하지 않는다.

META-INF 내의 context.xml에 이렇게 설정한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="설정이름" auth="Container" type="javax.sql.DataSource" 
			maxTotal="100" maxIdle="30" maxWaitMillis="10000" 
			username="아이디" password="비밀번호" driverClassName="com.mysql.cj.jdbc.Driver" 	
			url="jdbc:mysql://localhost:3306/스키마이름?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"/> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

FactoryDao의 getConnection()부분을 변경한다. 기본생성자에는 아무 내용이 없어도 상관 없다.

private FactoryDao() {}

public Connection getConnection() throws SQLException {
	try {
		Context context = new InitialContext();
		Context rootContext = (Context) context.lookup("java:comp/env");
		DataSource dataSource = (DataSource) rootContext.lookup("설정이름");
		return dataSource.getConnection();
	} catch (NamingException e) {
		e.printStackTrace();
	}
	return null;
}

'기록 > BACKEND' 카테고리의 다른 글

[WEB] 파라미터와 어트리뷰트  (0) 2022.04.04
[WEB] 요청과 응답의 Scope  (0) 2022.04.04
[WEB] Servlet  (0) 2022.03.29
[WEB] MVC Pattern  (0) 2022.03.29
[WEB] DTO Pattern  (0) 2022.03.28

댓글