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

Taeho님의 프로필 이미지
Taeho

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

통합 테스트 진행 도중 JdbcMemberRepository Transaction 관련 에러 문의

작성

·

420

0

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

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

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

[질문 내용]

현재 상황

스프링 DB 접근 기술 > 스프링 통합 테스트 수업을 듣던 도중 MemberServiceIntegrationTest.java 파일에서 회원가입() Test를 진행하던 도중 'java.sql.SQLException: Connection is closed'이라는 에러가 발생하는 상황입니다. 질문 게시판에서 확인해보니 현재 미해결된 상황이라 이렇게 다시금 글을 남깁니다.

구글링하여 확인해보니 @Transactional과 Connection객체의 트랜잭션 중복 문제인것 같은데... 어떻게 수정해야 할지 감이 안잡혀서 질문남깁니다. 

하단에 공유 링크 첨부합니다.

확인해주시면 감사하겠습니다.

Google Drive Link

https://drive.google.com/file/d/1KBANfw1MXw3anPnnlIQgHzs5kolswUsd/view?usp=sharing

궁금한 점

구글에 검색해보니 connection 객체의  AutoCommit을 false로 설정하거나, TransactionSynchronizationManager.initSynchronization() 함수를 사용하여 트랜잭션을 동기화하여 처리하는 방식으로 사용하면 될것이다 라는 의견들이 있었습니다. initSynchronization()함수를 사용하니 'Cannot activate transaction synchronization - already active'이런 식의 에러가 발생하고 AutoCommit을 false로 설정하니 변함없이 Connection is closed라고 표시되더군요. 어떠한 방식을 사용해서 진행해야 에러를 잡을 수 있을지 궁금합니다.

로그를 찍어보니 JdbcMemberRepository.java의 pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 이부분에서 에러가 발생하는 것 같은데... try catch로 감싸게 된다면 어떠한 Exception으로 감싸면 되는지도 궁금합니다.(IllegalStateException으로 감싸면 될까요...?)

답변 1

3

안녕하세요. 이태호님, 공식 서포터즈 David입니다.

.
코드를 잘못 작성하셔서 발생한 문제입니다.

conn.close()가 아니라 close(conn)입니다.

내부에서 connection을 처음 호출하는 회원중복확인에서 connection을 닫아버리니

멤버를 저장할 때 이미 닫혀진 커넥션을 사용하게 되므로 connection is closed 에러가 발생하는 것입니다.


.
감사합니다.

 

Taeho님의 프로필 이미지
Taeho
질문자

말씀하신대로 처리하니 정상적으로 작동됩니다! 답변 감사드립니다!!

Taeho님의 프로필 이미지
Taeho

작성한 질문수

질문하기