### 요약
- 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