[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.12.24
📕 프로젝트 작업 내역
- PostgreSQL / Django 컨테이너 실행
- Django API 구축
- Labeling Pipeline 소요 시간 확인
- Django 와 Labeling Pipeline 연결
📗 수행 결과
1. PostgreSQL / Django 컨테이너 연결
1) PostgreSQL / Django 컨테이너 실행
- postgres 폴더 생성 → Dockerfile / requirements.txt / docker-compose.yml 생성
# Dockerfile
# Python 기반 이미지 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# Python 환경 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 의존성 파일 복사 및 설치
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Django 애플리케이션 소스 복사
COPY . /app/
# Django 개발 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# requirements.txt
Django>=4.2,<5.0
psycopg2-binary>=2.9
# docker-compose.yml
# Python 기반 이미지 사용
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# Python 환경 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 의존성 파일 복사 및 설치
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# Django 애플리케이션 소스 복사
COPY . /app/
# Django 개발 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ cat requirements.txt
Django>=4.2,<5.0
psycopg2-binary>=2.9
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ cat docker-compose.yml
version: "3.8" # Docker Compose 파일 버전
services:
db:
image: postgres:latest
container_name: postgres-container
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=admin123
- POSTGRES_DB=mydatabase
restart: always
web:
build: . # Django 애플리케이션이 포함된 Dockerfile 기준으로 빌드
container_name: django-container-2 # 기존 장고 컨테이너와 충돌 방지 위해 이름 변경
ports:
- "8000:8000"
depends_on:
- db # db 서비스가 먼저 실행되어야 함
environment:
- DATABASE_URL=postgresql://admin:admin123@db:5432/mydatabase
volumes:
- .:/app
restart: always
volumes:
postgres_data: # PostgreSQL 데이터를 저장할 볼륨
- docker-compose.yml 실행
- Error 발생1: 기존 django container와 포트(8000) 충돌
- Error 발생2: 해당 사용자가 존재하지 않음
docker-compose.yml up -d
"""
Creating postgres-container ... done
Creating django-container-2 ...
Creating django-container-2 ... error
ERROR: for django-container-2 Cannot start service web: driver failed programming external connectivity on endpoint django-container-2 (xxx): Error starting userland proxy: listen tcp4 0.0.0.0:8000: bind: address already in use
ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint django-container-2 (xxx): Error starting userland proxy: listen tcp4 0.0.0.0:8000: bind: address already in use
ERROR: Encountered errors while bringing up the project.
(label_pl) ubuntu@ip-172-31-17-163:~/postgres$ sudo lsof -i :8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 238221 ubuntu 8u IPv4 1230028 0t0 TCP *:8000 (LISTEN)
python3 238221 ubuntu 9u IPv4 1230118 0t0 TCP ip-172-31-17-163.ap-northeast-2.compute.internal:8000->xxx:xxx (ESTABLISHED)
python3 238221 ubuntu 11u IPv4 1230119 0t0 TCP ip-172-31-17-163.ap-northeast-2.compute.internal:8000->xxx:xxx (ESTABLISHED)
"""
- Error 해결
- 포트 사용 중인 프로세스 확인
- 포트 점유 프로세스 종료
- Docker Compose 다시 실행
# 포트를 사용 중인 프로세스 확인
sudo lsof -i :8000
"""
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 xxx ubuntu 8u IPv4 xxx 0t0 TCP *:8000 (LISTEN)
"""
# 포트 점유 프로세스 종료
sudo kill -9 <PID>
# Docker Compose 다시 실행
docker-compose up -d
2. Django API 구축
1)
3. PostgreSQL 마이그레이션
1) 관계형 데이터 테이블 구상
① FileRecord
컬럼명 | 데이터 타입 | 설명 |
id | int (Primary Key, Auto Increment) | 기본 키 |
file_name | varchar(255) | 파일 이름 |
s3_uri | varchar(255) | S3에 저장된 경로 |
status | varchar(50) | 파일의 현재 상태 |
uploaded_at | datetime (Default: CURRENT_TIMESTAMP) | 파일 업로드 시간 |
② ProcessedQuestion
컬럼명 | 데이터 타입 | 설명 |
id | int (Primary Key, Auto Increment) | 기본 키 |
file_record_id | int (Foreign Key) | FileRecord 테이블의 외래 키 |
bboxes | jsonb | 텍스트 영역의 좌표 정보 |
question_text | text | 문제 텍스트 내용 |
JSONB 타입 | PostgreSQL 배열 타입 | |
저장 형태 | JSON 형식으로 키-값 구조 저장 | 다차원 배열({{}})로 데이터 저장 |
유연성 | 키-값 구조로 다양한 데이터 저장 가능 | 고정된 필드 구조 (e.g., class_id, x_center 등) |
쿼리 편의성 | JSON 키로 데이터 필터링 및 검색 가능 | 배열 인덱스를 사용해 특정 값 검색 |
확장성 | 데이터 구조 변경 시 유연 | 필드가 추가되면 테이블 설계 수정 필요 |
적합한 경우 | 필드가 많거나, 동적으로 변할 가능성이 있는 데이터 | 구조가 고정적이고, 데이터 필드가 명확할 때 |
예시 | [{"class_id": 0, "x_center": 0.3, "y_center": 0.2, "width": 0.5, "height": 0.1}, {"class_id": 1, "x_center": 0.6, "y_center": 0.4, "width": 0.3, "height": 0.2}] | {{0,0.3,0.2,0.5,0.1},{1,0.6,0.4,0.3,0.2}} |
③ LabellingResult
컬럼명 | 데이터 타입 | 설명 |
id | int (Primary Key, Auto Increment) | 기본 키 |
file_record_id | int (Foreign Key) | FileRecord 테이블의 외래 키 |
category_label | varchar(255) | 파일의 대분류 라벨 |
leaf_label | varchar(255) | 파일의 세부 하위 분류 라벨 |
processed_at | datetime (Default: CURRENT_TIMESTAMP) | 라벨링이 처리된 시간 |
2) ERD 그리기
📙 내일 일정
- OCR 모델 학습
'TIL _Today I Learned > 2024.12' 카테고리의 다른 글
[DAY 113] 최종 프로젝트_ 모델 학습 자동화 파이프라인 구현 (0) | 2024.12.30 |
---|---|
[DAY 111] 최종 프로젝트_ Lambda (1) | 2024.12.26 |
[DAY 109] 최종 프로젝트_ Labeling Pipeline 자동화 (2) | 2024.12.23 |
[DAY 108] 최종 프로젝트_ 모델 추가 학습 (0) | 2024.12.20 |
[DAY 107] 최종 프로젝트_ OCR 모델 Fine Tuning (0) | 2024.12.19 |