๐[DRF] ์๋ฆฌ์ผ๋ผ์ด์ ์ ํจ์ฑ ๊ฒ์ฌ(is_valid())?
์ ํจ์ฑ ๊ฒ์ฌ - Validation?
์ ํจ์ฑ ๊ฒ์ฌ(Validation)
๋, ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์ค์ ์ ํจํ ๊ฐ์ธ์ง ์๋์ง๋ฅผ ํ๋จํ๋ ๊ณผ์ ์ด๋ค.
์์๋ก ๋ก๊ทธ์ธ
์ํฉ์ ๋ค ์ ์๋ค.
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํผ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด, ๊ทธ ๊ฐ๋ค์ด ์๋ฒ๋ก ๋์ด์ฌ ๊ฒ์ด๋ค.
๊ทธ ๋, ์์ด๋ ํน์ ๋น๋ฐ๋ฒํธ๊ฐ ์ค์ ํ์ DB์ ์กด์ฌํ๋ ๊ฐ์ธ์ง, ์ค๋ณต๋ ๊ฐ์ ์๋์ง ๋ฑ์ ํ๋จํ๋ ๊ณผ์ ์ด ํ์ํ ๊ฒ์ด๋ค.
DRF(Django Rest Framework)
์์๋ ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ์ ๊ฐ์ ์๋ฆฌ์ผ๋ผ์ด์ (Serializer)
๋ฅผ ํตํด ์ง๋ ฌํ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์ด ํ, ์ง๋ ฌํ ํ ๊ฐ์ ๊ฐ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ง์น ํ์ ๋๋จธ์ง ๋ก์ง์ ์ํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
DRF์์๋ is_valid()
๋ฉ์๋๋ฅผ ํตํด ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.
serializer.is_valid()?
is.valid()
๋ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ, ๊ทธ ๊ฐ์ด ์ ํจํ ๊ฐ์ธ์ง ํ๋จ
ํ๋ ๋ฉ์๋์ด๋ค.
is_valid()๋ฉ์๋์๋ raise_exception=True
ํน์ raise_exception=False
์ ์ต์
์ ์ค์ ํ ์ ์๋ค.
์๋๋ is_valid()๊ฐ ๊ตฌํ๋์ด์๋ restframework.serializers.py
์ ์ผ๋ถ์ด๋ค.
class BaseSerializer(Field):
...
def is_valid(self, *, raise_exception=False):
assert hasattr(self, 'initial_data'), (
'Cannot call `.is_valid()` as no `data=` keyword argument was '
'passed when instantiating the serializer instance.'
)
if not hasattr(self, '_validated_data'):
try:
self._validated_data = self.run_validation(self.initial_data)
except ValidationError as exc:
self._validated_data = {}
self._errors = exc.detail
else:
self._errors = {}
if self._errors and raise_exception:
raise ValidationError(self.errors)
return not bool(self._errors)
...
์ด ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด raise_exception
์ต์
์ False๊ฐ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
raise_exception
์ต์
์ ๋ญ๊น?
raise_exception ์ต์
์ด ์ต์
์ is_valid()
๋ฅผ ์ํํ ๋, ๊ฐ์ด ์ ํจํ ๊ฐ์ด ์๋๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ต์
์ด๋ค.
๋ง์ฝ raise_exception=True
๋ก ์ค์ ํ๋๋ฐ, is_valid()
์ค ๊ฐ ์ฒดํฌ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ValidationError
๋ฅผ raiseํ๊ฒ ๋๋ค.
๋ณดํต์ ๊ฒฝ์ฐ์๋ view์์ ์ค๊ฐ์ exception์ด raise๋ ๊ฒฝ์ฐ, 500 ์๋ฒ ์๋ฌ๋ฅผ ๋ฆฌํดํ๋ค.
ํ์ง๋ง, ์ต์ ์ True๋ก ์ค์ ํ ์ํ์์ ValidationError๊ฐ raise๋๋ ๊ฒฝ์ฐ์๋ DRF์์ exception ํธ๋ค๋ฌ์ ์ํด 400 ์ฝ๋๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
[ํด์ค๊ณผ ํจ๊ป ์ฝ๋ DRF ๋ฌธ์] Validation - Raising an exception on invalid data
๋๊ธ๋จ๊ธฐ๊ธฐ