본문 바로가기
Golang

SQLBoiler boiler 객체에 update가 제대로 되지 않는 이슈 추적

by Limm_jk 2023. 1. 11.

문제 제기

insert 시, 해당 model의 boiler 객체에 업데이트 된 값이 들어오는 것을 확인 함. (id가 채워져 있는 것을 확인)

이를 보고 해당 객체의 fetch를 다시 해오는 것이라고 생각했음.

그런데, timestamp without timezone으로 인하여 db에 insert된 결과 값과 insert의 결과로 받은 값이 다른 현상이 발생.

본론

  1. boiler 구현체 내부에서 default 값이 있는 컬럼들을 정의해둔다. ({model}ColumnsWithDefault)
  2. insert 연산 시, insert 요청을 받은 model을 확인하여 non zero value를 가진 column들을 찾는다.
  3. 이를 1 에서 확인한 column들과 비교하여 default 값이 있으나 zero value인 column들을 찾는다.
  4. 이 column들을 모아서 insert query에 returning으로 지정한다.
  5. 이 return 받은 값을 Scan 메서드를 통하여 decode하고 매핑해준다.
    1. 이 매핑을 위하여 해당 컬럼의 포인터를 찾아서 Scan method에 넘겨주고 해당 포인터에 값을 넣어주는 굉장히 매지컬한 흐름을 가짐 (Next를 했더니 값이 생기고…)
  6. 이 값을 return. 이로 인하여 모든 값이 아닌 필요한 값만 업데이트되게 됨.

결론

  1. insert를 통하여 업데이트되는 boiler 객체의 값이 멀쩡하지 않은 값일 수 있음.
  2. 이런 경우 reload를 통하여 다시 가져오는 추가로직이 필요할 수 있다.
  3. 하지만, 고민해봤을 때 without timezone과 같은 경우가 아니라면 이럴 일이 없을 것 같아서, 선제적으로 로직 변경은 필요하지 않을 것 같다.

댓글