Django - 장고 모델 및 데이터베이스 Q&A

Joey Lee·2020년 5월 29일
0

Django

목록 보기
11/23

1. 모델을 잘못 설계하여, 새롭게 모델을 만들어야 될 때 어떻게 해야 되는가?

1) 모델이 크게 바뀌고, 데이터 다 날려도 될 때,

  • 데이터베이스의 데이터 다 삭제
  • (모델 이력이 담겨져 있는) migrations 내에서 init.py 외 모든 파일 (pycache도 삭제해야 함)

2) 모델이 크게 바뀌고, 기존 데이터를 삭제하지 않아야 할 때,

  • migrations 다 삭제하면 됨.
  • 다만, 삭제하고 다시 모델 세팅 했을 때, (과거에도 존재했고, 현재도 존재하는 모델의 데이터필드는) 이미 데이터가 존재하게 되는 셈임.
    • 이 때 과거 데이터를 추가해 줄지, 삭제할지 물어볼 텐데, 이 때 설정을 해 줘야 함.
    • 다만, 추가해 준다고 하면 현재 모델에서 새롭게 추가된 데이터 필드는 과거 데이터가 있는 행의 경우, 데이터가 비어있게 됨.
      • 이렇게 되면, 새롭게 생성한 데이터 필드에 null=True를 하던지, 아니면 값을 다 채워줘야 함.
      • 만약 이렇게 하지 않으면, 새로운 데이터 필드 null=false 인 상태인데, 값은 비어있는 모순이 발생함으로 에러가 발생함.
    • 데이터를 집어넣어 줄 때 데이터 타입이 안 맞는 오류 주의해야 함.
  • 혹은 데이터베이스에서 데이터 백업해서 빼놓고 디비 수정한 뒤 다시 마이그레이션해서 집어 넣으면 됨.

3) 기존 모델에 단지 컬럼만 추가할 때,

  • 위와 마찬가지로 컬럼이 추가되면, 해당 DB 테이블의 과거 Row에는 추가한 컬럼의 데이터는 비어있는 상태임.
  • 만약 추가된 컬럼이 null=False이면, 비어 있는 데이터란에 추가를 입력해 주어야 함.

Q) 데이터 필드를 추가하면 장고에서는 어떤 작업을 수행하나?

  • 컬럼 하나 추가했을 뿐인데, 장고에서는 아래와 같은 작업을 수행함.

    • 새로운 테이블 만듬.
    • 새로운 테이블에 기존에 있는 데이터들 다 카피해서 집어넣음.
    • 과거 테이블을 삭제함.
    • 새로운 테이블 이름을 과거 테이블 이름으로 바꿈.
  • 바로 이런 일을 해 주는게 ORD의 역할 중 하나임

  • 위와 같은 작업 내역들을 확인하려면 컬럼 추가한 뒤에 아래와 같은 명령어를 날려볼 것

    • show migrations
    • sql migrate
    • python manage.py showmigrations 앱명
    • python manage.py sqlmigrate 앱명 0001
    • python manage.py sqlmigrate 앱명 0002
  • 장고 query-set만 잘 하면, sql 구문으로는 어떻게 해야 되는지 장고에서 다 알려줌. (이런 부분은 검색하면 방법을 알려줄 듯 함)

2. migration 문서 이해

  • dependencies : (과거 생성한) migration 파일명들이 나옴.
  • operation : 위의 파일에 더해서 이번 마이그레이션에서 수행한 내역을 보여줌

4. 어떤 기준으로 Views를 설계할 것인가?

  • 모델을 완성하면, 서비스가 수행해야 할 로직의 절반 이상은 완성이 됨.
  • 여기에 유저의 end-point를 고려해서, 최적화된 경로를 어떻게 설정할지 고민이 된다면 만들어야 될 큰 방향의 View 설계는 할 수 있음.
    • 최대한 경로명을 최소화하도록 할 것
  • 페이지를 기준으로 View를 생각하면 안 됨. 백엔드는 데이터를 기준으로 잡고, 데이터의 변화를 View로 만들어 주는 것이라 생각하면 됨.
    • 왜 이제야 백엔드를 기획할 때 모델을 가장 먼저 설계를 해야 되는지 알 것 같음.
    • 모델 설계 시, 수행하는 요구사항 분석 -> 개체/속성 추출 -> 개체 간의 관계 정의는 단지 모델 설계에서 끝나는 것이 아니라 View를 만드는 뼈대를 제공해 주는 것임
  • 이 부분은 REST API에 대한 글을 읽어 보면 더 잘 알 수 있음. (REST API 제대로 알고 사용하기)
profile
안녕하세요!

0개의 댓글