### 요약 - DB를 활용해서 사진, 영상을 관리할 수 있으며, 추천 DB로는 PostgreSQL과 MongDB가 있음 - [[PostgreSQL과 MongoDB 차이점]] - **(설치방법)** EC2에 우분투를 설치한 뒤 PostgreSQL을 설치한다. DB의 기본 설정을 해준 다음, S3 버킷의 데이터와 연동해준다. 이 때 연동은 S3의 URL을 DB가 가져오면서 메타값을 입력하는 것으로 사용하게 된다. - **(사진저장)** python에 boto를 설치해서 파일을 저장하는 방식으로 활용하면 대량의 사진을 저장할 수 있을 것으로 보인다. 이와 관련된 명령어를 따로 알아두면 좋겠다. - **(활용방법)** 저장된 사진과 영상은 python의 Flask를 활용해서 웹애플리케이션에서 볼 수 있도록 제작할 수 있다. 이때 PostgreSQL의 DB를 가져와서 보여주는 방식이 된다. - **(예상)** 만약 내가 정제된 사진과 영상을 계속해서 쌓아서 DB에 넣는다면 웹에서 보여줄 수 있는 방식으로 제작이 가능하다. S3에 용량을 사용하게 되면서 비용은 계속 발생하지만, 체계적이다. 안전하다. --- 육아 유튜브를 하면서 사진과 영상을 효과적으로 관리하기 위해 데이터베이스(DB)를 활용하는 것은 매우 좋은 생각입니다. DB를 활용하면 자료를 체계적으로 정리하고, 필요할 때 쉽게 검색할 수 있으며, 중복된 자료를 피하고 백업을 용이하게 할 수 있습니다. 몇 가지 추천하는 DB와 그 이유, 그리고 사용 방법에 대해 설명드리겠습니다. ### 추천하는 데이터베이스 1. **SQLite** - **이유**: SQLite는 서버가 필요 없는 내장형 데이터베이스로, 설치 및 설정이 간단하고 작은 프로젝트나 개인 사용에 적합합니다. 특히 초기 단계에서 빠르게 시작하기 좋습니다. - **사용 방법**: - 파이썬에서 SQLite를 사용하려면 `sqlite3` 모듈을 이용할 수 있습니다. - 예제 ```python import sqlite3 # 데이터베이스 연결 conn = sqlite3.connect('media_management.db') cursor = conn.cursor() # 테이블 생성 cursor.execute('''CREATE TABLE IF NOT EXISTS media ( id INTEGER PRIMARY KEY, filename TEXT, filetype TEXT, date_taken TEXT, description TEXT)''') # 데이터 삽입 cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description) VALUES (?, ?, ?, ?)''', ('baby_photo.jpg', 'image', '2024-07-09', 'Baby smiling')) # 데이터 조회 cursor.execute('SELECT * FROM media') print(cursor.fetchall()) # 변경사항 저장 및 연결 종료 conn.commit() conn.close() ``` **PostgreSQL** - **이유**: PostgreSQL은 오픈 소스 관계형 데이터베이스로, 강력한 기능을 제공하며 확장성이 뛰어납니다. 특히 데이터가 많아지고 복잡한 쿼리가 필요할 때 유용합니다. - **사용 방법**: - PostgreSQL 설치 후, `psycopg2` 라이브러리를 이용하여 파이썬에서 사용할 수 있습니다. - 예제 ```python import psycopg2 # 데이터베이스 연결 conn = psycopg2.connect( dbname="your_dbname", user="your_username", password="your_password", host="your_host", port="your_port" ) cursor = conn.cursor() # 테이블 생성 cursor.execute('''CREATE TABLE IF NOT EXISTS media ( id SERIAL PRIMARY KEY, filename TEXT, filetype TEXT, date_taken DATE, description TEXT)''') # 데이터 삽입 cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description) VALUES (%s, %s, %s, %s)''', ('baby_video.mp4', 'video', '2024-07-09', 'Baby first steps')) # 데이터 조회 cursor.execute('SELECT * FROM media') print(cursor.fetchall()) # 변경사항 저장 및 연결 종료 conn.commit() conn.close() ``` **MongoDB** - **이유**: MongoDB는 NoSQL 데이터베이스로, 비정형 데이터를 저장하기에 좋습니다. 사진이나 영상 같은 미디어 파일의 메타데이터를 저장하고 관리하는데 유용합니다. - **사용 방법**: - MongoDB 설치 후, `pymongo` 라이브러리를 이용하여 파이썬에서 사용할 수 있습니다. - 예제: ```python from pymongo import MongoClient # MongoDB 연결 client = MongoClient('localhost', 27017) db = client['media_management'] collection = db['media'] # 데이터 삽입 media_data = { "filename": "baby_laugh.mp3", "filetype": "audio", "date_taken": "2024-07-09", "description": "Baby's first laugh" } collection.insert_one(media_data) # 데이터 조회 for media in collection.find(): print(media) # 연결 종료 client.close() ``` ### 관리 및 사용 팁 - **백업**: 정기적으로 데이터를 백업하여 소중한 자료를 보호하세요. - **태그와 카테고리**: 사진과 영상에 태그와 카테고리를 추가하여 검색 및 분류를 쉽게 만드세요. - **자동화**: 파이썬 스크립트를 사용하여 파일 업로드 시 자동으로 DB에 메타데이터를 삽입하는 작업을 자동화하세요. - **인터페이스**: 간단한 웹 인터페이스나 GUI를 만들어 데이터베이스 관리를 쉽게 할 수 있습니다. 예를 들어, Django나 Flask 같은 프레임워크를 이용하면 웹 기반의 관리 도구를 만들 수 있습니다. 위의 예제 코드를 시작점으로 사용하여 자신만의 데이터베이스 관리 시스템을 구축해 보세요. 추가적인 기능이나 확장성을 원한다면, 더 많은 라이브러리와 도구들을 학습하고 적용할 수 있습니다. --- ?PostgreSQL도 사진, 영상을 저장할 수 있어? PostgreSQL에서도 사진과 영상을 저장할 수 있습니다. 다만, 일반적으로는 데이터베이스에 직접 파일을 저장하기보다는 파일의 메타데이터와 파일 경로를 저장하고 실제 파일은 파일 시스템이나 클라우드 스토리지에 저장하는 것이 더 효율적입니다. 하지만, 필요에 따라 PostgreSQL에 직접 파일을 저장할 수 있는 방법도 존재합니다. ### 파일 시스템에 저장하고 메타데이터만 DB에 저장하는 방법 1. **파일 시스템에 파일 저장**: 파일을 디스크에 저장하고, 파일의 경로와 메타데이터를 PostgreSQL에 저장합니다. ```python import psycopg2 import os # 파일을 저장할 디렉토리 file_directory = '/path/to/save/files' # 예제 파일 저장 file_path = os.path.join(file_directory, 'baby_photo.jpg') with open(file_path, 'wb') as file: file.write(b'file_binary_data_here') # 실제 파일 데이터를 여기에 씁니다. # 데이터베이스에 파일 경로와 메타데이터 저장 conn = psycopg2.connect( dbname="your_dbname", user="your_username", password="your_password", host="your_host", port="your_port" ) cursor = conn.cursor() cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description, file_path) VALUES (%s, %s, %s, %s, %s)''', ('baby_photo.jpg', 'image', '2024-07-09', 'Baby smiling', file_path)) conn.commit() conn.close() ``` 1. **클라우드 스토리지 사용**: AWS S3, Google Cloud Storage, Azure Blob Storage와 같은 클라우드 스토리지에 파일을 저장하고, 파일의 URL과 메타데이터를 DB에 저장하는 방법도 있습니다. ### PostgreSQL에 직접 파일을 저장하는 방법 PostgreSQL에서는 `BYTEA` 타입을 사용하여 바이너리 데이터를 저장할 수 있습니다. 다만, 파일의 크기가 크다면 성능과 관리 측면에서 효율적이지 않을 수 있습니다. 1. **BYTEA 타입을 이용한 파일 저장**: ```python import psycopg2 # 바이너리 파일 데이터를 읽어오기 with open('baby_photo.jpg', 'rb') as file: binary_data = file.read() # 데이터베이스에 파일과 메타데이터 저장 conn = psycopg2.connect( dbname="your_dbname", user="your_username", password="your_password", host="your_host", port="your_port" ) cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS media ( id SERIAL PRIMARY KEY, filename TEXT, filetype TEXT, date_taken DATE, description TEXT, file_data BYTEA)''') cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description, file_data) VALUES (%s, %s, %s, %s, %s)''', ('baby_photo.jpg', 'image', '2024-07-09', 'Baby smiling', psycopg2.Binary(binary_data))) conn.commit() conn.close() ``` **Large Object (LOB) 사용**: PostgreSQL의 Large Object 기능을 사용하여 큰 파일을 저장할 수도 있습니다. ```python import psycopg2 # 데이터베이스 연결 conn = psycopg2.connect( dbname="your_dbname", user="your_username", password="your_password", host="your_host", port="your_port" ) cursor = conn.cursor() # Large Object를 사용한 파일 저장 lo_oid = cursor.execute("SELECT lo_create(0)").fetchone()[0] with open('baby_photo.jpg', 'rb') as file: cursor.execute("SELECT lowrite(%s, %s)", (lo_oid, file.read())) # 메타데이터 저장 cursor.execute('''CREATE TABLE IF NOT EXISTS media ( id SERIAL PRIMARY KEY, filename TEXT, filetype TEXT, date_taken DATE, description TEXT, file_oid OID)''') cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description, file_oid) VALUES (%s, %s, %s, %s, %s)''', ('baby_photo.jpg', 'image', '2024-07-09', 'Baby smiling', lo_oid)) conn.commit() conn.close() ``` ### 결론 - **파일 시스템 및 클라우드 스토리지**: 대용량 파일을 효율적으로 관리하고 성능을 높이기 위해 추천합니다. - **PostgreSQL 내부 저장**: 작은 파일이나 특정한 경우에 유용할 수 있습니다. 파일을 어디에 저장하든, 메타데이터는 반드시 데이터베이스에 저장하여 파일을 효율적으로 관리하고 검색할 수 있도록 하는 것이 좋습니다. --- AWS를 활용하여 EC2 인스턴스를 만들어 데이터베이스를 설치하고 관리하는 것은 좋은 선택입니다. 이 방법을 통해 유연하고 확장 가능한 데이터베이스 환경을 구축할 수 있습니다. 아래는 EC2 인스턴스를 생성하고 PostgreSQL 데이터베이스를 설치하는 단계별 가이드입니다. ### 1. EC2 인스턴스 생성 1. **EC2 인스턴스 시작**: - AWS Management Console에 로그인합니다. - `EC2` 서비스로 이동하여 `Instances`를 선택합니다. - `Launch Instance` 버튼을 클릭합니다. - 인스턴스 이름을 입력하고, Ubuntu와 같은 원하는 AMI(Amazon Machine Image)를 선택합니다. - 인스턴스 유형을 선택합니다. (t2.micro는 프리티어에서 무료로 제공됩니다.) - 인스턴스 설정을 완료하고 `Create new key pair`를 선택하여 SSH 키를 생성하고 다운로드합니다. - `Launch Instance`를 클릭하여 인스턴스를 시작합니다. 2. **보안 그룹 설정**: - 인스턴스 생성 과정에서 보안 그룹을 설정합니다. - `Edit security group`을 선택하고, 인바운드 규칙을 추가하여 SSH(포트 22)와 PostgreSQL(포트 5432)에 대한 접근을 허용합니다. - 예를 들어, SSH 접근은 자신의 IP로 제한하고, PostgreSQL 접근은 필요한 경우에 따라 특정 IP나 CIDR 범위로 제한합니다. ### 2. PostgreSQL 설치 및 설정 1. **EC2 인스턴스에 접속**: - 터미널(또는 PuTTY)에서 SSH를 통해 EC2 인스턴스에 접속합니다. ```sh ssh -i /path/to/your-key-pair.pem ubuntu@your-ec2-public-ip ``` 2. **PostgreSQL 설치**: - 패키지 목록을 업데이트하고 PostgreSQL을 설치합니다. ```sh sudo apt update sudo apt install postgresql postgresql-contrib ``` 3. **PostgreSQL 서비스 시작 및 활성화**: ```sh sudo systemctl start postgresql sudo systemctl enable postgresql ``` 4. **PostgreSQL 초기 설정**: - PostgreSQL에 접속하여 관리자 비밀번호를 설정하고 데이터베이스를 생성합니다. ```sh sudo -i -u postgres psql ``` - 데이터베이스 관리자 비밀번호 변경: ```sh \password postgres ``` - 데이터베이스 생성: ```sh CREATE DATABASE media_management; ``` 5. **외부 접속 설정**: - PostgreSQL 설정 파일을 편집하여 외부 접속을 허용합니다. ```sh sudo nano /etc/postgresql/12/main/postgresql.conf ``` - `listen_addresses` 설정을 `'*'`로 변경: ```sh listen_addresses = '*' ``` - 클라이언트 인증 설정 파일을 편집하여 접속 규칙을 추가합니다. ```sh sudo nano /etc/postgresql/12/main/pg_hba.conf ``` - IPv4 접속을 허용하는 규칙 추가: ```sh host all all 0.0.0.0/0 md5 ``` 6. **PostgreSQL 재시작**: ```sh sudo systemctl restart postgresql ``` ### 3. AWS S3를 사용한 파일 저장 및 관리 1. **S3 버킷 생성**: - AWS Management Console에서 `S3` 서비스로 이동합니다. - `Create bucket`을 클릭하고 버킷 이름과 리전을 설정합니다. - 필요한 설정을 완료하고 버킷을 생성합니다. 2. **S3에 파일 업로드 및 URL 관리**: - 파일을 S3 버킷에 업로드하고 각 파일의 URL을 가져옵니다. - 이러한 URL과 메타데이터를 PostgreSQL 데이터베이스에 저장합니다. ### 4. 데이터베이스에 파일 URL과 메타데이터 저장 1. **Python 스크립트 예제**: ```python import psycopg2 import boto3 # S3 클라이언트 생성 s3_client = boto3.client('s3') # 파일 업로드 file_name = 'baby_photo.jpg' bucket_name = 'your-s3-bucket' s3_client.upload_file(file_name, bucket_name, file_name) # 파일 URL 생성 file_url = f'https://{bucket_name}.s3.amazonaws.com/{file_name}' # 데이터베이스에 메타데이터 저장 conn = psycopg2.connect( dbname="media_management", user="your_db_user", password="your_db_password", host="your_ec2_ip", port="5432" ) cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS media ( id SERIAL PRIMARY KEY, filename TEXT, filetype TEXT, date_taken DATE, description TEXT, file_url TEXT)''') cursor.execute('''INSERT INTO media (filename, filetype, date_taken, description, file_url) VALUES (%s, %s, %s, %s, %s)''', (file_name, 'image', '2024-07-09', 'Baby smiling', file_url)) conn.commit() conn.close() ``` 이제 EC2 인스턴스에서 PostgreSQL을 설치하고, AWS S3를 사용하여 파일을 저장하며, 데이터베이스에 파일 URL과 메타데이터를 저장하는 방법을 알게 되었습니다. 이러한 방법을 통해 체계적으로 파일과 메타데이터를 관리할 수 있습니다. --- 내가 저장한 사진을 보고 싶을 때는 어떤 방법을 활용하면 좋아? 저장한 사진을 보고 싶을 때, 여러 가지 방법을 활용할 수 있습니다. 가장 일반적인 방법은 웹 애플리케이션을 만들어 사진을 웹 브라우저에서 쉽게 조회할 수 있도록 하는 것입니다. 이를 위해 Python의 Flask와 같은 웹 프레임워크를 사용할 수 있습니다. Flask는 간단하면서도 강력한 웹 애플리케이션을 빠르게 만들 수 있는 프레임워크입니다. ### Flask를 사용한 사진 조회 웹 애플리케이션 만들기 1. **환경 설정**: - Flask와 필요한 패키지를 설치합니다. ```sh pip install flask psycopg2-binary boto3 ``` 2. **Flask 애플리케이션 코드 작성**: - 아래와 같이 Flask 애플리케이션을 작성하여 사진 목록을 조회하고, 클릭 시 사진을 볼 수 있도록 합니다. ```python from flask import Flask, render_template import psycopg2 app = Flask(__name__) def get_db_connection(): conn = psycopg2.connect( dbname="media_management", user="your_db_user", password="your_db_password", host="your_ec2_ip", port="5432" ) return conn @app.route('/') def index(): conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT id, filename, file_url FROM media') photos = cursor.fetchall() conn.close() return render_template('index.html', photos=photos) @app.route('/photo/<int:photo_id>') def photo(photo_id): conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT filename, file_url FROM media WHERE id = %s', (photo_id,)) photo = cursor.fetchone() conn.close() return render_template('photo.html', photo=photo) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` 3. **HTML 템플릿 작성**: - `templates` 디렉토리를 만들고, `index.html`과 `photo.html` 파일을 생성합니다. `index.html`: ```html <!DOCTYPE html> <html> <head> <title>Photo Gallery</title> </head> <body> <h1>Photo Gallery</h1> <ul> {% for photo in photos %} <li> <a href="/photo/{{ photo[0] }}">{{ photo[1] }}</a> </li> {% endfor %} </ul> </body> </html> ``` `photo.html`: ```html <!DOCTYPE html> <html> <head> <title>{{ photo[0] }}</title> </head> <body> <h1>{{ photo[0] }}</h1> <img src="{{ photo[1] }}" alt="{{ photo[0] }}"> <br> <a href="/">Back to gallery</a> </body> </html> ``` 4. **애플리케이션 실행**: - 터미널에서 Flask 애플리케이션을 실행합니다. ```sh python app.py ``` - 웹 브라우저에서 `http://your-ec2-ip:5000`에 접속하여 사진 갤러리를 확인합니다. ### 추가 기능 - **검색 및 필터링**: - 사진을 태그, 날짜, 설명 등으로 검색하고 필터링할 수 있는 기능을 추가할 수 있습니다. - **업로드 기능**: - 웹 애플리케이션에 사진 업로드 기능을 추가하여, 사용자가 직접 사진을 업로드하고 메타데이터를 입력할 수 있도록 할 수 있습니다. - **인증 및 권한 관리**: - 사용자 인증 및 권한 관리를 추가하여, 특정 사용자만 사진을 업로드하거나 볼 수 있도록 할 수 있습니다. 위의 예제는 간단한 갤러리 애플리케이션의 기본 구조를 보여줍니다. 이를 기반으로 다양한 기능을 추가하고, 사용자 경험을 향상시킬 수 있습니다. Flask는 간단하면서도 강력한 프레임워크이기 때문에, 필요에 따라 애플리케이션을 확장해 나가기에 적합합니다. ---- ###### 출처(참고문헌) - 챗GPT ###### 연결문서 - ###### 날짜 : 2024-07-09, 09:12