ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Database Driver 알아보기
    Database 2023. 11. 4. 07:47
    728x90
    반응형

    - 목차

     

    소개.

    DatabaseDriver 에 대해서 알아보도록 하겠습니다.

    DriverApplicationDatabase 를 잇는 중간다리 역할을 합니다.

    Application 과 Database 가 소통을 하기 위해서 필요한 기능들을 수행하는데요.

    예를 들어, Connection, Serialization/Deserialization 등이 있습니다.

    Application 과 Database 는 보통 물리적으로 떨어져 있을 겁니다. 서로 다른 서버인 것이죠.

    그래서 이들은 네트워크적으로 연결이 되어있어야하고,

    Application 과 Database 가 서로 통신할 수 있도록 Connection 이 관리됩니다.

     

    그리고 이들은 서로 데이터를 주고 받습니다.

    Application 은 Database 에게 데이터를 조회하거나 생성할 것이며,

    Database 는 Application 의 DML, DDL, DCL 들의 요청을 처리해야합니다.

    (DML, DDL, DCL 은 우리가 흔히 하는 create, insert ,update 등의 쿼리를 의미합니다. )

     

    Driver 는 Application, Database 사이에 놓여서 이들을 중계합니다.

    서로 다른 프로그래밍 언어, 서로 다른 위치에 놓인 이 서비스들의 소통을 책임집니다.

     

     

    Database Connector API.

    DBMS 의 Connector API 라는 것들이 있습니다.

    아래 예시는 MySQL 의 Connector API 들의 목록을 제가 복사해 온것인데요.

    각 런타임 환경에 맞는 Connector 들이 존재합니다.

    JDBC, ODBC, Python, Javascript 등등 대체로 프로그래밍 언어에 따라 존재합니다.

     

    < https://dev.mysql.com/doc/index-connectors.html >

    Java
    Language	Title	HTML Online	PDF
    English	Connector/J Developer Guide	View	US Ltr | A4
    
    Python
    Language	Title	Version	HTML Online	PDF
    English	Connector/Python Developer Guide		View	US Ltr | A4
    English	MySQL Shell Python API Reference	8.2	View	
    
    JavaScript
    Language	Title	Version	HTML Online	PDF
    English	Connector/Node.js Release Notes		View	US Ltr | A4
    English	MySQL Shell JavaScript API Reference	8.2	View	
    
    C++
    Language	Title	Version	HTML Online	PDF
    English	Connector/C++ Developer Guide	8.2	View	US Ltr | A4
    English	Connector/C++ X DevAPI Reference		View	
    
    C#
    Language	Title	Version	HTML Online	PDF
    English	Connector/NET API Reference	8.2	View	
    
    C API
    Language	Title	Version	HTML Online	PDF
    English	C API Developer Guide	8.2	View	US Ltr | A4
    
    PHP
    Language	Title	HTML Online	PDF
    English	PHP API	View	US Ltr | A4
    
    Other
    Language	Title	Version	HTML Online	PDF
    English	Connector/ODBC Developer Guide		View	US Ltr | A4
    English	Connector/ODBC Release Notes		View	US Ltr | A4

     

     

    그럼 Connector API 는 무엇일까요 ?

    Connector API 는 DBMS 에 가장 앞단에서 클라이언트와 소통하는 영역입니다.

    대략적으로 아래의 구조로 소통이 발생합니다.

    Client 인 Application 이 Driver 를 가지구요.

    Database 내부의 Connector 가 Driver 와 소통합니다.

     

     

    위에서 언급했듯이, Connector 또한 종류가 많습니다.

    프로그래밍 언어와 런타임 환경의 갯수가 많기 때문에 MySQL 만 하더라도,

    Java, JavaScript, PHP, Python, Golang, C/C++ 등을 지원합니다.

    그래서 이들을 위한 Connector 가 MySQL 내부에 내장되어있고,

    Connector 와 상응하는 Driver 또한 존재하죠.

    그래서 NodeJS 서버와 MySQL 을 사용한다면,

    MySQL 의 Javascript 관련 Connector 와 Driver 를 사용해야합니다.

    그리고 Java 와 MySQL 의 조합이라면, JDBC Driver 와 Connector 를 사용해야죠.

    이때, 적절한 Driver 를 선택하면 Connector 와의 연결을 알아서 수행합니다.

     

    < java 예시 코드 >

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class JDBCMysqlExample {
        public static void main(String[] args) {
            // JDBC URL for the MySQL database
            String jdbcUrl = "jdbc:mysql://localhost:3306/your_database";
            String username = "your_username";
            String password = "your_password";
    
            Connection connection = null;
    
            try {
                // Establish a connection to the MySQL database
                connection = DriverManager.getConnection(jdbcUrl, username, password);
    
                if (connection != null) {
                    System.out.println("Connected to MySQL database");
                    // Perform database operations here
                } else {
                    System.out.println("Failed to connect to the database");
                }
            } catch (SQLException e) {
                System.err.println("Database connection error: " + e.getMessage());
            } finally {
                try {
                    if (connection != null) {
                        connection.close();
                        System.out.println("MySQL connection is closed");
                    }
                } catch (SQLException e) {
                    System.err.println("Error closing the database connection: " + e.getMessage());
                }
            }
        }
    }

     

     

     

    Connections.

    저희는 Application 과 Database 의 연결이 사실상 Driver 와 Connector 의 연결임을 알게되었습니다.

    그리고 이러한 연결이 필요한 이유는 Application 과 Database 는 물리적으로 떨어져있기 때문이죠.

    그래서 네트워크적인 연결이 필요합니다.

     

    Driver 와 Connector 들이 수행하는 역할 중의 하나가 바로 Connection 입니다.

    보통 MySQL 같은 경우에는 3306 포트를 리스닝하고 있습니다.

    그래서 Application 은 MySQL 과 통신을 하기 위해서 MySQL 의 3306 포트에 연결합니다.

    예를 들어, Application 과 MySQL 모두 localhost 에 위치한다고 가정하겠습니다.

    이때, Application 는 MySQL 과 소통하기 위해서 localhost:3306 로 연결을 시도할 수 있습니다.

     

    이 과정에서 TCP 방식으로 작성하게 된다면,

    아래 예시처럼

    1. Socket 을 생성하고,

    2. port 에 바인딩하고,

    3. Database 와 통신할 버퍼를 생성하고,

    4.쓰고,

    5.읽기

    6. Read, Write 를 위한 Thread 관리도 해야하고,

    등등 해야할 일들이 너무 많아집니다.

    이러한 Connection 과 관련된 복잡한 작업들을 Driver 가 모두 수행해줍니다.

    즉, Connection 과 관련된 모든 작업들이 추상화되어 제공되는 것이죠.

     

    < TCP 통신을 위한 Code 예시 >

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) {
            String serverHost = "localhost"; // Replace with the server's hostname or IP address
            int serverPort = 12345; // Replace with the server's port number
    
            try (Socket socket = new Socket(serverHost, serverPort);
                 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                 BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)) ) {
    
                System.out.println("Connected to the server. You can start sending messages.");
    
                String userInputString;
                while ((userInputString = userInput.readLine()) != null) {
                    out.println(userInputString); // Send user input to the server
    
                    String serverResponse = in.readLine(); // Receive a response from the server
                    System.out.println("Server says: " + serverResponse);
                }
            } catch (IOException e) {
                System.err.println("Error: " + e.getMessage());
            }
        }
    }

     

     

    Serialization.

    Driver Connector 가 통신을 할 때,

    서로 약속된 Serialization 방식이 없다면, 프로그래밍 언어나 런타임 환경에 맞는 방식으로 Serialization/Deserization 을 시도합니다.

    Python 환경에서 Python Driver 와 Python Connector 가 서로 연결이 되며,

    이때 사용할 Serialization/Deserization 이 결정되죠.

    따라서 Driver 와 Connector 의 매칭이 Serialization 관점에서도 중요합니다.

     

    Native Driver & Middleware Driver.

    Driver 와 Connector 에 대해서 살펴보면 Native Driver 에 대한 언급을 볼 수 있습니다.

    그리고 Native Driver 에 반대되는 Driver 가 Middleware Driver 입니다.

    우리들이 흔히 사용하는 대부분의 Driver 들이 바로 Middleware Driver 입니다.

    반면 Native Driver 는 데이터베이스에서 사용하는 프로그래밍 언어와 Serialization 방식을 공통적으로 사용하는 Driver 로써,

    C/C++ 로 작성된 MySQL 인 경우에는 Native Driver 또한 같은 프로그래밍 언어와 Serialization 방식을 사용합니다.

    이러한 Native Driver 의 장점은 Converting 에 사용되는 낭비를 최소화할 수 있습니다.

    예를 들어, JDBC Driver 로 전달받은 데이터들은 MySQL 이 이해하기 위해서는 C/C++ 데이터로 변환이 되어야하죠.

    이러한 관점에서 Native Driver 는 조금 더 효율적이라고 할 수 있습니다.

     

    하지만, 현실의 세계에선 데이터베이스의 Native Driver 를 사용하기 위해서 개발 환경을 결정할 순 없겠죠.

    그래서 Middleware Driver 를 많이 사용합니다.

     

     

     

    반응형

    'Database' 카테고리의 다른 글

    [MySQL] Master Slave 구성해보기 ( Replication , Replica )  (0) 2024.02.16
    MySQL User, Grant 생성하기.  (0) 2023.12.15
    MySQL Index 알아보기  (0) 2023.10.30
    MySQL Page 알아보기  (0) 2023.10.30
    MySQL Buffer Pool 알아보기  (0) 2023.10.30
Designed by Tistory.