Skip to content
Yoo117 edited this page Oct 14, 2024 · 13 revisions

Welcome to the weaverse-backend wiki!

1. Weaverse 링크

2. Local 실행 방법

Local 실행 방법 자세히 보기 1. DB설치(docker 실행)
docker compose up -d
  1. 환경 변수 파일 추가 (.env 파일)
# SECRET_KEY
SECRET_KEY='django-insecure-da0mi_044pv-vs7-gpw8qb6t8=2czy@^er34_1^d'
# DEBUG
DEBUG=True
# DATABASE
DATABASE_ENGINE='django.db.backends.postgresql'
DATABASE_NAME='postgres'
DATABASE_USER='postgres'
DATABASE_PASSWORD='postgres'
DATABASE_HOST='localhost'
DATABASE_PORT='5432'
# ALLOWED_HOSTS
ALLOWED_HOSTS='*'
# KAKAOPAY
BASE_URL='https://www.weaverse.site/' 
KAKAOPAY_CID='TC0ONETIME'
KAKAOPAY_SECRET_KEY='DEV797B9F2F7A1E7E41DE550A69B443143590619'
  1. pyenv설치 및 활성화
# 가상환경 설치
python3 -m venv .venv
# 활성화
# 윈도우즈
.venv\Scripts\activate

# mac & linux
source .venv/bin/activate

또는

# 가상환경 설치
python -m venv venv
# 활성화
source venv/bin/activate
  1. 필요한 패키지 설치
pip install -r requirements.txt
  1. DB 마이그레이션
python manage.py migrate
  1. 서버 실행
python manage.py runserver

3. 팀 커뮤니케이션 및 협업 도구

1) Discord

  • 주요 용도: 실시간 채팅, 음성 통화, 파일 공유
  • 사용 가이드라인:
    • 중요한 결정사항은 항상 채팅으로 기록
    • 음성 채널 사용 시 간단한 회의록 작성

2) Gather Town

  • 주요 용도: 가상 공간에서의 팀 미팅 및 비공식 소통
  • 사용 시나리오:
    • 팀 미팅
    • 페어 프로그래밍 세션
    • 가상 사무실 공간으로 활용

4. 개발 환경 및 버전 관리

1) Visual Studio Code (VSCode)

  • 주요 용도: 코드 작성 및 편집
  • GitHub 계정을 통한 설정 동기화 권장

2) GitHub

  • 주요 용도: 버전 관리, 코드 협업, 이슈 트래킹을 위한 중앙 집중식 플랫폼

5. Backend 기술 스택

1) 백엔드(서버) 프레임워크: Django, Django REST Framework

  • 선택 이유:
    • 풍부한 생태계와 다양한 라이브러리 지원
    • 빠른 개발 속도와 생산성
    • ORM의 강력함과 관리자 인터페이스 제공
  • Tradeoff:
    • 장점: 보안 기능 내장, 확장성
    • 단점: 상대적으로 무거운 프레임워크, 학습 곡선이 있음

2) 데이터베이스: PostgreSQL

  • 선택 이유:
    • 복잡한 쿼리와 트랜잭션 처리에 강함
    • JSON 필드 지원으로 유연한 데이터 모델링 가능
    • 확장성과 대규모 데이터 처리 능력
  • Tradeoff:
    • 장점: 데이터 무결성, ACID 준수
    • 단점: 초기 설정의 복잡성, MySQL에 비해 약간의 성능 차이

3) API 문서화: Swagger/OpenAPI (DRF-spectacular)

  • 선택 이유:
    • 자동화된 API 문서 생성
    • 대화형 API 테스트 인터페이스 제공
    • Django REST Framework와의 높은 호환성
  • Tradeoff:
    • 장점: 문서 유지보수 용이, 클라이언트 개발자와의 협업 개선
    • 단점: 설정의 복잡성, 추가적인 의존성 발생

4) 인증 및 권한: Token 기반 인증

  • 선택 이유:
    • 상태를 저장하지 않는(stateless) 인증 방식으로 확장성 좋음
    • 세션 관리의 복잡성 감소
  • Tradeoff:
    • 장점: 서버 부하 감소, 다중 서버 환경에서 유리
    • 단점: 토큰 관리의 책임이 클라이언트에 있음, 토큰 탈취 시 보안 위험

