장고 팀 프로젝트(SpartaNews)

S.A문서

 

1. 개요

프로젝트 이름: Sparta News

목적: IT 산업 뉴비들을 위한 뉴스 및 커뮤니티 플랫폼을 제공합니다. 사용자들은 크롤링된 IT 관련 뉴스를 확인하고, 질문 게시판과 자유 게시판에서 글을 작성하거나 소통할 수 있습니다.

 

 

 


2. 요구 사항

 

기능적 요구사항:

  • 회원가입 없이 뉴스 열람 가능
  • 회원가입 후 뉴스, 질문, 자유게시판에 글 작성 및 댓글 작성 가능
  • 뉴스 크롤링&업로드 (관리자만 가능)
  • 사용자별 역할(관리자, 마스터, 뉴비)에 따른 권한 관리
  • 게시글에 '좋아요', '북마크' 기능 제공
  • 게시글 조회수에 따른 인기 게시글 표시

 

비기능적 요구사항:

  • 확장성: 향후 새로운 게시판 추가 가능하도록 설계
  • 보안: JWT 기반 인증 및 권한 관리
  • 성능: 대규모 트래픽을 처리할 수 있는 구조
  • 유지보수성: 코드가 쉽게 확장 및 유지보수 가능해야 함

 

 


3. 시스템 아키텍처

 

백엔드 구성:

  • Django REST Framework: API 설계를 위한 프레임워크
  • SQLite3: 데이터베이스
  • BeautifulSoup: 뉴스 크롤링을 위한 라이브러리
  • JWT: 사용자 인증을 위한 토큰 방식 인증 시스템

 

API 엔드포인트:

Tutor's Feedback
엔드포인트 기준으로 API를 작성하는 것이 좋다.
ex. Articles에서 목록조회와 게시글 작성과 같이 같은 url 엔드포인트라면 같이 나열해서 작성해주면 한눈에 보기 좋다.

 

 

 


4. 데이터 아키텍처 (ERD)

주요 테이블:

Articles와 NBCNs 테이블을 구분한 이유,
user의 권한을 구분하여 Articles를 사용할 수 있는 user가 있고, NBCNs 을 사용할 수 있는 user을 구분하기 위해 테이블을 나누었다.

Tutor's Feedback
비슷한 필드를 가지고 있는 테이블일 경우, 나누지 않고 같은 테이블을 사용하는 것이 좋다.
같은 테이블을 사용할 경우, API 작업이나 메소드 작업하기 용이하기 때문에 같은 필드의 테이블은 하나로 묶는 것이 좋다.
그러나 작업 상황에 따라 구분이 필요하다면 그렇게 진행해보고, 이렇게 작업했을 때의 장단점을 기억하고 추후 프로젝트 작업 시, 기호에 따라 필요한 작업을 진행해보면 된다.

 

 

 

 


5. 애플리케이션 아키텍처

  • 프론트엔드: 현재 구현하지 않음. 백엔드 중심의 API 설계 및 통신에 집중.
  • 백엔드:
    • API 엔드포인트를 통한 CRUD 처리
    • 회원 등급에 따라 접근 권한이 나뉘는 구조
    • 크롤링된 뉴스는 주기적으로 데이터베이스에 저장

 

 


6. 통합 및 인터페이스 (Integration & Interfaces)

  • 크롤링 통합: BeautifulSoup을 통해 IT 관련 뉴스 데이터를 주기적으로 크롤링
  • REST API: 프론트엔드와의 통신은 JSON 형식으로 데이터를 주고받음

 

 


7. 보안 (Security)

  • 인증: JWT 토큰을 이용한 사용자 인증
  • 비밀번호 암호화: 사용자 비밀번호는 해시화하여 저장
  • 역할 기반 권한 관리: 관리자만 뉴스 크롤링 및 관리 기능 사용 가능

 

 


와이어프레임

다음은 Sparta News 프로젝트의 백엔드 중심 와이어프레임입니다. API의 구조 및 주요 기능을 보여줍니다.

 

Tutor's Feedback
페이지별로 여러 와이어프레임을 만드는 것이 좋다.
각 페이지의 기능을 쉽게 알아볼 수 있고, 여러 와이어프레임으로 구분해두어야 작업할 때 서로 의견 충돌이 없다.

'Project' 카테고리의 다른 글

Spartamarket_DRF 장고 개인 과제  (1) 2024.09.10

 

트러블슈팅 (Troubleshooting)

 

1. 의존성 설치 오류

 

문제:

pip install -r requirements.txt 명령어 실행 시 특정 패키지 설치 실패.

 

 

원인:

  • Python 버전 불일치
  • 특정 패키지 버전 충돌
  • 네트워크 연결 문제

 

