[Go] gorm - zero value 집착의 나쁜 사례

gorm을 사용하던 중에 굉장히 창의적인 동작을 발견해서 기록해본다.


이런 간단한 테이블이 있다고 가정해보겠다.


그러면 이런 식으로 테이블을 생성하고, 데이터를 집어넣어볼 수 있을 것이다.
디버그 쿼리 상으로 보았을 때는 의도한 대로 동작한 것 같다.


Enabled를 false로 바꿔도 마찬가지다.


그런데 여기에 컬럼 디폴트 설정을 추가하면 뭔가 이상해지기 시작한다.


난 분명히 Enabled에 false라는 값을 명시적으로 줬는데도


디폴트값인 true로 값이 박혀서 들어간다.
컬럼 디폴트 설정을 넣었으면 그냥 DDL 수정으로 끝나고 영향을 주지 않아야 하는데, Zero Value인 false로 들어갔다고 없는걸로 치고 디폴트에 명시된 값을 직접 꼬라박은 것이다.

boolean이라서 그런 것도 아니고, 모든 타입이 다 저런다.
이 문제를 해결하려면 저 타입을 포인터 타입으로 바꿔서 nil이 zero value가 되고, false가 유효한 값이 되게 유도해야 한다.



심지어 Updates에 대해서도 기묘한 동작을 반복한다.

저기서 id가 1인 값에 대해서 enabled를 false로 바꿔보겠다.


그럼 이런 식으로 짤 수 있을텐데


마찬가지로 zero value인 false를 씹고 쿼리에 넣지도 않는다.


언어 설계부터가 결함덩어리라 그런가, 메이저 모듈 중에서도 멀쩡한게 몇개 없다.