Django 개념

Haks.·2025년 2월 27일
0

Study

목록 보기
61/65

장고 shell

sqlmigrate

  • makemigartions 를 하면 DB에 실행 되기전의 파일이 생성된다.
  • sqlmigrate는 마이그레이션이 실제로 어떤 SQL을 실행할지 미리 확인하는 명령어 이다.
  • 데이터베이스에 변경을 적용하지 않고, SQL만 출력한다.
  • python manage.py sqlmigrate <앱이름> <마이그레이션 번호>

Model

  • auto_now: 세이브 할때마다 수정
  • auto_now_add: 처음 넣을때 생성

Django Settings

  • 시간설정은 일단 우선 한국기준으로 세팅하자
# shettings.py
LANGUAGE_CODE = "en-us"

TIME_ZONE = "Asia/Seoul"

USE_I18N = True

USE_TZ = False

단위 테스트로 잡을수 없는 동시성 문제

test

  • poetry add django-ninja
    • DRF 보다 가볍고 FastAPI 스타일을 지원하는 장고 라이브러리 스웨거 문서지원
from ninja import NinjaAPI
api = NinjaAPI()


@api.get("like")
def api_do_like(request: HttpRequest, user_id: int, article_id: int) -> None:
    do_like(user_id, article_id)
    return None
  • swagger-ui 를 사용해 데이터를 넣어 본다 그리고 http url를 찾는다

  • ctx.captured_queries : Django의 테스트 환경에서 실행된 데이터베이스 쿼리를 캡처할 때 사용하는 속성

from django.test.utils import CaptureQueriesContext
from django.db import connection
from myapp.models import User

with CaptureQueriesContext(connection) as ctx:
    User.objects.filter(is_active=True).count()  # 실행할 쿼리

# 실행된 쿼리 확인
for query in ctx.captured_queries:
    print(query["sql"])  # 실행된 SQL 출력

httpie 를 사용해 다발성으로 넣어본다

  • curl 대신 http를 사용할수 있게 해주는 패키지
  • brew install httpie
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &
http ":8000/api/like?user_id=2&article_id=2" &

이 코드를 터미널에 실행시키면 DB에서 한개가 아닌 여러개의 데이터가 들어간 것을 확인할 수 있다.

  • View코드 에서 같은 코드가 들어가는걸 막아놨다
    문제는 거의 동시에 같은 입력값을 넣으면 DB에서 데이터가 없다고 판단하고 넣어버리는 것이다.

이 문제를 해결하기 위해선 Model의 내용을 수정해서 그전에 차단해 주어야한다.

UniqueConstarnt

class Like(BaseModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["user","article"], name="UIX_user_id_article_id")
        ]

이후 migrate 를 진행한 후 다시한번 넣어보면 하나의 컬럼만 형성된 것을 확인할 수 있다.

Debug

테스트 코드에서 중단점을 찍어 디버그를 할수 있다. 디버그시 변수명, 타입명 등을 바로 찾을수 있고 어떤 에러가 발생했는지 확인할 수도 있다. Exception 으로 처리해놓은 에러 확인가능.

중단점을 찍어야 하는 주요 위치

✅ 함수의 시작 부분 → 입력 값이 올바른지 확인
✅ 조건문 내부 (If-Else) → 어떤 분기로 가는지 확인
✅ 반복문 내부 (For / While) → 루프가 정상적으로 도는지 확인
✅ 예외가 발생할 가능성이 있는 부분 → 오류 원인 분석
✅ 변수 값이 변경되는 부분 → 데이터 흐름 추적

Evalutae

PyCharm의 Evaluate Expression (표현식 평가) 기능은 디버깅 중 특정 변수의 값을 확인하거나 표현식을 실행할 때 사용하는 도구입니다.

📌 주요 기능
✅ 디버깅 중 특정 변수 값 확인
✅ 특정 코드나 표현식을 실행하여 결과 확인
✅ 새로운 값으로 변수 변경 가능

WAS(Web Apllication Server)

웹 서버와(HTTP요청 처리)와 애플리케이션 실행 환경을 제공하는 서버

