Coding/내일배움캠프

[내일배움캠프] 최종 프로젝트 Day 27 | Node.js 4기 | Day 108 | 24.04.21.(일)

_Woo_ 2024. 4. 21. 23:53
[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 테이블에 컬럼을 추가하는 것에서부터, 중간 테이블을 생성하는 복잡한 구조까지, 다양한 구현 방법이 필요할 있습니다. 이러한 구현은 데이터베이스의 정규화, 조회의 효율성, 그리고 애플리케이션의 요구 사항을 고려하여 결정되어야 합니다.

 

겁나 이상한데

 

조금 됐다?

 

user 엔티티의 point_id의 값도 primarygeneratedcolumn으로 둬도 될까?

 

 

인증할 때에도 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 테이블에 유효한 참조 값을 가져야 합니다.

해결 방법:

  1. point 테이블에 새로운 point 행 추가:
  2. 새로운 사용자 추가 시 point_id 설정:
  3. 데이터베이스 트랜잭션 사용:
  4. 예외 처리 및 유효성 검증:
  5. 데이터베이스 스키마 검토:

이러한 단계를 따라 문제를 해결함으로써, 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'