신입으로 입사한지 얼마 안되었을때, 나는 사수와 다음으로 인해 의견 충돌이 일어났다. 유저가 보낸 request body 에서 값이 없을 수 있는 필드가 있을 때 (에: memo) DB에는 어떻게 저장해야 할까?
나(신입) | 사수(2년) |
---|---|
빈문자열은 DB에 ""로 집어넣어야 한다. | NULL 로 통일해야 일관성이 있을 것 |
내 근거는 다음과 같다.
사수의 근거는 다음과 같다.
2일에 걸쳐 의견을 나누었지만, 정답은 없었다. 그래서 사수의 의견을 따르기로 하였다.
추가적으로 아래와 같은 상황을 정해야 했다.
문제 | 결정 |
---|---|
FE에서 필드에 값이 없을 때 key 값에 넣어서 보낼것인가, 말것인가 | 명시적으로 비어있다는 것을 알려주기 위해 FE에서 값이 없음을 표현하는 것이 좋다고 생각되어 key 값은 꼭 있어야 한다는 것을 약속했다 |
FE 에서 null 과 "" 중 무엇을 넣어 보내줄 것인가 | "" 을 넣어 보내주기로 하였다. |
다만 Django 컨벤션을 어기다 보니, DRF와 Model을 정의하여 사용하는데에 있어 불편함이 조금 있었다. 모델 필드에서 null=True 를 주기 위해서는 blank=True 옵션을 꼭 주어야 했다. DRF의 시리얼라이저가 이를 변환하기 위해서 "memo": ""
와 같은 값을 받았을 때, blank=False, null=True
와 같은 옵션 값을 지원하지 않는 다는 점에 있었다.
따라서 우리는 ""
값을 None
로 변환하는 로직을 서비스에 넣었고, 잘 동작함을 확인할 수 있었다.
Django의 컨벤션이 일반적인 DB 컨벤션보다 위에 있는 사실이 마음에 들지 않았다. 정확히는, 지원하지 않는 컨벤션 방식을 택하기 위해 코드적으로 우회를 하여 복잡도를 추가했다는 사실이 힘들었다. 개인적으로 장고가 왜 두가지 모두를 왜 지원하지 않았을까 궁금하다.
다만, 나는 장고 컨벤션만이 정답이라고 생각하고 사수와 기술적 논의를 오래 가져갔다. 결국 조금 돌아가는 방법을 선택하긴 했지만, 서비스 자체는 잘 동작했기 때문에 비지니스 로직을 작성하는 바쁜시기에 이러한 기술적 논의를 요청하는 것이 사수에게 심적인 부담이 되었을 것 같아 죄송스럽다. 그럼에도 불구하고 따로 논의할 시간을 만들어 나누었던 이야기를 통해 배울 수 있는 점이 많았다.
그 이후에는 어떤 컨벤션이 무조건 옳다라는 생각보다, 요청을 한 두번 해보고 만약 그것이 서비스 생존에 있어 필수적인 상황이 아니라면, 리더가 이끄는 방향으로 따르고자 한다. 그것이 생존이 급한 스타트업에서 멋진 개발이 아닌, 제 시간내에 기능을 유저에게 전달하기 위한 좋은 개발임을 사수에게 배웠기 때문이다.
Two Scope of Django 3.0 (table 6.2 72p) 에서는 다음과 같이 소개하고 있다. (CharField, TextField, SlugField, EmailField 관련 필드 한정)
DB 컨벤션이 적힌 정확한 문서를 찾을 수는 없었다. 다만, 대부분 구현하는 방식으로 해당 필드가 값을 가져야 하는 필수적인 필드이면, ""를 사용한다. 반면, 사용자가 입력을 선택할 수 있는 값이고, 사용자가 입력하지 않았음을 나타내고 싶다면 NULL 을 사용한다고 한다. (chatgpt 답변)