[내일배움캠프] 최종 프로젝트 Day 27 | Node.js 4기 | Day 108 | 24.04.21.(일)
[Nest] 6691 - 2024. 04. 21. 오후 5:30:02 ERROR [VisionService] detectLabels 오류: Failed to updated or retrieve user points
[Nest] 6691 - 2024. 04. 21. 오후 5:30:02 ERROR [ExceptionsHandler] Label Detection 실패: Failed to updated or retrieve user points
Error: Label Detection 실패: Failed to updated or retrieve user points
at VisionService.certificateImageCategory (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/vision/vision.service.ts:523:13)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at VisionController.certificateImageCategory (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/vision/vision.controller.ts:38:31)
user과 연결된 point의 아이디를 저장하려면 column을 하나 더 만들어야 하나? 그냥 연관 관계만 설정한 것과는 또 다른 얘기지?
User와 Point 사이의 연결을 구현하려고 할 때, 데이터베이스 설계는 해당 연결의 성격과
요구 사항에 따라 달라질 수 있습니다. 여기서는 두 가지 주요 상황을 고려할 수 있습니다:
1:1 관계와 1:N 또는 N:M 관계입니다.
1:1 관계
User와 Point가 1:1 관계라면, 즉 사용자마다 단 하나의 Point만 연결된다면,
User 테이블에 Point의 ID를 참조하는 외래키(Foreign Key)를 추가하는 것이 일반적입니다.
이 경우, User 테이블에 새로운 컬럼을 추가하여 Point 테이블의 기본 키(Primary Key)를 참조하도록 설정합니다.
ALTER TABLE User ADD COLUMN point_id INT;
ALTER TABLE User ADD CONSTRAINT fk_point_id FOREIGN KEY (point_id) REFERENCES Point(id);
1:N 또는 N:M 관계
하지만, User와 Point 사이의 관계가 1:N 또는 N:M이라면 상황이 복잡해집니다.
예를 들어, 한 User가 여러 Point를 가질 수 있거나, 하나의 Point가 여러 User에게 할당될 수 있다면,
이러한 관계를 직접적으로 표현하기 위해서는 중간 테이블(Join Table)이 필요합니다.
1:N 관계
User가 여러 Point를 가질 수 있는 1:N 관계의 경우, Point 테이블에 User의 ID를 참조하는 외래키를
추가할 수 있습니다. 이는 각 Point가 한 User에만 속할 수 있음을 의미합니다.
ALTER TABLE Point ADD COLUMN user_id INT;
ALTER TABLE Point ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES User(id);
N:M 관계
User와 Point 사이에 N:M 관계가 있다면, 즉 사용자가 여러 Point를 가질 수 있고,
하나의 Point도 여러 사용자에게 할당될 수 있다면, 중간 테이블을 사용해야 합니다.
이 중간 테이블은 User와 Point 사이의 모든 연결을 저장합니다.
CREATE TABLE UserPoint (
user_id INT,
point_id INT,
PRIMARY KEY (user_id, point_id),
FOREIGN KEY (user_id) REFERENCES User(id),
FOREIGN KEY (point_id) REFERENCES Point(id)
);
이 테이블은 User와 Point 사이의 매핑을 관리하며, 각 사용자가 가지고 있는 포인트와 각 포인트를 가지고 있는 사용자의 목록을 쉽게 조회할 수 있도록 해줍니다.
결론
User와 Point 사이의 정확한 관계를 파악하는 것이 중요합니다. 이에 따라 단순히 User 테이블에 컬럼을 추가하는 것에서부터, 중간 테이블을 생성하는 복잡한 구조까지, 다양한 구현 방법이 필요할 수 있습니다. 이러한 구현은 데이터베이스의 정규화, 조회의 효율성, 그리고 애플리케이션의 요구 사항을 고려하여 결정되어야 합니다.
인증할 때에도 JwtAuthGuard를 걸어줘야 할 것 같다.
-> 두 개 계정 사용하는데 refreshToken이 똑같이 나오는 것 같다. 이거 상웅님께 문의해보기
-> 아닌 것 같음 | 내 문제인 것 같음
현재 userPoint에 저장된 Point에 저장된 user_id가 현재 사용자의 user_id와 다른 경우, 현재 사용자의 아이디를 user_id 값으로 갖고 있는 Point를 찾고 해당 Point를 userPoint로 바꿔주는 코드가 빠진 것 같은데
[Nest] 12962 - 2024. 04. 21. 오후 9:23:48 ERROR [ExceptionsHandler] Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.
UpdateValuesMissingError: Cannot perform update query because update values are not defined. Call "qb.set(...)" method to specify updated values.
at UpdateQueryBuilder.createUpdateExpression (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/query-builder/UpdateQueryBuilder.ts:681:19)
at UpdateQueryBuilder.getQuery (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/query-builder/UpdateQueryBuilder.ts:53:21)
at UpdateQueryBuilder.getQueryAndParameters (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/query-builder/QueryBuilder.ts:495:28)
at UpdateQueryBuilder.execute (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/query-builder/UpdateQueryBuilder.ts:142:50)
at updateSubject (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/persistence/SubjectExecutor.ts:618:63)
at Array.map (<anonymous>)
at SubjectExecutor.executeUpdateOperations (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/persistence/SubjectExecutor.ts:670:34)
at SubjectExecutor.execute (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/persistence/SubjectExecutor.ts:148:20)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at EntityPersistExecutor.execute (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/persistence/EntityPersistExecutor.ts:182:21)
query failed: INSERT INTO `users`(`user_id`, `email`, `name`, `nick_name`, `password`, `image`, `provider_id`, `point_id`) VALUES (DEFAULT, ?, ?, DEFAULT, ?, DEFAULT, DEFAULT, DEFAULT) -- PARAMETERS: ["sjwoo1999@gmail.com","빵빵이","$2b$12$.VovSh206zRRPf/PxaMb8.gxMkQpT1IepfRDRHlxlomA0HS9Ssqg."]
error: Error: Cannot add or update a child row: a foreign key constraint fails (`lifebit`.`users`, CONSTRAINT `FK_ca3bb4d01c9b2ea15117be0a1ce` FOREIGN KEY (`point_id`) REFERENCES `point` (`id`))
query: ROLLBACK
[Nest] 13964 - 2024. 04. 21. 오후 9:56:07 ERROR [ExceptionsHandler] Cannot add or update a child row: a foreign key constraint fails (`lifebit`.`users`, CONSTRAINT `FK_ca3bb4d01c9b2ea15117be0a1ce` FOREIGN KEY (`point_id`) REFERENCES `point` (`id`))
QueryFailedError: Cannot add or update a child row: a foreign key constraint fails (`lifebit`.`users`, CONSTRAINT `FK_ca3bb4d01c9b2ea15117be0a1ce` FOREIGN KEY (`point_id`) REFERENCES `point` (`id`))
at Query.onResult (/Users/_woo_s.j/Desktop/workspace/earth-marvel/src/driver/mysql/MysqlQueryRunner.ts:246:33)
at Query.execute (/Users/_woo_s.j/Desktop/workspace/earth-marvel/node_modules/mysql2/lib/commands/command.js:36:14)
at PoolConnection.handlePacket (/Users/_woo_s.j/Desktop/workspace/earth-marvel/node_modules/mysql2/lib/connection.js:481:34)
at PacketParser.onPacket (/Users/_woo_s.j/Desktop/workspace/earth-marvel/node_modules/mysql2/lib/connection.js:97:12)
at PacketParser.executeStart (/Users/_woo_s.j/Desktop/workspace/earth-marvel/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/Users/_woo_s.j/Desktop/workspace/earth-marvel/node_modules/mysql2/lib/connection.js:104:25)
at Socket.emit (node:events:519:28)
at addChunk (node:internal/streams/readable:559:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:510:3)
at Socket.Readable.push (node:internal/streams/readable:390:5)
이 오류 메시지는 데이터베이스에 users 테이블에 새로운 행을 추가하려고 시도할 때 발생하는 것으로 보입니다. 오류의 핵심은 point_id 필드와 관련된 외래 키 제약 조건(FOREIGN KEY) 위반이며, 이로 인해 새로운 행을 users 테이블에 삽입할 수 없습니다.
오류 원인:
오류 메시지에 따르면, point_id 필드에 대한 외래 키 제약 조건이 point 테이블의 id 필드를 참조하고 있습니다. 하지만 삽입하려는 point_id 값이 point 테이블에 존재하지 않거나, DEFAULT 값으로 설정되어 있어서 발생하는 문제입니다. 즉, users 테이블에 새로운 행을 추가하려면, 해당 point_id가 point 테이블에 유효한 참조 값을 가져야 합니다.
해결 방법:
- point 테이블에 새로운 point 행 추가:
- 새로운 사용자 추가 시 point_id 설정:
- 데이터베이스 트랜잭션 사용:
- 예외 처리 및 유효성 검증:
- 데이터베이스 스키마 검토:
이러한 단계를 따라 문제를 해결함으로써, users 테이블에 새로운 사용자를 성공적으로 추가할 수 있게 됩니다. 데이터베이스 작업을 수행할 때는 항상 데이터 일관
query failed: INSERT INTO `point`(`id`, `value`, `created_at`, `total_value`, `user_id`) VALUES (DEFAULT, ?, DEFAULT, ?, ?) -- PARAMETERS: [100,100,1]
error: Error: Duplicate entry '1' for key 'point.REL_9399c30a2304f6948938f84b06'
query: ROLLBACK
[Nest] 15396 - 2024. 04. 21. 오후 11:00:16 ERROR [VisionService] detectLabels 오류: Duplicate entry '1' for key 'point.REL_9399c30a2304f6948938f84b06'
[Nest] 15396 - 2024. 04. 21. 오후 11:00:16 ERROR [ExceptionsHandler] Label Detection 실패: Duplicate entry '1' for key 'point.REL_9399c30a2304f6948938f84b06'
Error: Label Detection 실패: Duplicate entry '1' for key 'point.REL_9399c30a2304f6948938f84b06'