5) 테스팅: pytest, Factory Boy, Coverage.py

  • 선택 이유:
    • pytest: 간결한 문법, 풍부한 플러그인 생태계
    • Factory Boy: 테스트 데이터 생성 자동화
    • Coverage.py: 코드 커버리지 측정으로 테스트 품질 향상
  • Tradeoff:
    • 장점: 테스트 작성 및 유지보수 용이, 높은 코드 신뢰성
    • 단점: 초기 설정 시간 소요, 학습 곡선 존재

6) 배포: Docker, Gunicorn, Nginx

  • 선택 이유:
    • Docker: 일관된 개발 및 운영 환경 제공
    • Gunicorn: 안정적인 WSGI 서버
    • Nginx: 고성능 웹 서버 및 리버스 프록시
  • Tradeoff:
    • 장점: 확장성, 환경 일관성, 로드 밸런싱
    • 단점: 설정의 복잡성, 리소스 오버헤드

7) CI/CD: GitHub Actions

  • 선택 이유:
    • GitHub 저장소와의 통합 용이성
    • 다양한 워크플로우 템플릿 제공
    • 무료 사용량이 넉넉함
  • Tradeoff:
    • 장점: 쉬운 설정, GitHub 생태계와의 통합
    • 단점: GitHub에 종속, 복잡한 파이프라인의 경우 제한적일 수 있음

8) 코드 품질: Black, isort, Mypy

  • 선택 이유:
    • Black: 일관된 코드 스타일 강제
    • isort: import 문 자동 정렬
    • Mypy: 정적 타입 검사로 버그 조기 발견
  • Tradeoff:
    • 장점: 코드 가독성 향상, 버그 감소, 일관성 유지
    • 단점: 엄격한 규칙으로 인한 초기 적응 기간 필요

9) 환경 관리: python-dotenv, venv, requirements.txt

  • 선택 이유:
    • python-dotenv: 환경 변수 관리 용이
    • venv: 프로젝트별 독립적인 환경 구성
    • requirements.txt: 의존성 관리 표준화
  • Tradeoff:
    • 장점: 환경 설정의 일관성, 재현 가능성
    • 단점: 추가적인 설정 단계 필요, 의존성 관리의 수동성

10) 주요 서드 파티 라이브러리

서드 파티 라이브러리 자세히 보기

django-cors-headers

  • 사용 이유: Cross-Origin Resource Sharing (CORS) 설정 간소화
  • 장점: 프론트엔드와 백엔드 간 통신 보안 강화

django-storages

  • 사용 이유: 다양한 스토리지 백엔드 (예: AWS S3) 지원
  • 장점: 파일 저장 및 관리의 유연성 제공

drf-spectacular

  • 사용 이유: OpenAPI (Swagger) 문서 자동 생성
  • 장점: API 문서화 프로세스 자동화, 클라이언트 개발자와의 협업 개선

pytest, pytest-django

  • 사용 이유: 효율적이고 강력한 테스팅 프레임워크
  • 장점: 간결한 문법, 풍부한 플러그인 생태계

python-dotenv

  • 사용 이유: 환경 변수 관리 간소화
  • 장점: 보안 강화, 설정의 유연성

Pillow

  • 사용 이유: 이미지 처리 라이브러리
  • 장점: 다양한 이미지 포맷 지원, 이미지 조작 기능

psycopg

  • 사용 이유: PostgreSQL 데이터베이스 어댑터
  • 장점: 고성능, 스레드 안전성

requests

  • 사용 이유: HTTP 요청을 위한 간단하고 효율적인 라이브러리
  • 장점: 직관적인 API, 다양한 HTTP 메서드 지원

mypy

  • 사용 이유: 정적 타입 검사 도구
  • 장점: 타입 관련 버그 조기 발견, 코드 품질 향상

django-video-encoding

  • 사용 이유: 비디오 인코딩 및 처리 기능 제공
  • 장점: 다양한 비디오 포맷 지원, 비디오 스트리밍 용이성

6. Ground Rule

1) Time Rule

