-
2019-08-28 개발일지개발일지 2019. 8. 28. 14:23
오늘은 프론트 팀에서 전달된 버그 사항을 수정하는 작업을 했다.
- 공지사항 목록에서 카테고리 별 목록 조회 시 총 게시글 수가 카테고리 별 조회된 게시글 수가 아닌 전체 게시글 수로 전달됨 (페이지네이션 처리 시 문제 발생)
- 공지사항 목록에서 검색어 목록 조회 시 총 게시글 수가 검색된 게시글 수가 아닌 전체 게시글 수로 전달됨 (페이지 네이션 처리 시 문제 발생)
- 게시판 목록에서 검색어 목록 조회 시 총 게시글 수가 검색된 게시글 수가 아닌 전체 게시글 수로 전달됨 (페이지 네이션 처리시 문제 발생)
위의 문제들은 다음과 같은 사항 때문에 발생했다.
exports.list = async (req, res) => { const findIncludeOptions = { where: { ..., [ Sequelize.Op.or ]: [ { title: { [ Sequelize.Op.like ]: `%${keyword}%` } } ] }, offset: n, limit: n }; try { const boards = await BoardModel.findAndCountAll(findIncludeOptions); res.json({ board: boards.rows, count: boards.count }); } catch (e) { ... } }
대략 기존에 이렇게 되어 있던 코드를 목록에서 게시글 제목과 댓글 수량을 전달하느라 쿼리 옵션이 좀 바뀌어서 다음과 같이 바꿨다.
exports.list = async (req, res) => { const countIncludeOptions = { where: { ... }, offset: n, limit: n }; const findIncludeOptions = { attributes: [ 'id', 'title', 'date', [ sequelize.fn('COUNT', sequelize.col('comments.id')), 'commentCount' ] ], include: [ { model: CommentModel, attributes: [] } ], where: { ..., [ Sequelize.Op.or ]: [ { title: { [ Sequelize.Op.like ]: `%${keyword}%` } } ] }, group: [ 'board.id', 'board.title', 'board.date' ], offset: n, limit: n }; try { const count = await BoardModel.count(countIncludeOptions); const boards = await BoardModel.findAll(findIncludeOptions); res.json({ board: boards, count: count }); } catch (e) { ... } }
attributes, include, group을 새로 선언하여 SQL의 count()함수를 수행시켰다.
그리고 기존에 findAndCountAll()로 수행했던 함수를 count(), findAll()로 분할하여 각각 실행하도록 변경했다.
여기서 count()함수에 IncludeOptions 속성 중 where절에 keyword를 누락해서 발생한 문제였다.
exports.list = async (req, res) => { const countIncludeOptions = { where: { ..., [ Sequelize.Op.or ]: [ { title: { [ Sequelize.Op.like ]: `%${keyword}%` } } ] }, offset: n, limit: n }; const findIncludeOptions = { attributes: [ 'id', 'title', 'date', [ sequelize.fn('COUNT', sequelize.col('comments.id')), 'commentCount' ] ], include: [ { model: CommentModel, attributes: [] } ], where: { ..., [ Sequelize.Op.or ]: [ { title: { [ Sequelize.Op.like ]: `%${keyword}%` } } ] }, group: [ 'board.id', 'board.title', 'board.date' ], offset: n, limit: n }; try { const count = await BoardModel.count(countIncludeOptions); const boards = await BoardModel.findAll(findIncludeOptions); res.json({ board: boards, count: count }); } catch (e) { ... } }
이렇게 해결했음!
인클루드 옵션을 변수로 따로 빼는 이유는 위의 예제 코드에는 누락했지만, 실제 업무코드에는 분기처리를 통해 옵션을 추가하거나 where 조건절을 수정하므로 따로 변수로 빼서 선언했다.
그리고 현재 기획이 필요한 기능이 아직 나오지 않아서 잠시 개발을 중단하고 타입스크립트의 클래스 부분은 공부하는 중이다.
타입스크립트의 챕터를 나갈 수록 자바를 복습하는 기분이다.
'개발일지' 카테고리의 다른 글
2019-08-30 개발일지 (0) 2019.08.30 2019-08-29 개발일지 (0) 2019.08.29 2019-08-27 개발일지 (0) 2019.08.27 2019-08-26 개발일지 (0) 2019.08.26 2019-08-23 개발일지 (0) 2019.08.23