시퀄라이즈 여러 쿼리 보내기, Promise async await 개념
안녕하세요. 항상 강의 보면서 도움 많이 받고 있습니다.
프론트에서 체크박스로 제품을 열람가능한 유저를 선택해서
DB에서 기존 데이터를 삭제하고 체크한 유저를 다시 추가해주는 식으로
제품열람가능 유저를 업데이트 하려고 하는데요
제품모델과 유저 모델은
이런식입니다.
프론트는 Form과 Checkbox로 단일 ItemId와 UserId 배열을 보내주고
백에서 req.body로 받는 데이터는
{ id: '1', values: { customerIds: [ 'tttt', 'ttt3' ] } }
이런식으로 받습니다.
유저 tttt가 이미 등록된 상태에서
유저 tttt, ttt3 를 선택해서 등록하면
DB에는 ttt3만 등록된 결과가 나옵니다...
실제 INSERT 문도 하나만 실행되네요.
항상 이런건 아니고 될때도 있습니다.
비동기 부분이 꼬여서 그런것같은데 제가 promise 개념이 약해서
어떤식으로 해결할 수 있을지 궁금합니다.
Promise, async, await 부분은 제로초님 강의 꼭 다시 보겠습니다.
백엔드 로그는 이러합니다.
고객등록 req.body { id: '1', values: { customerIds: [ 'tttt', 'ttt3' ] } }
tester1
Executing (default): SELECT `id`, `codeName`, `name`, `packageName`, `unit`, `msrp`, `supplyPrice`, `imgSrc`, `createdAt`, `updatedAt`, `UserId` FROM `Items` AS `Item` WHERE `Item`.`id` = '1';
Executing (default): SELECT `User`.`id`, `User`.`password`, `User`.`company`, `User`.`name`, `User`.`phone`, `User`.`email`, `User`.`role`, `User`.`createdAt`, `User`.`updatedAt`, `ItemUsers`.`createdAt` AS `ItemUsers.createdAt`, `ItemUsers`.`updatedAt` AS `ItemUsers.updatedAt`, `ItemUsers`.`ItemId` AS `ItemUsers.ItemId`, `ItemUsers`.`UserId` AS `ItemUsers.UserId` FROM `Users` AS `User` INNER JOIN `ItemUsers` AS `ItemUsers` ON `User`.`id` = `ItemUsers`.`UserId` AND `ItemUsers`.`ItemId` = 1;
유저 제거 시도 tttt
유저 추가 시도 tttt
유저 추가 시도 ttt3
Executing (default): DELETE FROM `ItemUsers` WHERE `ItemId` = 1 AND `UserId` IN ('tttt')
Executing (default): SELECT `id`, `password`, `company`, `name`, `phone`, `email`, `role`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`id` = 'tttt';
Executing (default): SELECT `createdAt`, `updatedAt`, `ItemId`, `UserId` FROM `ItemUsers` AS `ItemUsers` WHERE `ItemUsers`.`ItemId` = 1 AND `ItemUsers`.`UserId` IN ('tttt');
POST /item/add-customer/ 200 9.485 ms - 236
Executing (default): SELECT `id`, `password`, `company`, `name`, `phone`, `email`, `role`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`id` = 'ttt3';
Executing (default): SELECT `createdAt`, `updatedAt`, `ItemId`, `UserId` FROM `ItemUsers` AS `ItemUsers` WHERE `ItemUsers`.`ItemId` = 1 AND `ItemUsers`.`UserId` IN ('ttt3');
Executing (default): INSERT INTO `ItemUsers` (`createdAt`,`updatedAt`,`ItemId`,`UserId`) VALUES ('2021-12-22 05:56:16','2021-12-22
05:56:16',1,'ttt3');
Executing (default): SELECT `id`, `password`, `company`, `name`, `phone`, `email`, `role`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`id` = 'tester1';
Executing (default): SELECT `User`.`id`, `User`.`company`, `User`.`name`, `User`.`phone`, `User`.`email`, `User`.`role`, `User`.`createdAt`, `User`.`updatedAt`, `Customers`.`id` AS `Customers.id`, `Customers`.`company` AS `Customers.company`, `Customers`.`name`
AS `Customers.name`, `Customers->UsersRelation`.`createdAt` AS `Customers.UsersRelation.createdAt`, `Customers->UsersRelation`.`updatedAt` AS `Customers.UsersRelation.updatedAt`, `Customers->UsersRelation`.`customerId` AS `Customers.UsersRelation.customerId`, `Customers->UsersRelation`.`providerId` AS `Customers.UsersRelation.providerId` FROM `Users` AS `User` LEFT OUTER JOIN ( `UsersRelation` AS `Customers->UsersRelation` INNER JOIN `Users` AS `Customers` ON `Customers`.`id` = `Customers->UsersRelation`.`customerId`)
ON `User`.`id` = `Customers->UsersRelation`.`providerId` WHERE `User`.`id` = 'tester1';
Executing (default): SELECT `id`, `password`, `company`, `name`, `phone`, `email`, `role`, `createdAt`, `updatedAt` FROM `Users` AS `User` WHERE `User`.`id` = 'tester1'
답변 1
1
왜 반복문으로 넣으시나요? item.addItemViewUsers(req.body.values.customerId) 이렇게 한 방에 등록 가능합니다.
0
해당 id를 가진 유저가 있는지 확인하기 위해서 반복문으로 한거긴 한데
배열로 입력이 가능한지는 몰랐습니다. ㅠ 감사합니다.
addItemViewUsers부분만 반복문에서 빼고 배열넣어주는식으로 바꿨는데 동일하게 작동이 잘 안되서
삭제부분까지
이렇게 바꾸니 작동이 잘 되네요. 정말 감사드립니다! 😍😍
유저 있는지 검사는
이런식으로 반복문으로 남겨도 될까요?
반복문인 경우 왜 작동이 안되는지도 궁금합니다. (비동기때문인지 시퀄라이즈 특성인지 제가 그냥 잘 못짠건지 ㅠ)
0
일단 반복문으로 쿼리를 날리는 건 db에 최악입니다. db에 엄청난 부담이 갑니다. N+1 문제 검색해보시고요. 저라면 그 사람들 전부를 한 쿼리에 SQL IN문으로 검사하고 자바스크립트단에서 없는 사람을 찾아낼 겁니다.
그리고 저게 작동 안 되는 이유는 저기에서 사용하신 반복문 안에서 res.send를 보내면 여러 번 보내질 가능성이 있습니다. res.send 여러 번 보내면 에러가 발생합니다.
넥스트 버젼 질문
0
90
2
로그인시 401 Unauthorized 오류가 뜹니다
0
104
1
무한 스크롤 중 스크롤 튐 현상
0
191
1
특정 페이지 접근을 막고 싶을 때
0
116
2
createGlobalStyle의 위치와 영향범위
0
102
2
인라인 스타일 리렌더링 관련
0
97
2
vsc 에서 npm init 설치시 오류
0
157
2
nextjs 15버전 사용 가능할까요?
0
166
1
화면 새로고침 문의
0
129
1
RTK에서 draft, state 차이가 있나요?
0
160
2
Next 14 사용해도 될까요?
0
455
1
next, node 버전 / 폴더 구조 질문 드립니다.
0
358
1
url 오류 질문있습니다
0
214
1
ssh xxxxx로 우분투에 들어가려니까 port 22: Connection timed out
0
391
1
sudo certbot --nginx 에러
0
1292
2
Minified React error 콘솔에러 (hydrate)
0
477
1
카카오 공유했을 때 이전에 작성했던 글이 나오는 버그
0
255
1
프론트서버 배포 후 EADDRINUSE에러 발생
0
337
1
npm run build 에러
0
525
1
front 서버 npm run build 중에 발생한 에러들
0
398
1
서버 실행하고 브라우저로 들어갔을때 404에러
0
350
2
css 서버사이드 랜더링이 적용되지 않아서 문의 드립니다.
0
290
1
팔로워 3명씩 불러오고 데이터 합쳐주는걸로 바꾸고 서버요청을 무한으로하고있습니다.
0
249
2
해시태그 검색에서 throttle에 관해 질문있습니다.
0
206
1





