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