Request Data 검증이 필요한 배경
이번 포스팅에서는 클라이언트로부터 Request
받은 데이터를 Model과 연계하기 전에 검증하는 방법에 대하여 알아보려 한다.
당연한 얘기지만, 클라이언트 단에서 어느정도 폼 데이터 검증을 거쳐서 서버로 전달되긴 하겠지만 100% 클라이언트에서 서버에서 원하는 형식으로 데이터가 온다고 보장할 수는 없다.
만에 하나, 서버에서 정의한 Model
형식대로 데이터가 오지 않을 경우에 원치 않은 에러가 나서 클라이언트로 에러 메시지가 올 가능성도 있고 오히려 에러가 나야 하는데 서버는 정상적인 데이터로 간주하여 Model 에 저장해버리는 상황도 있을 수 있다.
django
에서 Request
받은 데이터를 체크해주는 역할은 언제까지나 Model의 스키마 정의에 위반되었는지 아닌지 정도이다.
그 이상으로 체크해주지 않기 때문에 직접 개발자가 Request Data
검증로직을 추가해줘야 한다.
그럼 어떻게 추가해주면 될까?
Serializer에 검증 로직 추가하기
바로 Serializer
에 원하는 검증로직을 추가하면 된다.
여러가지 방법이 있지만, validate
메소드를 Overriding 해서 해결해보자.
지금까지는 PostUser
Model에 대해서 API TEST
를 진행했지만
이번부터는 DashBoard의 게시글 데이터 모델인 Post
를 중심으로 테스트 해보자.
velog_series_01/dashboard/dashboard_core/serializers.py
파일을 열어보면 현재 최신 코드는 다음과 같을 것이다.
from rest_framework import serializers
from dashboard_core.models import Post, PostUser
class PostSerializer(serializers.ModelSerializer):
title = serializers.CharField()
contents = serializers.CharField()
created_at = serializers.DateTimeField(read_only=True)
class Meta:
model = Post
fields = "__all__"
여기에 validate
메소드를 Overriding 하자.
검증 시나리오는 Post
Model의 title
데이터가 7글자 아래라면 에러가 나도록 해보자.
위의 코드에 바로 아래 줄에 다음과 같이 코드를 추가하자.
def validate(self, attrs):
title_val = attrs['title']
if len(title_val) < 7:
raise serializers.ValidationError("Title has to be at least 7 characters long!")
return attrs
Request 데이터 검증 테스트하기
이제 서버를 올리고, POST
API로 새로운 포스트를 등록해보자.
1) 정상 데이터의 경우
Advanced REST client
툴을 넣고 아래처럼 Request
한다.
문제가 없다면, 아래처럼 정상적으로 등록되었다고 Response
가 올 것이다.
2) 정상 데이터가 아닌 경우
Advanced REST client
툴을 넣고 아래처럼 Request
한다.
Title이 7글자 보다 작은 데이터를 일부러 넘겨보자.
SEND
버튼을 누르면, 아래처럼 글자수가 부족하다고 메시지가 뜨면서 등록이 실패하게 된다.
이것으로 클라이언트에서 받은 데이터를 간단히 검증하는 법에 대해서 테스트 해보았다.
다음 포스팅에는 API
를 사용해서 로그인 / 로그아웃을 테스트 해보자.
Thank you!