-
2019-08-26 개발일지개발일지 2019. 8. 26. 14:08
오늘은 게시판 API를 만들고 있다.
현재 댓글 삭제 기능을 구현 중인데, 개발 중 하나의 문제에 봉착했고 이걸 해결한 내용을 작성해보려고 한다.
내가 댓글 삭제에서 구현하고자 하는 로직은 다음과 같다.
- 댓글이 존재하는가?
- 댓글이 이미 제거되었는가?
- 게시글은 존재하는가?
- 게시글은 삭제되지 않았는가?
- 댓글의 작성자가 삭제하려는 사람과 동일한 사람인가?
위의 단계에서 3번째 조건문을 타지 않는 것이 확인되었다.
위의 조건을 구현하기 위해 실제 DB에 저장된 게시글의 아이디와, 사용자로부터 URL 쿼리스트링으로 받은 게시글 아이디 값을 비교했다.
그런데 조건을 타지 않았다.
console.log()를 통해 찍어본 결과 게시글의 아이디는 같았으나, typeof를 통해 확인해본 결과 시퀄라이즈로 조회해온 값은 string이었고, 사용자로부터 받은 값은 number였다.
(사실 쿼리스트링으로 받은 값이기 때문에 string인 값을 number로 캐스팅해준 것이다.)
그러나 실제 DB에 게시글 아이디는 bigint로 설정되어있다.
bigint니까 당연히 자바스크립트로 값을 가져오면 Number 타입일거라 예상했다. 위의 컬럼 값을 시퀄라이즈를 통해 조회해오면 자바스크립트 객체에 string 타입으로 저장된다.
bigint면 number여야 하는데 왜 string? 왜 타입에 맞게 객체 값을 만들지 않는가 궁금하여 글을 찾아본 결과 다음과 같은 결과를 얻을 수 있었다.
시퀄라이즈는 일종의 인터페이스라고 하자. 그리고 그것을 구현하는 것은 각각의 SQL 드라이버 모듈인데(Spring Data JPA / Hibernate의 개념처럼 설명), 이러한 구조다보니 시퀄라이즈는 SQL에 대한 설정은 SQL 드라이버 모듈에 의존할 수 밖에 없는 구조다.시퀄라이즈는 제공하는 함수를 기반으로 config에 맞게 쿼리를 생성해주는 역할을 한다.
그리고 구현된 쿼리를 DB까지 전달하고 응답받는데 필요한게 SQL 드라이버 모듈이다.
이러한 구조다보니 시퀄라이즈는 SQL에 대한 설정은 SQL 드라이버 모듈에 의존할 수 밖에 없는 구조다.
시퀄라이즈를 통해 findByPk()와 같은 조회 쿼리를 수행할 경우 내가 이해하고 있는 수준으로 간단하게 설명해보자면
- (요청) 시퀄라이즈 → SQL 드라이버 모듈→ 'SELECT ... FROM ...' → DataBase
- (응답) DataBase → SQL 드라이버 모듈 → 시퀄라이즈 → JavaScript Object
이런 순이다.
조회한 대상을 자바스크립트 객체로 가져오기 위해서 SQL 드라이버 모듈을 거치게 되는데, 이 때 SQL 드라이버 모듈의 설정값에 따라 객체 값의 타입이 정해진다는 것이다.
위의 과정 중 만약 조회 대상에 bigint가 포함되어 있다면 SQL 드라이버 모듈의 설정에 따라 이 값이 number타입 혹은 string 타입으로 결정된다는 것이다.
나는 PostgreSQL을 사용하고 있고, 시퀄라이즈와 더불어 SQL 드라이버 모듈로 pg 모듈을 사용하고 있다.
pg 모듈은 bigint 타입을 지원하지만 디폴트 값으로 활성화되어있는 것이 아니다.
pg 모듈을 사용하며 bigint 파싱을 지원하려면 아래와 같이 pg 모듈의 설정 값을 활성화해주면 된다.
require('pg').defaults.parseInt8 = true
이후 시퀄라이즈를 통해 쿼리를 조회하면 bigint 타입은 number로 파싱해준다.
이제야 제대로 되네 꿀잼꿀잼
참고
- https://github.com/sequelize/sequelize/issues/1774
BIGINT is returned as String · Issue #1774 · sequelize/sequelize
a column type is set to BIGINT, however the type of attribute is string after retrieved from DB. If the column type is integer/float, the type of attribute is number which is correct.
github.com
'개발일지' 카테고리의 다른 글
2019-08-28 개발일지 (0) 2019.08.28 2019-08-27 개발일지 (0) 2019.08.27 2019-08-23 개발일지 (0) 2019.08.23 2019-08-22 개발일지 (0) 2019.08.22 2019-08-21 개발일지 (0) 2019.08.21