앱에서 Azure Database for MySQL 유연한 서버에 연결 및 쿼리

완료됨

Azure Database for MySQL - 유연한 서버는 선호하는 도구, 언어 및 프레임워크를 사용하여 앱을 개발할 수 있는 유연성을 제공합니다. Visual Studio Code 및 GitHub와 같은 강력한 개발 도구를 계속 사용하고 PHP, Java, Python, Node.js, C#, Ruby, Rust, Go 등과 같은 프로그래밍 언어를 사용하여 개발할 수 있습니다. 또한 WordPress 또는 Drupal과 같은 널리 사용되는 CMS(콘텐츠 관리 시스템), Moodle과 같은 LMS(학습 관리 시스템), Magento와 같은 전자상거래 플랫폼 등과 Flex Server를 통합할 수도 있습니다.

선택한 언어를 사용하여 앱에서 Azure Database for MySQL 유연한 서버에 연결하고 쿼리하는 것과 관련된 다양한 작업을 살펴보겠습니다.

1 - 연결 정보 가져오기

첫 번째 작업은 Azure Database for MySQL 유연한 서버에 연결하는 데 필요한 연결 정보(서버 이름, 데이터베이스 이름 및 로그인 자격 증명)를 가져오는 것입니다.

Azure Portal에서 MySQL 유연한 서버 리소스로 이동한 다음 서버 이름서버 관리자 로그인 이름을 기록해 둡니다.

2 - SSL 인증서 받기

앱이 SSL(Secure Sockets Layer)을 사용하여 MySQL 유연한 서버용 Azure Database에 연결되도록 하여 전송 중인 데이터를 보호하는 것이 좋습니다. 다음 스크린샷과 같이 Azure Portal의 네트워킹 블레이드에서 공용 SSL 인증서를 다운로드할 수 있습니다.

Azure Portal의 Azure Database for MySQL 네트워킹 블레이드를 보여주는 스크린샷.

인증서 파일을 원하는 위치에 저장합니다.

PHP용 MySQL 확장

PHP 앱에서 MySQL에 연결하려면 다음 확장 중 하나를 사용할 수 있습니다.

  • MySQLi(MySQL 개선) 확장입니다. MySQLi 확장은 PHP 버전 5 이상에 포함되어 있으며 MySQL 데이터베이스 연결 및 작업을 간소화하기 위한 개체 지향 및 절차적 인터페이스를 제공합니다.
  • PDO_MYSQL PDO 또는 PHP 데이터 개체 확장은 PHP의 데이터베이스에 액세스하기 위한 인터페이스를 정의합니다. PDO_MYSQL은 PHP에서 MySQL 데이터베이스에 액세스할 수 있도록 PDO 인터페이스를 구현하는 MySQL 특정 드라이버입니다.

확장을 사용하려면 연결된 줄의 주석 처리를 제거하여 php.ini 구성 파일에서 확장을 사용하도록 설정해야 합니다. 예를 들어 MySQLi를 사용하려는 경우 파일의 extension=mysqli 줄 주석 처리를 제거합니다.

3 - PHP를 사용하여 MySQL 유연한 서버에 연결 및 쿼리

연결 옵션이 있지만 이 단원에서는 MySQLi 확장을 사용하여 PHP 앱에서 Azure Database for MySQL 유연한 서버에 연결하는 방법을 보여 줍니다.

또한 OpenSSL 확장을 사용하여 SSL을 통해 암호화된 연결을 설정해야 합니다. MySQLi에서 수행한 것처럼 php.ini 파일의 extension=openssl 줄 주석 처리를 해제하여 OpenSSL 확장을 사용하도록 설정합니다.

연결 설정

MySQLi를 사용하여 MySQL 유연한 서버에 대한 연결을 설정하려면 PHP 앱에서 다음 코드 조각을 사용할 수 있습니다. host, username, passworddb_name 매개 변수를 사용자의 값으로 바꾼 다음, mysqli_ssl_set() 메서드에서 다운로드한 SSL 인증서 경로에 대한 경로를 제공해야 합니다.

