장고 50문 50답 -4

코변·2022년 9월 18일
0

장고 50문 50답

목록 보기
4/5
post-thumbnail
  1. DRF Serializer는 무엇이며, 어떤 기능을 수행합니까?
    • DRF의 Serializer는 DB에서 받아온 데이터를 JSON형식으로 바꾸어주거나
    • Serializer를 통한 Validation 및 에러 핸들링도 가능하고 임의대로 밸리데이션 함수를 오버라이딩하여 커스텀 밸리데이션도 가능하다.
    • 마지막으로 create함수를 통해서 밸리데이션을 통과한 JSON형식의 데이터를 변환하여 DB에 저장하는 역할 또한 수행한다.
  2. JSON 형식으로 데이터를 받고, Serializer를 통해서 JSON형식으로 데이터를 반환하는 이유는 무엇인가요?
    • JSON은 경량화 데이터교환 방식으로 xml과 달리 자료종류에 큰 제한이 없고 가볍고
    • 다른 언어로부터 독립적이여서 어떤 개발언어를 사용해서 웹서버를 개발하더라도 변환이 매우 쉽다는 장점이 있다.
    • 개인적인 생각을 덧붙이자면 json형태의 key value 쌍 형태는 dictionary 형태로 변환하기가 매우 쉽다고 생각되며 시리얼라이저 클래스가 변환하기가 매우 편하다고 생각된다.
  3. Serializer를 통해서 특정 모델에 존재하지 않지만, 관계 있는 테이블의 필드 레코드를 반환하는 방법에 대해서 설명하시오
    • 필드에 메소드필드를 선언하고 함수를 만들어 반환할 데이터를 커스텀할 수 있다.
    • 원투원 필드, 역참조 등 다양한 방식으로 데이터를 불러올 수 있으며 가지고 있는 데이터를 마음대로 커스텀 하여 반환값을 조정할 수 있다.
  4. Serializer를 통해서 역참조 하는 방법에 대해서 설명하시오
    • 역참조할 모델의 값을 _set으로 필드에 선언하고 이를 다른 시리얼라이저로 반환한다.
      • 필드에 _set 필드를 장고 ORM이 알아서 역참조 값을 찾아 반환해주고 또한 그 값을 선언한 시리얼라이저에 값으로 넣어주면
      • 역참조 값을 바라보는 시리얼라이저는 데이터를 가져와 json형식으로 변환후 반환해준다.
      • 또한 source 값을 통해서 필드에 값을 어떻게 설정할지도 결정할 수 있다.
    • 메소드 필드안에 값을 넣어준다.
      • 메소드 필드 안에 넣는 것도 위와 마찬가지로 필드에 선언하고 넣어줄 수 있다.
      • 또한 메소드 함수를 통해 지금 다루는 모델의 obj값에 직접적으로 _set으로 역참조값에 바로 접근할 수도 있다.
  5. DRF Q기능을 통해서 쿼리하는 것은 어떤 장점이 있습니까?
    • DRF의 Q는 다양한 쿼리를 한번에 보낼 수 있다는 장점이 있다.
    • 또한 and, or 처럼 직관적인 형태의 쿼리를 작성해 쓰는 사람도 그 코드를 보는 사람도 쉽게 이해할 수 있도록 도와준다.
    • 자칫 복잡해질 수 있는 쿼리를 한 번에 처리할 수 있도록 돕는다.
  6. Serializer에서 어떻게 객체를 validate하게 됩니까?
    • serializer클래스 내부에는 validate이라는 함수가 존재한다. 이 함수를 통해서 json 형태의 데이터가 들어왔을 때 시리얼라이저에 선언한 모델(모델시리얼라이저일 경우)과 형식이 맞는지 혹은 형변환을 시도했을 때 에러가 나지 않는지 등을 검사해 기준에 부합하지 않는다면 에러와 함께 디폴트로 지정된 에러메시지를 반환한다.
  7. Serializer에서 Custom Validation을 하는 이유는 무엇입니까?
    • 개발자가 검증을 할 때 단순히 데이터 형식이 맞는지를 넘어서 더 많은 검증절차를 적용하고 싶을 수도 있고 (비밀번호의 길이, 아이디에 특수기호를 제한한다던가)
    • 반환되는 디폴트 에러메시지가 개발자가 설정해놓은 다른 에러메시지들과 일관성이 없을 수도 있기 때문에 에러메시지를 개발자의 뜻대로 바꿀 수 있다는 점에서도 이유가 될 수 있다.
  8. Serializer에서 create, update 함수는 어떤 기능을 수행합니까?
    • create함수
      • create 함수는 view단에서 save()함수를 call 했을 때 실행된다.
      • 검증을 마친 데이터를 ORM과 연동해 데이터를 db에 저장한다.
      • 이 과정에서 개발자가 커스텀을 거쳐 relational field를 create함수 내부에 넣어줄 수도 있고 save함수 자체에 인스턴스로 넣어줄 수도 있다.
    • update함수
      • update함수는 view단에서 save()함수와 함께 partial이라는 파라미터가 True로 주어지면 실행된다.
      • update함수의 내부를 보면 받아온 json 데이터의 key value 값을 for문을 통해 추출하고 설정된 모델에 하나씩 집어넣고 마지막으로 저장하는 구조로 되어있다.
      • 이를 create함수와 마찬가지로 커스텀을 거쳐 개발자가 설정한 값을 데이터에 추가할 수도 있고 변경시에 데이터의 커스텀을 거칠 수도 있다.
  9. Serailizer Custom validate함수를 통해 오류 케이스를 어떻게 처리합니까?
    • 밸리데이트 함수 내부에서 개발자가 설정한 검증에 걸리는지 if 문을 통해 확인하거나 3.10업데이트 이후에 나온 패턴매칭을 통해 검사한 후
    • 걸러진 데이터가 있다면 raise를 통해서 강제로 에러를 발생시킨다.
  10. DRF permission_classes를 사용하는 이유는 무엇입니까?
    • permission_classes를 사용하면 유저들의 접근권한을 확인해 그 권한에 따른 데이터를 보내줄 수 있기 때문에 사용한다.
    • 예를들어 로그인한 사용자만 이 데이터에 접근할 수 있다면 장고에서 제공하는 IsAuthenticate클래스를 통해서 permission을 거를 수도 있고
    • 사용자 등급이 나누어져 있다면 커스텀 클래스를 만들어 사용자 등급에 따라 접근 정보의 제한을 둘 수도 있어 유저와 데이터를 핸들링하는데 도움을 받을 수 있어 사용한다.
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.

0개의 댓글