싱글톤(Singleton) 디자인 패턴으로 해결하기
Java로 작성된 애플리케이션 전체에서 MySQL 데이터베이스 연결 객체(Connection)를 단 하나만 유지하고 싶다면 싱글톤(Singleton) 디자인 패턴을 적용하는 것이 가장 좋은 방법입니다. 싱글톤 패턴은 클래스의 인스턴스가 프로그램 전체에서 오직 하나만 생성되도록 보장하며, 여러 클래스가 동일한 연결 객체를 공유할 수 있도록 해줍니다.
이 방식을 사용하면 매번 새로운 연결을 만들 때 발생하는 리소스 낭비를 줄이고, 연결 관리를 한 곳에서 일관되게 처리할 수 있습니다.
아래는 단일 연결 객체를 반환하는 자바 코드입니다.
ConnectDatabase.java
import java.sql.Connection;
import java.sql.DriverManager;
public class ConnectDatabase {
static Connection conn = null;
public static Connection getConnection() {
if (conn != null) return conn; // 이미 연결이 존재하면 기존 객체 반환
String database = "test";
String username = "root";
String password = "123456";
return getConnection(database, username, password);
}
private static Connection getConnection(String databaseName, String userName, String password) {
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/" + databaseName
+ "?user=" + userName + "&password=" + password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}동작 원리
getConnection()메서드는 먼저 정적 변수conn에 연결 객체가 이미 존재하는지 확인합니다.- 연결이 이미 만들어져 있다면(
conn != null) 새로 생성하지 않고 기존 객체를 그대로 반환합니다. - 연결이 없는 최초 호출 시에만 드라이버를 로딩하고
DriverManager를 통해 실제 연결을 생성합니다.
다음은 위 메서드를 호출하여 연결을 확인하는 클래스입니다.
CallConnection.java
import java.sql.Connection;
public class CallConnection {
public static void main(String[] args) {
Connection con = ConnectDatabase.getConnection();
if (con != null) {
System.out.println("연결 성공 !!!");
}
}
}실행 결과
Mon Feb 11 20:15:32 IST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 연결 성공 !!!
SSL 경고 메시지 이해하기
실행 결과 상단에 출력된 경고는 에러가 아니라 MySQL 드라이버가 내보내는 SSL 관련 안내 메시지입니다. MySQL 5.5.45+, 5.6.26+, 5.7.6+ 버전부터는 명시적인 옵션이 없으면 기본적으로 SSL 연결을 시도하기 때문에 나타납니다. 개발 환경 등에서 SSL을 사용하지 않으려면 JDBC URL에 useSSL=false 옵션을 추가하면 됩니다.
"jdbc:mysql://localhost/" + databaseName + "?useSSL=false&user=" + userName + "&password=" + password;
참고: 최신 MySQL 커넥터(JDBC 8.x)를 사용하는 경우
MySQL Connector/J 8.0 이상 버전을 사용한다면 드라이버 클래스명이 변경되었으며, 타임존 설정도 필요할 수 있습니다. 아래와 같이 수정하는 것을 권장합니다.
- 드라이버 클래스:
com.mysql.jdbc.Driver→com.mysql.cj.jdbc.Driver - JDBC URL에
serverTimezone=UTC(또는Asia/Seoul) 옵션 추가
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/" + databaseName
+ "?useSSL=false&serverTimezone=Asia/Seoul&user=" + userName + "&password=" + password);정리
이처럼 싱글톤 패턴을 적용하면 애플리케이션 어디서든 ConnectDatabase.getConnection()을 호출해 항상 동일한 데이터베이스 연결 객체를 얻을 수 있습니다. 다만 실제 운영 환경에서는 멀티스레드 환경에서의 동시성 문제나 연결 끊김 처리를 고려해야 하므로, 대규모 애플리케이션에서는 커넥션 풀(HikariCP, DBCP 등) 사용을 함께 검토하는 것이 좋습니다.