$host = '<your_server_name>.mysql.database.azure.com';
$username = '<your_admin_username';
$password = '<your_password>';
$db_name = '<your_database_name>';

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "<your_path_to_SSL_cert>", NULL, NULL);
mysqli_real_connect($conn, $host, $username, $password, $db_name, 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno($conn)) {
    die('Failed to connect to MySQL: '.mysqli_connect_error());
}
printf("Connection Established.\n");
  • mysqli_init() 메서드는 MySQLi를 초기화하고 mysqli_real_connect()에서 사용할 개체를 반환합니다.
  • mysqli_ssl_set()는 SSL을 사용하여 보안 연결을 설정하는 데 사용됩니다. 이 메서드는 다운로드한 SSL 인증서의 경로를 사용합니다. OpenSSL 확장을 사용하지 않는 한 이 함수는 아무 작업도 수행하지 않습니다.
  • mysqli_real_connect() 메서드는 MySQL 데이터베이스 엔진에 대한 연결을 엽니다. MySQL 유연한 서버 연결 정보를 인수로 전달하여 연결을 설정합니다.

데이터베이스 작업 수행

유연한 서버 데이터베이스에 대한 연결을 설정한 후 쿼리를 수행하는 mysqli_query() 등의 메서드를 사용합니다. 예시:

mysqli_query($conn, '
CREATE TABLE Products (
`Id` INT NOT NULL AUTO_INCREMENT ,
`ProductName` VARCHAR(200) NOT NULL ,
`Price` DOUBLE NOT NULL ,
PRIMARY KEY (`Id`)
);
')

쿼리에 변수 입력이 포함된 경우 매개 변수가 있는 준비된 문을 대신 사용합니다. 이는 웹 해커가 사용하는 가장 일반적인 기술 중 하나인 SQL 삽입 공격으로부터 보호합니다.

MySQLi와 함께 준비된 문을 사용하여 테이블에 데이터를 삽입하는 코드 조각은 다음과 같습니다.

$product_name = 'BrandNewProduct';
$product_price = 15;

//Create a prepared statement
if ($stmt = mysqli_prepare($conn, "INSERT INTO Products (ProductName, Price) VALUES (?, ?)")) {
    //Binds the parameters for each column value
    mysqli_stmt_bind_param($stmt, 'ssd', $product_name, $product_price);
    //Run the prepared statement
    mysqli_stmt_execute($stmt);
    printf("Insert: Affected %d rows\n", mysqli_stmt_affected_rows($stmt));
    //Close the prepared statement
    mysqli_stmt_close($stmt);
}

연결 닫기

데이터베이스 작업을 완료한 후에는 mysqli_close() 메서드를 사용하여 데이터베이스 연결을 닫는 것이 좋습니다.

mysqli_close($conn);

Python용 MySQL 커넥터

Python 앱에서 MySQL에 연결하려면 MySQL 서버 또는 PyMySQL과 통신하기 위해 자체 포함된 Python 드라이버인 MySQL 커넥터/Python을 사용하면 됩니다.

Python 패키지 설치 관리자(pip)를 사용하여 이러한 커넥터를 쉽게 설치할 수 있습니다. 예를 들어 pip install mysql-connector-python

3 - Python을 사용하여 Azure Database for MySQL - 유연한 서버에 연결 및 쿼리

연결 옵션이 있지만 이 단원에서는 MySQL Connector/Python을 사용하여 PHP 앱에서 Azure Database for MySQL - 유연한 서버에 연결하는 방법을 보여 줍니다.

연결 설정

Python 앱에서 MySQL 유연한 서버에 대한 연결을 설정하는 데 사용할 수 있는 코드 조각은 다음과 같습니다. host, user, passworddatabase 매개 변수를 사용자의 값으로 바꾸고, ssl_ca 옵션에서 다운로드한 SSL 인증서의 경로를 제공해야 합니다.

import mysql.connector
from mysql.connector import errorcode

# Flexible server connection information
config = {
  'host':'<your_server_name>.mysql.database.azure.com',
  'user':'<your_admin_username>',
  'password':'<your_password>',
  'database':'<your_database_name>',
  'client_flags': [mysql.connector.ClientFlag.SSL],
  'ssl_ca': '<your_path_to_SSL_cert>'
}

# Establish connection and obtain cursor object
try:
    conn = mysql.connector.connect(**config)
    print("Connection established")
except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with the user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")
    else:
        print(err)
else:
    cursor = conn.cursor()
  • mysql.connector.connect() 메서드는 MySQL 서버와의 연결을 설정하고 연결 개체를 반환합니다. MySQL 유연한 서버 연결 정보 개체를 인수로 전달하여 연결을 설정합니다.
  • 연결 개체의 cursor() 메서드는 MySQL 서버와 상호 작용하는 데 사용할 수 있는 커서를 만듭니다.

데이터베이스 작업 수행

MySQL 유연한 서버 데이터베이스에 대한 연결을 설정한 후 커서 개체를 사용하고 cursor.execute() 메서드를 호출하여 데이터베이스 작업을 수행합니다. 예시:

# Create table
cursor.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);")

