1 데이터베이스 연결 방법 개요
1.1 원격 데이터베이스 연결의 필요성과 중요성
현대 데이터 엔지니어링 환경에서는 대용량 데이터를 효율적으로 관리하기 위해 원격 데이터베이스 연결이 필수적이다.
이는 다음과 같은 이유에서 비롯된다:
- 대용량 데이터 처리의 현실적 제약
- 로컬 환경에서 테라바이트 이상의 데이터 처리 시 로컬 PC의 용량 하드웨어 한계 발생
- 고성능 컴퓨팅 리소스가 필요한 분석 작업의 분산 처리 필요성
- 데이터 증가에 따른 확장성(scalability) 확보의 어려움
- 로컬 환경에서 테라바이트 이상의 데이터 처리 시 로컬 PC의 용량 하드웨어 한계 발생
- 데이터 중앙화 및 일관성 유지
- 여러 팀과 시스템 간 단일 데이터 소스(Single Source of Truth) 유지
- 데이터 복제로 인한 불일치 및 중복 방지
- 통합된 데이터 거버넌스 및 품질 관리 가능
- 여러 팀과 시스템 간 단일 데이터 소스(Single Source of Truth) 유지
- 협업 환경 지원
- 다수의 데이터 분석가, 엔지니어, 과학자 간 동시 작업 지원
- 지리적으로 분산된 팀 간 데이터 공유 및 접근성 보장
- 권한 관리를 통한 안전한 데이터 접근 제어
- 다수의 데이터 분석가, 엔지니어, 과학자 간 동시 작업 지원
- 운영 효율성 및 관리
- 전문 DBA 팀을 통한 중앙 집중식 데이터베이스 관리
- 백업, 복구, 모니터링 등의 운영 작업 효율화
- 하드웨어 및 소프트웨어 리소스 최적화
- 전문 DBA 팀을 통한 중앙 집중식 데이터베이스 관리
- 일상적인 데이터 작업의 빈도
- 데이터 엔지니어는 하루 평균 수십~수백 번의 데이터베이스 연결 작업 수행
- 데이터 파이프라인 구축 및 유지보수를 위한 지속적인 쿼리 실행
- ETL 프로세스, 데이터 검증, 품질 확인 등 반복적 작업 수행
- 실시간 데이터 모니터링 및 대시보드 업데이트를 위한 연속적 연결
- 데이터 엔지니어는 하루 평균 수십~수백 번의 데이터베이스 연결 작업 수행
- 인프라 최적화 및 비용 효율성
- 고성능 데이터베이스 서버의 리소스 공유를 통한 비용 절감
- 필요에 따른 컴퓨팅 리소스 확장 및 축소 가능
- 전용 데이터 인프라 구축 및 유지보수 비용 절감
- 고성능 데이터베이스 서버의 리소스 공유를 통한 비용 절감
1.2 데이터베이스 연결 방식의 종류
데이터베이스에 연결하는 방법은 크게 다음과 같이 분류할 수 있다:
- DBMS에 직접 연결
- [용어정리] TCP/IP: 인터넷 통신의 기본 프로토콜
- TCP(전송 제어 프로토콜)는 데이터 전송의 신뢰성을 보장
- IP(인터넷 프로토콜)는 데이터 packet(데이터 전송 단위)의 주소 지정과 routing(패킷이 출발지에서 목적지까지 도달하기 위한 경로 결정 과정)을 담당
- TCP(전송 제어 프로토콜)는 데이터 전송의 신뢰성을 보장
- 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: 해당 사용자 계정의 인증 비밀번호
- Host: 보통 클라우드 서비스에서 제공하는 데이터베이스 서버의 IP 주소나 도메인 이름. (예: 192.168.1.100 또는 db-name.mysql.database.azure.com)
- 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 연결 예시
- host: 192.168.1.100 또는 db-name.mysql.database.azure.com
- SQLAlchemy는 Python에서 가장 널리 사용되는 ORM(Object-Relational Mapping) 라이브러리이다:
- SQL 표현 언어 제공
- ORM 기능으로 객체 지향적 데이터베이스 작업 가능
- 다양한 데이터베이스 시스템 지원
- 트랜잭션 관리 및 연결 풀링 기능
- SQL 표현 언어 제공
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 - 다중 플랫폼 지원 (Windows, macOS, Linux)
- 방화벽 설정이 필요하며 보안에 취약할 수 있음
- 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: SSH 서버의 IP 주소 또는 도메인 이름 (예: 123.45.67.89 또는 bastion.company.com)
- 데이터베이스 서버 정보:
- host: 내부 네트워크 상의 데이터베이스 서버 주소 (예: 10.0.0.5 또는 db-internal.company.local)
- port: 데이터베이스 서비스 포트 (예: MySQL 3306, PostgreSQL 5432)
- username: 데이터베이스 접속 계정 정보
- password: 데이터베이스 접속 계정 정보
- host: 내부 네트워크 상의 데이터베이스 서버 주소 (예: 10.0.0.5 또는 db-internal.company.local)
- SSH 서버 정보:
연결 예시:
# 로컬 포트 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
- SSL/TLS 암호화 연결
[용어정리] SSL/TLS: 네트워크 통신을 암호화하는 프로토콜
- SSL(Secure Sockets Layer)은 원래 프로토콜이며, TLS(Transport Layer Security)는 더 안전한 후속 버전
- 클라이언트와 서버 간 데이터를 암호화하여 도청, 변조를 방지
- SSL(Secure Sockets Layer)은 원래 프로토콜이며, TLS(Transport Layer Security)는 더 안전한 후속 버전
데이터베이스 연결 시 SSL/TLS 사용의 장점:
- 데이터 전송 시 암호화를 통한 보안 강화 (SSH와 유사하지만 SSH는 터널링을 통한 연결 보안, SSL/TLS는 직접 연결의 암호화)
- 인증서 기반 연결로 데이터 무결성 보장 (SSH는 키 기반 인증, SSL/TLS는 인증서 기반 인증)
- 규정 준수가 필요한 환경에서 필수적(GDPR, HIPAA 등)
- SSH는 전체 연결 터널을 생성하는 반면, SSL/TLS는 기존 연결을 암호화하는 방식으로 작동
- 데이터 전송 시 암호화를 통한 보안 강화 (SSH와 유사하지만 SSH는 터널링을 통한 연결 보안, SSL/TLS는 직접 연결의 암호화)
SSL/TLS 연결에 필요한 요소:
- CA Certificate(CA 인증서): 인증 기관(Certificate Authority)에서 발급한 인증서로 서버/클라이언트 인증서의 유효성 검증
- Server Certificate(서버 인증서): 데이터베이스 서버의 신원을 증명
- Client Certificate(클라이언트 인증서): 클라이언트 인증이 필요한 경우 사용
- Client Private Key(클라이언트 개인키): 클라이언트 인증서의 개인키
- CA Certificate(CA 인증서): 인증 기관(Certificate Authority)에서 발급한 인증서로 서버/클라이언트 인증서의 유효성 검증
연결 예시 (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
- 클라우드 서비스 연결
- 이런 저런 보안 관련해서 귀찮다면 클라우드 서비스 제공업체의 보안 시스템을 유료로 사용하여 관리형 연결 서비스 활용
- 단, azure, aws, gcp 등의 제품 사용법 공부해야함
- 클라우드 제공업체의 관리형 연결 서비스 활용
- IAM 기반 인증 및 권한 관리
- VPC, 프라이빗 엔드포인트 등을 통한 보안 연결
- MongoDB 접속 방법
- [용어정리] MongoDB: NoSQL 데이터베이스로, JSON과 유사한 BSON 형식으로 데이터를 저장
- [용어정리] BSON: Binary JSON, JSON의 바이너리 형식 표현
- MongoDB 연결 문자열(Connection String) 구성 요소:
- 프로토콜:
mongodb://
- 인증 정보:
username:password@
- 호스트: 서버 주소 (예:
example.mongodb.net)
- 데이터베이스:
/database_name
- 옵션:
?option1=value1&option2=value2
- 프로토콜:
- 연결 환경에 따른 접속 방법:
클라우드 환경(예: 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 사용 여부 결정
- 예시:
외부 네트워크(사무실 등)에서 프록시를 통한 접속:
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 등
- MongoDB Compass: 그래픽 인터페이스를 제공하는 공식 관리 도구
- 보안 고려사항:
- 프로덕션 환경에서는 항상 SSL/TLS 암호화 사용 권장
- 강력한 비밀번호와 최소 권한 원칙 적용
- 네트워크 수준에서 IP 화이트리스트 설정
- 중요 데이터의 경우 필드 수준 암호화 고려
- 프로덕션 환경에서는 항상 SSL/TLS 암호화 사용 권장
- [용어정리] MongoDB: NoSQL 데이터베이스로, JSON과 유사한 BSON 형식으로 데이터를 저장