[java] 리플렉션을 사용한 데이터베이스 처리

이번 포스트에서는 리플렉션(Reflection)을 사용하여 Java 언어로 데이터베이스를 처리하는 방법에 대해 알아보겠습니다.

리플렉션은 실행 시간에 애플리케이션의 구조를 조사하거나 수정할 수 있는 능력을 의미합니다. 이를 통해 클래스의 메소드, 필드, 생성자 등을 동적으로 조작할 수 있어, 데이터베이스 처리와 같이 동적인 작업을 할 때 유용하게 사용됩니다.

1. 리플렉션을 이용한 데이터베이스 연결

데이터베이스 연결을 위해 사용되는 설정 정보들은 보통 프로퍼티 파일이나 설정 파일에 저장되어 있습니다. 이때 리플렉션을 이용하면 설정 정보를 바탕으로 동적으로 데이터베이스에 연결할 수 있습니다.

import java.lang.reflect.Constructor;
import java.sql.Connection;
import java.sql.DriverManager;

public class DatabaseConnector {

    public static Connection getConnection(String driver, String url, String username, String password) throws Exception {
        Class<?> driverClass = Class.forName(driver);
        Constructor<?> driverConstructor = driverClass.getConstructor();
        Object driverInstance = driverConstructor.newInstance();
        
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }
}

위의 코드에서는 드라이버 클래스의 이름을 받아와 Class.forName()을 통해 해당 클래스를 동적으로 로딩하고, getConstructor()newInstance()를 사용하여 객체를 생성한 뒤, DriverManager.getConnection()을 호출하여 데이터베이스에 연결하는 예제 코드입니다.

2. 리플렉션을 이용한 데이터베이스 CRUD

리플렉션을 사용하면 특정 클래스의 필드 정보를 가져와 데이터를 동적으로 처리할 수 있습니다. 이를 통해 일반적으로 작성되는 데이터베이스 CRUD(Create, Read, Update, Delete) 코드를 더 간단하게 작성할 수 있습니다.

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseHandler {

    public static void insertData(Connection conn, Object data) throws SQLException, IllegalAccessException {
        Class<?> dataClass = data.getClass();
        Field[] fields = dataClass.getDeclaredFields();
        
        String query = "INSERT INTO " + dataClass.getSimpleName() + " VALUES (";
        for (Field field : fields) {
            field.setAccessible(true);
            query += "'" + field.get(data) + "', ";
        }
        query = query.substring(0, query.length() - 2) + ")";
        
        PreparedStatement statement = conn.prepareStatement(query);
        statement.executeUpdate();
    }
}

위의 코드는 데이터를 삽입하는 메소드 예시로, data 객체의 필드 정보를 리플렉션을 통해 동적으로 가져와 SQL 쿼리를 생성하여 데이터베이스에 삽입하는 코드입니다.

이처럼 리플렉션을 사용하면 데이터베이스 처리를 더 동적이고 유연하게 할 수 있습니다. 하지만 과용하면 코드의 가독성이 떨어지고, 성능에 영향을 줄 수 있으므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.

참고 자료