# Insert some data into table
cursor.execute("INSERT INTO inventory (name, quantity) VALUES (%s, %s);", ("banana", 150))

연결 닫기

MySQL Connector/Python은 트랜잭션을 자동으로 커밋하지 않으므로 데이터를 수정하는 모든 트랜잭션 후에는 연결 개체의 commit() 메서드(예: conn.commit())를 호출하는 것이 중요합니다.

모든 작업을 수행한 후에 커서와 연결 개체를 닫는 것이 좋습니다.

cursor.close()
conn.close()

Java용 MySQL 커넥터

Java 앱에서 MySQL에 연결하려면 클라이언트 라이브러리를 활용하는 대신 Java에서 MySQL 프로토콜을 기본적으로 구현하는 JDBC 호환 API인 MySQL Connector/J를 사용하면 됩니다. 이진 배포에서 또는 Apache Maven 종속성 관리자를 사용하여 MySQL Connector/J를 설치할 수 있습니다.

또는 Spring Data JPA와 같은 프레임워크를 사용하여 Java에서 MySQL에 연결할 수도 있습니다.

3 - Java를 사용하여 Azure Database for MySQL - 유연한 서버에 연결 및 쿼리

연결 옵션이 있지만 이 단원에서는 MySQL Connector/J을 사용하여 Java 앱에서 Azure Database for MySQL - 유연한 서버에 연결하는 방법을 보여 줍니다.

연결 정보 저장

MySQL 유연한 서버 연결 정보를 저장하기 위해 소스 코드의 리소스 섹션에 application.properties 파일을 만드는 것이 좋습니다.

url=jdbc:mysql://<your_server_name>.mysql.database.azure.com:3306/<your_database_name>?serverTimezone=UTC
user=<your_admin_username>
password=<your_password>

연결 설정

애플리케이션 서버 외부에서 JDBC를 사용하는 경우 java.sql 패키지의 DriverManager 클래스는 연결 설정을 관리합니다. MySQL 유연한 서버에 연결하려면 먼저 application.properties 파일에서 연결 속성을 로드하고 이러한 연결 속성을 전달하여 DriverManager의 getConnection() 메서드를 호출합니다.

import java.sql.*;

public class DemoApplication {

    public static void main(String[] args) throws Exception {

        //Load application properties
        Properties properties = new Properties();
        properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));

        //Establish Connection to database
        Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);

        .
        .

    }
}

데이터베이스 작업 수행

연결을 설정하고 Connection 개체를 가져온 후 개체의 createStatement() 메서드를 호출하여 Statement 개체를 만들 수 있습니다. Statement 인스턴스가 있으면 사용하려는 SQL 사용하여 executeQuery(String) 메서드를 호출하면 SELECT 쿼리를 실행할 수 있습니다. 데이터베이스의 데이터를 업데이트하려면 executeUpdate(String SQL) 메서드를 사용합니다.

예를 들면 다음과 같습니다.

Statement statement = connection.createStatement();
statement.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER)");
statement.executeUpdate("INSERT INTO inventory (name, quantity) VALUES (\"banana\", 150)");
ResultSet resultSet = statement.executeQuery("SELECT * FROM inventory");

쿼리에 변수 입력이 포함된 경우 매개 변수가 있는 준비된 문을 대신 사용해야 합니다. 이는 웹 해커가 사용하는 가장 일반적인 기술 중 하나인 SQL 삽입 공격으로부터 보호합니다. 준비된 문을 사용하려면 Connection 개체의 prepareStatement() 메서드를 호출하여 PreparedStatement 개체를 만들고, 매개 변수를 바인딩하고, executeUpdate() 메서드를 사용하여 준비된 문을 실행하면 됩니다.

연결 닫기

데이터베이스 작업을 완료한 후에는 연결 개체의 close() 메서드를 사용하여 데이터베이스 연결을 닫는 것이 좋습니다. 예를 들어 connection.close();