시간 내용
오전
09:00-09:30 주말 팀원 개별 작업 공유 (진전, 에러 등)
09:30-10:00 (팀장 1차 미팅)
팀원 소통 및 개별 활동
10:00-10:30 팀장 미팅 내용 공유 (타팀 feedback도 함께)
10:30-12:00 담당 앱 개발 진행(1)
12:00-12:50 개별 작업에서 생기는 질문 및 고민 공유
오후
14:00-14:30 PR 리뷰 진행(PR 작성: 14:00 전)
14:30-17:00 담당 앱 개발 진행(2)
17:00-17:30 금일 정리
• 개별 작업에서 생기는 질문 및 고민 공유
• 팀원 개별 작업 확인 및 공유
• 전체 프로세스 위치 점검
• 구글 시트 업데이트
17:30-18:00 (팀장 2차 미팅)
일일 및 주간회고 작성 및 확인
저녁
18:00 이후 야간 작업 (자율)

2) 역할 분담

  • 모든 팀원
    • 기능 구현 트랙
    • 토의 안건
    • 주간 회고
  • 유정(팀장)
    • TODO
    • Ground Rule
    • Convention
  • 홍광
    • WBS
    • 팀회의록
  • 원길
  • 연우
    • Wiki 작성

3) 결국 토론입니다. 다른 생각 공유하고 다른 코드 작성 방식 왜 채택을 했는지를 공유하고 결정합니다.

  • 오전 회의 및 discussion 활용
  • 틈틈히 코드 코멘트 남기기(class와 def, 중요한 내용 추가)
  • 오전 회의에서 담담자 설명 후 팀원 질문 답변 공유
  • 담당자는 코멘트에 답변 준비
  • 피어는 코드 스터디 및 질문 준비

4) 코드 푸시 및 리뷰 프로세스

  • 개인 브랜치에 코드 푸시

    • 대상: 조직 레포지토리의 개인 브랜치
    • 테스트용으로 추가한 임시 코드는 푸시하지 않습니다.
    • 단위 테스트 및 통합 테스트 코드는 푸시해야 합니다.
  • 개발 브랜치로 풀 리퀘스트(PR)

    • 대상: 조직 레포지토리의 개발 브랜치 (dev)
    • 프로세스: 개인 브랜치에서 dev 브랜치로 풀 리퀘스트를 생성합니다.
  • 코드 리뷰: 모든 풀 리퀘스트는 최소 한 명의 팀원에 의해 리뷰되어야 합니다.

    • 커밋 메시지: 명확하고 설명적인 커밋 메시지를 사용합니다.
    • 브랜치 관리: 작업이 완료된 개인 브랜치는 주기적으로 정리합니다.

7. Code Convention

1) 초기 설정

  • 가상환경: .venv/
  • 환경파일: .env
  • 설치파일: requirements.txt
  • 버전파일: .gitignore
  • 도커파일: docker-compose.yml
  • 발표파일: README.md, Wiki

2) 저장소 구조:

  • main 브랜치: 안정적인 코드베이스
  • develop 브랜치: 개발 중인 기능 통합
  • (작업자 이름)/(개발 app) 브랜치: 새로운 기능 개발

3) 코드

  • 자동 수정: Black Formatter

4) 깃

  • 시각화: GitLens

5) 파일에 담길 내용(통일)

  • models.py

  • serializers.py

    • serializer_class 속성으로 하나의 serializer 클래스를 지정합니다. 필요한 경우 action별로 다른 serializer를 사용할 수 있습니다.
    • ModelSerializer를 사용하기로 합니다.
  • views.py

    • Mixins와 GenericAPIView를 같이 사용합니다.
  • urls.py

    • Router를 사용하여 여러 URL 패턴을 자동으로 생성합니다.
  • permissions.py

  • test/

    • test 폴더 안에 앱마다 개별적으로 테스트 파일을 구현합니다.

6) 명명 규칙

통일된 형식보다는 길어도 상관없지만 기능을 유추할 수 있는 이름으로 용도를 명확히 해서 코드 가독성을 높입니다.

  • 클래스명 (명사형)

    • 대문자
  • 메서드명 (동사형)

    • 소문자

7) 주석

장고 프레임워크에서 작성한 주석 내용을 참고해서 작성합니다.

  • 작성위치: 클래스명과 메서드명 하단
  • 용도: 마우스를 갔다놓았을 때 보이는 코드 미리보기에서 주석으로 간단히 기능 확인 가능
  • 언어: 팀원 간 원활한 소통을 위해 한국어로 작성 (단, 장고용어 중 번역이 어려운 용어는 외래어로작성)

