인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 - 적용2

테스트 오류 ㅠㅠ

작성

·

96

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

 

The object is already closed [90007-224]

org.h2.jdbc.JdbcSQLNonTransientException: The object is already closed [90007-224]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:566)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)

at org.h2.message.DbException.get(DbException.java:223)

at org.h2.message.DbException.get(DbException.java:199)

at org.h2.message.DbException.get(DbException.java:188)

at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1422)

at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:511)

at hello.jdbc.service.MemberServiceV2.accountTransfer(MemberServiceV2.java:34)

at hello.jdbc.service.MemberServiceV2Test.accountTransfer(MemberServiceV2Test.java:65)

at java.base/java.lang.reflect.Method.invoke(Method.java:568)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

> Task :test FAILED

MemberServiceV2Test > 정상 이체 FAILED

org.h2.jdbc.JdbcSQLNonTransientException at MemberServiceV2Test.java:65

1 test completed, 1 failed

FAILURE: Build failed with an exception.

* What went wrong:

Execution failed for task ':test'.

> There were failing tests. See the report at: file:///C:/Users/user/Desktop/jdbc/jdbc/build/reports/tests/test/index.html

* Try:

> Run with --scan to get full insights.

BUILD FAILED in 1s

4 actionable tasks: 1 executed, 3 up-to-date

 

이런식으로 오류가 나는데 구글링해도 도저히 원인을 못찾겠네요ㅠㅠ 도와주세요 ㅠㅠ

답변 2

0

올려주신 스크린샷 중에

MemberRepositroyV2

88번라인에서

        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, money);
            pstmt.setString(2, memberId);
            int resultSize = pstmt.executeUpdate();
            log.info("resultSize={}", resultSize);
            //여기서 con을 닫아버렸네요            
            close(con, pstmt, null);
            
        } 

저 try문에서 이미 con이 닫혀버리기 때문에 이후 작업에서

The object is already closed

에러가 뜨고 있어요~!

 

Connection은 service계층에서 넘겨주고 닫아주기 때문에 저 close(con, pstmt, null); 라인을 지우시면 정상 작동 하겠습니다

0

안녕하세요, 인프런 AI 인턴입니다. Teo님.

현재 보고 계신 문제는 테스트 환경에서 데이터베이스 연동 도중 발생하는 ‘The object is already closed’ 오류입니다. 이는 JDBC 연결이 예상치 않게 닫히면서 발생할 수 있으며, 종종 데이터베이스 연결 관리나 트랜잭션 관리와 관련이 있습니다. 이 문제의 해결을 위해 고려해 볼 수 있는 몇 가지 사항을 정리해 드리겠습니다.

  1. 데이터베이스 연결 관리:

    • 모든 JDBC 리소스(연결, 포트, 명령문 등)가 트랜잭션의 끝에서는 적절히 닫히고 있는지 확인하세요. 이를 위해 try-catch-finally 블록을 통해 명확히 리소스를 닫으시는 것이 좋습니다.
    • Spring의 트랜잭션 관리를 활용한다면, @Transactional 어노테이션을 사용하여 트랜잭션 경계를 설정하고 예외 발생 시 자동으로 롤백하도록 설정할 수 있습니다.
  2. 테스트 환경과 실제 실행 환경의 차이 확인:

    • 테스트와 실제 앱 실행 시 사용되는 데이터베이스 설정이 동일한지 확인하세요. 예를 들어, 메인 실행에서 잘 되었던 설정이 테스트에서는 다르게 작동할 수 있습니다.
  3. 트랜잭션 범위와 예외 처리:

    • 트랜잭션이 제대로 시작되고 종료되고 있는지 확인하세요. 트랜잭션 시작 후, 필요한 모든 작업이 트랜잭션 내에서 이루어져야 하며, 예외 상황이 발생하면 롤백이 되도록 구성돼야 합니다.

이와 비슷한 문제에 대한 기존의 유사한 답변을 참고하실 수 있게 링크를 제공해 드립니다:

이 외에도 코드와 설정을 함께 검토하면서 직접적으로 수정하시는 것이 가장 좋은 해결책이 될 수 있습니다. 제공해 드린 연결설정 관련 자료와 함께 설정 파일 및 JDBC 연결 코드를 재확인해 보시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기