해결 방법:

  • Python 버전 확인: 프로젝트와 호환되는 Python 버전(예: Python 3.8 이상)이 설치되어 있는지 확인합니다.
    Python 버전이 다를 경우, 호환되는 버전을 설치한 후 가상환경을 재설정합니다.
python --version
 
  • 의존성 버전 문제 해결:
    • 문제 발생 시 오류 메시지에서 문제가 되는 패키지를 확인한 후 requirements.txt에서 해당 패키지의 버전을 조정하거나 최신 버전으로 업데이트합니다.
    • 예를 들어, Django 패키지의 설치 문제가 있다면:
pip install Django==4.2 # 특정 버전 설치
 

 

  • 네트워크 연결 문제:
    • 네트워크 연결이 불안정할 경우, 안정적인 인터넷 연결을 확인한 후 재시도합니다.

 

  • 가상 환경 재설정:
    • 가상 환경을 삭제하고 새로 만들고 다시 설치합니다.
rm -rf venv # 가상 환경 삭제
python -m venv venv # 가상 환경 생성

# 가상 환경 활성화
source venv\Scripts\activate # Windows 
source venv/bin/activate # macOS/Linux 

pip install -r requirements.txt # 패키지 재설치
 

 

 


2. 데이터베이스 마이그레이션 오류

문제:

python manage.py migrate 명령어 실행 시 마이그레이션 오류가 발생하거나 테이블이 생성되지 않음.

 

원인:

  • models.py의 변경 사항을 적용하지 않음.
  • 마이그레이션 파일 충돌 또는 손상.
  • 데이터베이스 파일 손상 또는 누락.

 

해결 방법:

  • 마이그레이션 파일 생성 및 적용:
    • makemigrations 명령어를 사용하여 모델 변경 사항을 마이그레이션 파일로 생성한 후, migrate 명령어로 적용합니다.
python manage.py makemigrations
python manage.py migrate
 
 
  • 마이그레이션 초기화:
    • 문제가 계속될 경우 마이그레이션을 초기화하고 데이터베이스를 다시 생성합니다. (주의: 데이터 손실 가능성이 있으므로, 백업을 권장합니다.)
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
python manage.py makemigrations
python manage.py migrate
 
 
 
  • 데이터베이스 파일 삭제 및 재생성:
    • SQLite와 같은 파일 기반 데이터베이스를 사용하는 경우, db.sqlite3 파일을 삭제하고 다시 마이그레이션을 수행합니다.
rm db.sqlite3
python manage.py migrate
 
 
 
 
 

3. JWT 인증 관련 문제

문제:

로그인 후 올바른 토큰이 발급되지 않거나, 로그아웃 후에도 액세스 토큰이 유효한 상태로 남아 있음.

 

원인:

  • JWT 토큰 발급 및 유효성 검사 로직 오류.
  • 토큰 블랙리스트 관리 문제.

 

해결 방법:

  • 토큰 만료 시간 설정:
    • settings.py에서 SIMPLE_JWT 설정을 확인하고 ACCESS_TOKEN_LIFETIME과 REFRESH_TOKEN_LIFETIME을 적절하게 설정합니다.
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS':True,
'BLACKLIST_AFTER_ROTATION':True,
}
 
 
 
 
  • 로그아웃 시 토큰 블랙리스트 처리:
    • 로그아웃 API 구현 시 RefreshToken을 블랙리스트에 추가하여 더 이상 사용하지 못하도록 합니다.
from rest_framework_simplejwt.tokens import RefreshToken

def logout(request):
try:
refresh_token = request.data["refresh"]
token = RefreshToken(refresh_token)
token.blacklist()
return Response({"message": "Successfully logged out."}, status=200)

except Exception as e:
return Response({"error":str(e)}, status=400)
 
 
 
 
 
 

4. 정적 파일 로드 오류

문제:

CSS, JavaScript 등의 정적 파일이 로드되지 않거나 404 오류가 발생함.

 

원인:

  • Django에서 STATIC_ROOT 또는 STATICFILES_DIRS 설정이 올바르지 않거나, 정적 파일 수집이 이루어지지 않음.

 

해결 방법:

  • 정적 파일 설정 확인:
    • settings.py에서 STATIC_URL, STATICFILES_DIRS, STATIC_ROOT 설정을 확인합니다.
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
 
  • 정적 파일 수집:
python manage.py collectstatic

 

 

 

 

 

위의 트러블슈팅 가이드를 통해 프로젝트 사용 중 발생할 수 있는 문제를 예방하고, 발생한 문제를 해결하는 데 도움을 줄 수 있습니다.

'Project' 카테고리의 다른 글

SA문서 피드백  (2) 2024.09.11

+ Recent posts