사용자의 요청을 처리하고 DB와 연동하며 동적인 응답을 생성

웹서버는 정적 콘텐츠 제공, WAS는 동적인 로직 처리를 담당.

WAS는 웹 애플리케이션이 실행되는 핵심 서버로, 클라이언트의 요청을 받아서 비즈니스 로직을 실행하고 응답을 생성하는 역할을 합니다. 웹 서버와 함께 사용되며, 다양한 기술과 연계하여 확장성과 보안성을 높일 수 있음

settings.py

Author.objects.using("default") # default 로 정의해 놓은 DB를 사용
Author.objects.using("read") # 읽기 전용으로 지정해 놓은 DB사용

coverage

  • 테스트가 코드의 몇 퍼센트를 실행했는지 측정하는 지표
  • poetry run coverage run manage.py test 테스트 실행 및 커버리지 측정
  • poetry run coverage report -m 커버리지 리포트 출력
  • miss -> 1줄: 한번도 실행되지 않은 줄 체크
  • -m => show missing : 어느 라인에서 버그가 발생했는지 확인

coverage 는 전체코드 분의 제품 테스트 코드 이다. 그래서 모든 함수에 대해 테스트코드를 작성해야한다.

[tool.coverage.report]
fail_under = 80 # 몇프로를 기준으로 coverage가 됬는지 하는 것

[tool.coverage.run]
omit = [ # coverage 측정을 할 필요가 없는 것들
  ".mypy_cache/**/*", # mypy가 내부적으로 하는 커버리지
  "*/migrations/*", # 장고에서 만든건데 할 필요가 없음
  "*/*test*.py", # 테스트 코드 할필요 없음
  # 앱의 실제 코드가 테스트에 의해 얼마나 실행되었는지 측정하는 것인데 
  # 테스트를 수행하는 코드이기에 측정할 필요가 없음
]

ci 파일에 이걸 넣는다

      - name: Test python project
        run: |
          poetry run coverage run manage.py test
          poetry run coverage report -m
  • 리눅스에서 성공 여부를 체크할 수 있다. echo $? 바로 직전의 코드를 출력하는 명령어인데 eixt code 가 출력된다 리눅스에서 exit 코드는 0을 제외한 다른 숫자는 전부 오류가 발생했단 것이다

용어

  • LazyLoad : 정말로 필요하기 전까지 가져오지 않는것을 LazyLoad라 한다.
  • eagerload <=> prefetch : 미리 가져오는것

select related : join
prefetch related : 개별 쿼리가 생성

RDBMS

가장큰 특징 : 트랜잭션

서버가 다운되면 앞에 내용이 처리되는 것을 방지하기위해 전부 실패되거나 전부 성공을 처리한다 이것이
Atomicity 이다.

기본 구조는 모든것을 실행 후 commit or Rollback 을 하는 것이다.

기본 구조는 원래 BEGIN; 을 시작한후 모든 처리동작을 한후 COMMIT 을 하는것이다 or Rollback

쉽게말해 다른 브랜치로 이동하여 작업하는 것이다 그래서 다른곳에서의 일이 영향을 받지 않는다.

ACID

  • A, Atomicity: 일련의 데이터베이스 연산이 모두 성공하거나 모두 실패하는 특성. (all or nothing)
  • C, Consistency: 트랜젝션이 끝나도 integrity 가 유지되는 특성. (foreign key 가 없는 id 를 가리키거나 하지 않습니다.)
  • I, Isolation: 한 트랜젝션에서 일어난 변경사항이 다른 트랜젝션에서 조회되는 정도를 의미합니다. mysql 에서는 다음과 같은 isolation level 이 존재합니다.(innodb 기준) https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
    • SERIALIZABLE
    • REPEATABLE READ (디폴트) (다른 트랜젝션에서의 변경사항은 commit 되기 전까지는 안 보인다)
    • READ COMMITTED
    • READ UNCOMMITTED
  • D, Durability: 트랜젝션이 COMMIT 되고나면 영구적으로 저장되는 특성을 의미합니다.

0개의 댓글

관련 채용 정보