2020. 12. 13. 08:48ㆍ개발 이야기/Postgresql
안녕하세요. 아침부터 본의 아니게 쿼리 수정을 하면서 어느 사용자분께 푸시 폭탄을 보내게 되어.. 내용 정리겸 사과 말씀 겸 자료를 남겨봅니다.
함쓰 가계부는 매일 아침 7시 사용자분들이 등록한 고정 지출/수입 건이 자동으로 등록되는 Agent 가 동작합니다.
python 으로 개발 되어 있고 저같은 경우는 매일 아침 테스트 건이 오도록 매일 반복건을 등록해 두었지요.
알람이 오지 않는다면 서비스에 문제가 생긴것이니 모니터 차원입니다.
또한 제가 사용중이므로 실제로 등록된 반복건도 옵니다.
오늘 이상하게 날이 도래하지도 않았는데 알람이 왔습니다.
그런데 알람만 오고 가계부 등록은 되지 않았더군요.
그래서 수정을 위해서 소스코드를 확인중에 여러번 테스트를 했습니다.
저만 해당되는줄 알았거든요.
일단 오늘 (일요일) 고정지출을 등록하신 사용자분께는 사과 말씀 드립니다.
일단 데이터를 살펴보았습니다.
함쓰 반복 데이터를 관리하는 테이블입니다.
특별할 것도 없으니 공개해도 되겠지요?
저기 두번째 컬럼이 바로 해당테이블에 데이터가 들어갈때마다 숫자 1씩 증가하는 serial 컬럼입니다.
그냥 믿고 쓰는 거지요.
insert 를 할때 제가 따로 값을 지정하지 않습니다.
그런데 마지막줄을 보면 제가 키를 moneybook_id (가계부를 구분하는 구분값입니다.) 와 같이 주었습니다.
사실 여기서 문제가 발생했습니다.
DB구조상으로는 키를 그냥 repeat_id 하나만 주어도 됩니다.
그리고 제가 준것처럼 moneybook_id 과 함께 준것은 가계부별 repeat_id 를 별도로 관리한다는 뜻이죠.
즉 1번 가계부의 반복 정보는 repeat_id 가 1부터 시작
2번 가계부의 반복 저보도 repeat_id 가 1부터 시작..
각 가계부별 순번을 갖는다는 의미인데 제가 만든 테이블은 그렇게 동작하지는 않습니다.
모든 데이터를 그냥 순번을 딴다는 뜻이죠.
결론적으로 의미없는 primary 키를 설정한것이죠.
그래도 구조상 문제는 없습니다. 저렇게 하나 이렇게 하나 잘 작동한다는 것입니다.
그러나 만약 repeat_id만 키로 설정했다면 오늘의 문제는 발생하지 않았을것입니다.
왜냐하면 pk 는 기본으로 유니크하거든요.
결론적으로 오늘의 문제는 serial 한 컬럼의 값이 중복이 되었습니다..?? 앵 어떻게 중복이 되었을까.. 한참 생각해봤습니다.
제가 함쓰를 처음 만들고 배포할때 개발서버의 제가 사용하는 고정건이 15개 정도 되는데 다시 입력이 귀찮아서 밀어넣은적이 있습니다.
이때 serial 컬럼에 값을 빼고 넣어야 DBMS 가 자동으로 1씩 증가시키면서 넣었을 것입니다.
그런데 제가 그 값도 같이 넣었던 거죠. 제가 경험한 MSSQL 의 경우 똑같이 작업을 하면 값이 안들어 갑니다. 특정 셋팅을 풀고 넣어야 하죠.
그런데 postgresql 은 아무런 문제 없이 값이 잘 들어갔습니다.
그리고.. 정상적으로 등록된 반복건을 사용자 어떤분이 등록하셨을때 번호가 다시 1부터 시작한겁니다.
제가 밀어넣었던 번호 뒤부터 1씩 증가해야 하는데 완전 1부터 시작한거죠..-.-
그래서 밀어넣은 값과 자동으로 채번된 값이 중복이 되었고 pk가 moneybook_id까지 체크하므로 유니크하니 문제가 없었던 거죠
유니크하다고 판단하고 만들어진 로직덕에 .. 값을 안들어갔지만 푸시 쪽에 영향을 주어 저에게는 가계부 내역등록 없이 알람만 왔고..
테스트 하는동안 사용자분에게는 내역도 등록되고 푸시도 계속 들어오는 상황이셨을 겁니다.
가계부 오류 설명을 장황하게 했습니다만 이런문제도 있더라 라고 이해해 주시면 감사하겠습니다.
'개발 이야기 > Postgresql' 카테고리의 다른 글
pgpool 4.1.4 auto fail-over, fail-back (2) | 2021.06.20 |
---|---|
pgpool II 4.1.4 load balance (0) | 2021.06.19 |
postgresql replication 수동 fail-over / fail-back (0) | 2021.06.19 |
vultr 가상화 + ubuntu 21.04 + postgresql 13 replication (0) | 2021.06.16 |