seminar-2020
seminar-2020 copied to clipboard
PUT /api/v1/user/me/ 에서 정보가 없는 경우 ""와 null로 저장하는 이유
과제 2에 따르면, User가 자신의 정보를 업데이트할 때,
university, company, year가 없는 경우 ""
나 null
로 저장하라고 명시되어 있습니다.
즉, User가 university를 언급하지 않았는데도(empty body를 보내도) 내용이 ""
으로 바뀌는 것입니다.
하지만 다른 필드는 이러한 형태로 구현되어 있지 않습니다. username이나 first_name, last_name을 포함하지 않는 요청을 보내는 경우, 이 값들은 이전에 저장되어 있던 값을 유지합니다.
다른 필드와 university, company, year에서 update의 작동방식이 다르게 명시된 이유가 무엇인가요? 혹시 제가 과제를 잘못 이해했다면 알려주시면 감사하겠습니다.
이전에 저장되어 있던 값이라는게 어떤 말인가요??
@gyusang 잘못 이해하신 부분이 있는 것 같습니다. body가 완전히 비어있어도 무시하면 됩니다.
라는 내용도 있듯(이 경우가 말씀하신 empty body에 해당하겠네요), body에 해당 key가 없으면 다른 API의 동작이 그렇듯 그 column은 건드리지 않습니다. university를 수정할 수 있는데, 정보가 없다는 것이 의도한 바는 request body로서 university라는 key의 value가 없는 경우입니다. 이럴 때는 해당 정보를 비운다는 요청이 들어온 것으로 보고 삭제하는 것입니다. 다른 API의 동작과 이런 점에서 다르지 않습니다.
그렇군요, 제가 잘못 이해했습니다.
그런데 과제 내용에 value가 0글자인 경우에 대한 언급도 있던데, 'value가 0글자'인 것과 'value가 없는' 것과 'value가 null'인 것은 모두 다른 것인가요?
@YeonghyeonKO 이번 PUT 요청 이전에 이루어진 POST /api/v1/user/ 등에서 저장되었던 값을 '이전에 저장되어 있던 값'이라고 표현했습니다.
아하 그렇다면 postman에서 form data를 다 날려도 이전에 저장되어 있던 값이 날라가는건가요?
@YeonghyeonKO 과제를 그렇게 구현해야 하는 것으로 잘못 이해했다가, @davin111 님의 말씀을 듣고 코드를 수정했습니다.
@gyusang 실질적으로 Django view method 입장에서 다르지 않습니다. request body로 들어온 해당 key의 값이 '없다'면, 이를 실제로 DB에 0글자(""
)로 저장할지 null
로 저장할지 선택의 여지가 생기는데요, 일반적으로 null
이겠지만 CharField
에 해당하는 column에 저장할 것이면 null
이 아닌 ""
으로 저장한다는 것입니다.(null=False, blank=True
이므로)
@YeonghyeonKO 위에도 설명했듯 key가 명시되어있는데 그것의 value가 없으면 이전에 저장된 값을 없애는 것이구요(말이 없애는 거지 그냥 들어온 값(비어있는 값)으로 update하는 것으로 본질이 다르지 않습니다), key가 명시가 안 되어있으면 당연히 그 값은 그대로 둡니다. 수정 요청조차 없었던 것이니까요.