인프런 커뮤니티 질문&답변

강프로그래머님의 프로필 이미지
강프로그래머

작성한 질문수

견고한 결제 시스템 구축

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

테스트 시 오류

작성

·

253

·

수정됨

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]

답변 1

1

여정민님의 프로필 이미지
여정민
지식공유자

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

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

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

 

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

 

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

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

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

imageimage

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

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

 

  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');
여정민님의 프로필 이미지
여정민
지식공유자

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

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

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

 

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

 

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

 

imageimage

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

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

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

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

강프로그래머님의 프로필 이미지
강프로그래머

작성한 질문수

질문하기