데이터베이스 연결 방법과 도구

DB 연결, IDE, Python SQLAlchemy, SSH 및 SSL 활용

이 글에서는 Cloud 데이터베이스 연결을 위한 다양한 방법과 도구를 살펴보고, DBeaver IDE, Python SQLAlchemy, SSH 터널링 및 SSL 보안 연결 방법을 설명한다.
Engineering
저자

Kwangmin Kim

공개

2023년 04월 02일

1 데이터베이스 연결 방법 개요

1.1 원격 데이터베이스 연결의 필요성과 중요성

현대 데이터 엔지니어링 환경에서는 대용량 데이터를 효율적으로 관리하기 위해 원격 데이터베이스 연결이 필수적이다.
이는 다음과 같은 이유에서 비롯된다:

  • 대용량 데이터 처리의 현실적 제약
    • 로컬 환경에서 테라바이트 이상의 데이터 처리 시 로컬 PC의 용량 하드웨어 한계 발생
    • 고성능 컴퓨팅 리소스가 필요한 분석 작업의 분산 처리 필요성
    • 데이터 증가에 따른 확장성(scalability) 확보의 어려움
  • 데이터 중앙화 및 일관성 유지
    • 여러 팀과 시스템 간 단일 데이터 소스(Single Source of Truth) 유지
    • 데이터 복제로 인한 불일치 및 중복 방지
    • 통합된 데이터 거버넌스 및 품질 관리 가능
  • 협업 환경 지원
    • 다수의 데이터 분석가, 엔지니어, 과학자 간 동시 작업 지원
    • 지리적으로 분산된 팀 간 데이터 공유 및 접근성 보장
    • 권한 관리를 통한 안전한 데이터 접근 제어
  • 운영 효율성 및 관리
    • 전문 DBA 팀을 통한 중앙 집중식 데이터베이스 관리
    • 백업, 복구, 모니터링 등의 운영 작업 효율화
    • 하드웨어 및 소프트웨어 리소스 최적화
  • 일상적인 데이터 작업의 빈도
    • 데이터 엔지니어는 하루 평균 수십~수백 번의 데이터베이스 연결 작업 수행
    • 데이터 파이프라인 구축 및 유지보수를 위한 지속적인 쿼리 실행
    • ETL 프로세스, 데이터 검증, 품질 확인 등 반복적 작업 수행
    • 실시간 데이터 모니터링 및 대시보드 업데이트를 위한 연속적 연결
  • 인프라 최적화 및 비용 효율성
    • 고성능 데이터베이스 서버의 리소스 공유를 통한 비용 절감
    • 필요에 따른 컴퓨팅 리소스 확장 및 축소 가능
    • 전용 데이터 인프라 구축 및 유지보수 비용 절감

1.2 데이터베이스 연결 방식의 종류