8) 에러메시지

메시지 유형에 상관없이 한국어로 작성합니다.

  • 프론트엔드에서 사용자에게 제공할 메시지
  • 서버에서 개발자 간 사용할 메시지

9) 커밋 메시지

커밋 메시지 자세히 보기 커밋할 때 메시지는 아래 형식(title과 body)로 작성합니다. - 언어: 팀원 간 원활한 소통을 위해 한국어로 작성 (단, 장고용어 중 번역이 어려운 용어는 외래어로작성)
type(scope): [타이틀 설명]

[바디 설명]

[푸터 설명]

타입(type)

  • fix: 버그 수정
  • feat: 새로운 기능 추가
  • refactor: 버그 수정 또는 기능 추가하지 않는 코드 변경
  • test: 테스트 추가 또는 기존 테스트 수정
  • perf: 성능을 향상시키는 코드 변경
  • ci: CI 구성 파일 및 스크립트의 변경사항
  • build: 빌드 시스템 또는 외부 종속성에 영향을 미치는 변경사항
  • style: 코드의 의미에 영향을 주지 않는 변경사항
  • docs: 문서만 변경
  • chore: 소스 코드, 테스트 파일 외 기타 변경사항

예시

 "fix: 사용자 로그인 시 발생하는 404 오류 해결"
 "feat: 사용자 프로필 사진 업로드 기능 구현"
 "refactor: 사용자 인증 로직 개선"
 "test: 사용자 등록 기능 단위 테스트 추가"
 "perf: 데이터베이스 쿼리 최적화"

 "ci: Travis CI 설정 변경"
 "build: npm 패키지 업데이트"

 "style: 들여쓰기 수정"
 "docs: README.md 파일 업데이트"
 "chore: .gitignore 파일 업데이트"

스코프(scope)

옵션이므로 생략 가능합니다.

auth - 인증 관련 변경사항 ui - 사용자 인터페이스 관련 변경사항 api - API 관련 변경사항 db - 데이터베이스 관련 변경사항 config - 설정 파일 관련 변경사항 docs - 문서화 관련 변경사항 tests - 테스트 관련 변경사항

"feat(auth): Google OAuth 통합"
"fix(ui): 모바일에서 버튼 오버랩 문제 해결"
"feat(api): 새로운 엔드포인트 추가 /users/preferences"
"perf(db): 사용자 조회 쿼리 최적화"
"chore(config): 개발 환경 설정 파일 업데이트"
"docs(api): API 문서에 새 엔드포인트 설명 추가"
"test(auth): 비밀번호 재설정 플로우 테스트 추가"

푸터(footer)

옵션이므로 생략 가능합니다.

Reviewed-by - 이 커밋을 검토한 사람의 이름을 나타냅니다. 용도: 코드 리뷰 프로세스를 추적하고, 변경사항에 대한 책임을 명확히 합니다.

Refs: #[이슈 번호] - 이 커밋과 관련된 이슈 또는 풀 리퀘스트의 참조 번호를 나타냅니다. 용도: 커밋을 특정 이슈나 작업 항목과 연결하여 추적성을 제공합니다.

BREAKING CHANGE: [설명] - 이 커밋이 이전 버전과 호환되지 않는 변경사항을 포함하고 있음을 나타냅니다. 용도: Semantic Versioning에서 주 버전(MAJOR) 증가를 트리거합니다.

Closes: #[이슈 번호] - 이 커밋으로 해결되는 이슈의 번호를 나타냅니다. 용도: 많은 이슈 트래킹 시스템에서 이 키워드를 인식하여 자동으로 이슈를 닫습니다.

Signed-off-by: [이름] <이메일> - 커밋 작성자의 서명을 나타냅니다. 용도: 일부 프로젝트에서는 법적 또는 절차적 이유로 이 서명을 요구합니다.

예시

Reviewed-by: John Doe
Refs: #456, #789
BREAKING CHANGE: 'port' 파라미터가 'url' 객체로 변경되었습니다.
Closes: #234
Signed-off-by: Jane Smith <[email protected]>
Clone this wiki locally