inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

견고한 결제 시스템 구축

Ledger Service 구축 (feat: Double-Entry Ledger, Trigger)

테스트 시 오류

390

강프로그래머

작성한 질문수 110

0

안녕하세요 강사님

테스트 진행 시에 오류가 발생해서

강사님께서 올려주신 샘플 프로젝트에서도 똑같이 테스트 진행해보았으나 동일한 오류가 발생합니다

혹시 테이블 제약조건 변경이 필요한건가요..?

제가 테이블 생성 시 사용했던 스크립트와 오류메세지 전달드립니다

감사합니다 



could not execute statement [Cannot add or update a child row: a foreign key constraint fails (`test`.`ledger_entries`, CONSTRAINT ledger_entries_ibfk_1 FOREIGN KEY (`transaction_id`) REFERENCES ledger_transaction (`id`))] [insert into ledger_entries (account_id,amount,transaction_id,type) values (?,?,?,?)]; SQL [insert into ledger_entries (account_id,amount,transaction_id,type) values (?,?,?,?)]; constraint [null]

spring spring-boot dbms/rdbms backend payments

답변 1

1

여정민

안녕하세요~ 질문 남겨주셔서 감사합니다.

똑같이 따라 한 것 같은데 무결성 제약 조건이 나서 불편하셨겠네요..

에러 메시지를 보니까 외래 키 제약 조건 위반을 나타내는 것 같네요. 이 경우, ledger_entries 테이블에 데이터를 삽입하려고 할 때 transaction_id 열의 값이 ledger_transaction 테이블의 id 열에 존재하지 않는 값이기 때문에 발생한 것으로 보입니다.

 

ledger_entries 테이블에 삽입하려고 하는 transaction_id 값이 ledger_transaction 테이블의 id 열에 존재하지 않기 때문에 이 에러가 발생한 것으로 보이는데요.

 

비즈니스 로직이나 테스트 코드 로직을 다시 검토해보시는걸 추천드립니다~

제 프로젝트에서는 잘되는데 왜 안되는지 모르겠군요..

0

강프로그래머

강사님께서 실습 코드에 업로드해주신 ledger-service-main 프로젝트에서 몇개의 에러가 확인되었습니다 확인 한번 부탁드려도 될까요?!

imageimage

0

강프로그래머

강사님 아래 방법으로 해결했습니다..!!

다른분도 참고하시면 좋을 것 같습니다.

 

  1. 모든 테이블 TRUNCATE 실행

  2. application.yml 파일에서 jpa.hibernate.ddl-auto: 값을 create로 변경 후 프로젝트 실행

     

  3. account 테이블에 REVENUE, ITEM_BUYER 값 INSERT

  4. 테스트 케이스 실행

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE accounts;
TRUNCATE ledger_entries;
TRUNCATE ledger_transaction;
TRUNCATE outboxes;
TRUNCATE payment_events;
TRUNCATE payment_order_histories;
TRUNCATE payment_orders;
TRUNCATE wallet_transactions;
TRUNCATE wallets;

SET FOREIGN_KEY_CHECKS = 1;

INSERT INTO accounts (name) VALUES ('REVENUE'), ('ITEM_BUYER');

1

여정민

(이미 하셨군요.. 멋지십니다.)

하.. 이상한 오류를 찾았습니다. 죄송하다는 말씀 먼저 드리고 시작할게요.

강의 들으시는데 많은 불편함을 느끼셨을 것 같아요. 죄송합니다.

 

아래 이미지를 보면 아시다시피 ledger_transaction 으로 데이터베이스에 테이블을 만들었는데, JPA 코드에서는 테이블 이름으로 ledger_transactions 로 지정하고 있는게 문제인 것 같습니다.

 

저는 왜 영상을 찍을 때 테스트가 잘 되었는지 모르겠네요. JPA @Table 애노테이션에서 name 속성 값을 ledger_transaction로 바꾸고 다시 테스트를 실행해보실래요?

 

imageimage

0

강프로그래머

헉...겨우 저거 하나가 이렇게 문제될줄은 생각도 못했네요..

주말인데도 해결해주시느라 고생 많으셨습니다ㅠㅠ

말씀대로 변경하고 실행해보니 정상 확인했습니다 강사님

알려주셔서 감사합니다!!

프로그램 아키텍쳐

0

63

1

실습코드 압축해제

0

78

1

confirm 로직에서 amount를 검증하는 부분에서 질문이 있습니다.

0

55

1

Transaction Demo 질문 드립니다.

0

60

1

cdc 방식

0

86

1

seed 키 및 orderId 에 대한 질문

0

66

1

결제 이후 404 Error 발생

0

167

1

테스트 코드 중 isPaymentDone 변환

0

76

1

가상의 Checkout 기능 구현 중 질문

0

183

1

docker Mysql 설정 문의

0

106

1

allOpen 설정이 잘못된 거 같습니다.

0

116

1

recovery 동시성 처리 관련 문의

0

120

1

confluent > skip 이 더이상 안되나봅니다.

0

107

1

강의 클론 코딩한 것 public repo에 올려도 되나요?

0

331

1

멱등키에 request를 넘기는 것

0

258

1

동시성 제어 (optimistic locking) 재시도 부분 질문 드립니다.

0

173

1

결제 복구의 세부 과정을 병렬로 처리한 이유가 궁금합니다

0

222

1

전체적인 헥사고날 아키텍쳐 설명

0

276

1

주문, 결제 로직에 대해서 질문이 있습니다.

0

282

1

주문 번호 생성 방식 관련 질문 있습니다

0

928

1

R2DBC 관련해서 질문 드립니다.

0

590

3

payment 상태 업데이트 변경 메서드를 3개나 두는 이유가 궁금합니다.

0

234

2

'더 견고해지기 위해 남은 작업' 수업자료

0

301

1

혹시 코드 리뷰 신청해도 될까요...?

0

313

1