데이터베이스에 연결하는 방법은 크게 다음과 같이 분류할 수 있다:

  1. DBMS에 직접 연결
  • [용어정리] TCP/IP: 인터넷 통신의 기본 프로토콜
    • TCP(전송 제어 프로토콜)는 데이터 전송의 신뢰성을 보장
    • IP(인터넷 프로토콜)는 데이터 packet(데이터 전송 단위)의 주소 지정과 routing(패킷이 출발지에서 목적지까지 도달하기 위한 경로 결정 과정)을 담당
  • DB 서버에 직접 TCP/IP 연결(=DBMS에 직접 연결)을 위한 필수 정보:
    • Host: 보통 클라우드 서비스에서 제공하는 데이터베이스 서버의 IP 주소나 도메인 이름. (예: 192.168.1.100 또는 db-name.mysql.database.azure.com)
    • Port: 데이터베이스 서비스 포트(기본값은 MySQL: 3306, PostgreSQL: 5432 등)
    • User ID: 데이터베이스에 접근 권한이 있는 계정명 (예: admin, db_user, root)
    • Password: 해당 사용자 계정의 인증 비밀번호
  • DBMS의 IDE 중 가장 대중적인 DBeaver를 사용하는 경우의 연결 예시
    - DBeaver는 다양한 데이터베이스 시스템을 지원하는 무료 오픈소스 데이터베이스 관리 도구로 가장 대중적이다:
    • 다중 플랫폼 지원 (Windows, macOS, Linux)
    • 거의 모든 주요 데이터베이스 시스템 지원 (MySQL, PostgreSQL, Oracle, SQL Server 등)
    • SQL 편집기, 데이터 시각화, 스키마 관리 등 다양한 기능 제공
    • 플러그인 시스템을 통한 확장성
      • 상단의 메뉴에서 Database > New Database Connection 선택
      • 연결 방법
    • 데이터베이스 유형 선택 (MySQL, PostgreSQL 등)
    • 연결 정보 입력:
      • host: 192.168.1.100 또는 db-name.mysql.database.azure.com
      • port: 3306 (MySQL 기본값)
      • database: 연결할 데이터베이스 이름(선택사항, 입력하지 않으면 서버에 연결된 모든 DB 목록을 확인할 수 있음)
      • username: user123
      • password: pw123
      • python alchemy 연결 예시
    • SQLAlchemy는 Python에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 라이브러리이다:
      • SQL 표현 언어 제공
      • ORM 기능으로 객체 지향적 데이터베이스 작업 가능
      • 다양한 데이터베이스 시스템 지원
      • 트랜잭션 관리 및 연결 풀링 기능
    import sqlalchemy  
    from sqlalchemy import create_engine, text  
    from sqlalchemy.exc import SQLAlchemyError  
    
    def connect_to_database(host, user, password, database):  
        """SQLAlchemy를 사용하여 데이터베이스에 연결하고 엔진 객체를 반환"""  
        try:  
            connection_string = f"mysql+mysqlconnector://{user}:{password}@{host}:3306/{database}"  
            engine = create_engine(connection_string)  
            with engine.connect() as connection:  
                print(f"Successfully connected to the database: {database}")  
                return engine  
        except SQLAlchemyError as e:  
            print(f"Error: {e}")  
        return None  
  • 방화벽 설정이 필요하며 보안에 취약할 수 있음
  1. SSH 터널링을 통한 연결
    • [용어정리] SSH(Secure Shell): 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있게 해주는 암호화된 네트워크 프로토콜

    • 암호화된 SSH 채널을 통해 데이터베이스 연결

    • 직접 데이터베이스 포트를 외부에 노출하지 않아 보안 강화

    • 중간 서버(배스천 호스트)를 통한 연결 가능

    • SSH 터널링을 위한 필수 정보:

      • SSH 서버 정보:
        • host: SSH 서버의 IP 주소 또는 도메인 이름 (예: 123.45.67.89 또는 bastion.company.com)
        • port: SSH 서비스 포트 (기본값: 22)
        • username: SSH 서버 접속 계정 (예: ubuntu, ec2-user)
        • authentication method: 비밀번호 또는 SSH 키 파일 (.pem, .ppk 등)
      • 데이터베이스 서버 정보:
        • host: 내부 네트워크 상의 데이터베이스 서버 주소 (예: 10.0.0.5 또는 db-internal.company.local)
        • port: 데이터베이스 서비스 포트 (예: MySQL 3306, PostgreSQL 5432)
        • username: 데이터베이스 접속 계정 정보
        • password: 데이터베이스 접속 계정 정보
    • 연결 예시:

      # 로컬 포트 3307을 통해 원격 데이터베이스(10.0.0.5:3306)에 SSH 터널 설정  
      ssh -L 3307:10.0.0.5:3306 username@bastion.company.com -i ~/.ssh/private_key.pem  
      
      # 이후 로컬에서 데이터베이스 클라이언트로 localhost:3307에 연결하면   
      # 실제로는 원격 데이터베이스(10.0.0.5:3306)에 연결됨  
      mysql -h 127.0.0.1 -P 3307 -u db_user -p  
  2. SSL/TLS 암호화 연결
    • [용어정리] SSL/TLS: 네트워크 통신을 암호화하는 프로토콜

      • SSL(Secure Sockets Layer)은 원래 프로토콜이며, TLS(Transport Layer Security)는 더 안전한 후속 버전
      • 클라이언트와 서버 간 데이터를 암호화하여 도청, 변조를 방지
    • 데이터베이스 연결 시 SSL/TLS 사용의 장점:

      • 데이터 전송 시 암호화를 통한 보안 강화 (SSH와 유사하지만 SSH는 터널링을 통한 연결 보안, SSL/TLS는 직접 연결의 암호화)
      • 인증서 기반 연결로 데이터 무결성 보장 (SSH는 키 기반 인증, SSL/TLS는 인증서 기반 인증)
      • 규정 준수가 필요한 환경에서 필수적(GDPR, HIPAA 등)
      • SSH는 전체 연결 터널을 생성하는 반면, SSL/TLS는 기존 연결을 암호화하는 방식으로 작동
    • SSL/TLS 연결에 필요한 요소:

      • CA Certificate(CA 인증서): 인증 기관(Certificate Authority)에서 발급한 인증서로 서버/클라이언트 인증서의 유효성 검증
      • Server Certificate(서버 인증서): 데이터베이스 서버의 신원을 증명
      • Client Certificate(클라이언트 인증서): 클라이언트 인증이 필요한 경우 사용
      • Client Private Key(클라이언트 개인키): 클라이언트 인증서의 개인키
    • 연결 예시 (MySQL):

      # SSL 모드를 사용하여 MySQL에 연결  
      mysql -h db.example.com -u username -p --ssl-mode=REQUIRED  
      
      # 특정 인증서를 사용한 연결  
      mysql -h db.example.com -u username -p --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem  
  3. 클라우드 서비스 연결
  • 이런 저런 보안 관련해서 귀찮다면 클라우드 서비스 제공업체의 보안 시스템을 유료로 사용하여 관리형 연결 서비스 활용
  • 단, azure, aws, gcp 등의 제품 사용법 공부해야함
  • 클라우드 제공업체의 관리형 연결 서비스 활용
  • IAM 기반 인증 및 권한 관리
  • VPC, 프라이빗 엔드포인트 등을 통한 보안 연결
  1. MongoDB 접속 방법
    • [용어정리] MongoDB: NoSQL 데이터베이스로, JSON과 유사한 BSON 형식으로 데이터를 저장
    • [용어정리] BSON: Binary JSON, JSON의 바이너리 형식 표현
    • MongoDB 연결 문자열(Connection String) 구성 요소:
      • 프로토콜: mongodb://
      • 인증 정보: username:password@
      • 호스트: 서버 주소 (예: example.mongodb.net)
      • 데이터베이스: /database_name
      • 옵션: ?option1=value1&option2=value2
    • 연결 환경에 따른 접속 방법:
      1. 클라우드 환경(예: AKS)에서 직접 접속:
        [용어정리] AKS: Azure Kubernetes Service, 클라우드 환경에서 컨테이너 기반 애플리케이션 배포 및 관리를 위한 서비스

        mongodb://username:password@hostname/database?ssl=true|false  
        • 예시: mongodb://devuser_select:password@onesystem.mongo.dev.example.net/labide?ssl=false
        • 클라우드 내부 네트워크에서는 직접 연결이 가능하며 보안 설정에 따라 SSL 사용 여부 결정
      2. 외부 네트워크(사무실 등)에서 프록시를 통한 접속:

        mongodb://username:password@hostname/database?ssl=true|false&proxyHost=proxy_ip&proxyPort=port&proxyUsername=proxy_user&proxyPassword=proxy_password&authSource=auth_db  
        • 예시: mongodb://devuser_select:user123@onesystem.mongo.dev.sgarch.net/labide?ssl=false&proxyHost=20.249.209.8&proxyPort=1080&proxyUsername=mongo&authSource=labide&proxyPassword=mongo123
        • 프록시 서버를 통해 연결하여 보안 경계를 넘어 접속
        • MongoDB Compass 등의 GUI 도구에서 이 연결 문자열 사용 가능
    • 두 방식의 문자열의 공통 구성 요소
      • 사용자 이름: username (예: devuser_select)
      • 비밀번호: password (예: user123)
      • 호스트: hostname (예: onesystem.mongo.dev.sgarch.net)
      • 데이터베이스: database_name (예: labide)
      • SSL 사용 여부: ssl=true|false (예: ssl=false)
      • 프록시 정보: proxyHost=proxy_ip&proxyPort=port&proxyUsername=proxy_user&proxyPassword=proxy_password&authSource=auth_db (예: proxyHost=20.249.209.8&proxyPort=1080&proxyUsername=mongo&proxyPassword=mongo123&authSource=labide)
    • MongoDB 접속 도구:
      • MongoDB Compass: 그래픽 인터페이스를 제공하는 공식 관리 도구
      • MongoDB Shell(mongosh): 명령줄 인터페이스
      • 프로그래밍 언어별 드라이버: Python(pymongo), Node.js, Java 등
    • 보안 고려사항:
      • 프로덕션 환경에서는 항상 SSL/TLS 암호화 사용 권장
      • 강력한 비밀번호와 최소 권한 원칙 적용
      • 네트워크 수준에서 IP 화이트리스트 설정
      • 중요 데이터의 경우 필드 수준 암호화 고려

Subscribe

Enjoy this blog? Get notified of new posts by email: