Inflearn brand logo image

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

김*혜님의 프로필 이미지
김*혜

작성한 질문수

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

스프링 통합 테스트

회원가입 테스트 중 빈값 오류

작성

·

23

1

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

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

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

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

현재 강의 8분쯤, 회원가입 테스트 할때
"이미 존재하는 회원입니다"를 방지 하기 위해 delete from member; 이후에 정상 작동 되어야 하는데, 오류가 나는 상황입니다.

 

회원가입 테스트 함수 내에,

join 함수 실행 후에, findOne(saveId) 에서 빈값으로 확인됩니다.

saveId 의 경우엔 테스트 할때마다 시퀀스가 올라서 11, 12, ... 가 확인됩니다.

 

select * from member; 시에 빈값이고,

join(member)가 정상으로 됬기 떄문에 saveId값이 오르고 있는것 같은데,

findOne에서 빈값이라고 하니 get()할 값이 없어서 오류가 나는것 같은데,

진도를 나가기 위해 어떻게 수정해야 할까요 ?

 

join이 정상실행 됬다는 확인은 해당 소스 위 아래 sout "1" "2" 를 각각 붙였더니 정상 실행 되었고,

findOne 위에 sout("3")까지 출력 됬지만, findOne 아래 sout("4")은 출력되지 않고 오류가 떴습니다.

 

그리고 오류를 찾아가기 위해, 확인하고 싶은 현 시점에 소스 상황입니다.

MemberServcie 클래스에서 @Service 와

빈 주입을 위한 @Autowired 는 주석처리가 되어 있는데 맞을까요 ?

 

12분 짜리 강의를 위해 3시간째 ㅠㅠ 버벅이고 있습니다. 도와주세요 ㅠㅠ

혹시 제 질문이 부족했다면, 제가 답을 얻기위해 추가 질문이라도 부탁드립니다 ㅠㅠ

 

 

 

답변 2

1

김*혜님의 프로필 이미지
김*혜
질문자

안녕하세요 🙂 해결이 되서 공유 하고자 합니다. 혹시 다른 방법으로 해결하신 분이 계시다면 답글로 공유 부탁드립니다 🙂

혹시 어떤 방법으로 해결 하셨나요?

전 JdbcMemberRepository 에서 Connection의 클래스를 변경 했습니다.

conn = dataSource.getConnection();

이 부분을

conn = DataSourceUtils.getConnection(dataSource);

이렇게 수정 했더니 해결이 되었습니다.

-- -- -- -- -- -- -- -- -- -- -- -- -- --

dataSource.getConnection() → 그냥 새 커넥션을 무조건 열어버림.

이 커넥션은 스프링이 관리하는 트랜잭션 커넥션과 전혀 상관없음.

  • save()에서 INSERT는 트랜잭션 커넥션

  • findById()에서 SELECT는 새 커넥션 실행

  • 새 커넥션은 아직 INSERT가 커밋되지 않았으니 → “데이터 없음” 결과가 나옴

     

    -- -- -- -- -- -- -- -- -- -- -- -- --

DataSourceUtils.getConnection()을 쓰면, 이 메서드는 스프링 트랜잭션 매니저가 관리하는, 현재 사용중인 커넥션을 찾아서 반환한다.

  • 따라서 INSERT → SELECT 모두 같은 커넥션 안에서 실행됨.

  • 결과적으로 롤백/커밋도 올바르게 동작.

     

     

    -- -- -- -- -- -- -- -- -- -- -- -- --

0

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

회원 가입에서 “이미 존재하는 회원입니다” 오류 및 빈값 오류로 어려움을 겪고 계신 것 같습니다. 이러한 문제는 주로 데이터베이스와 서비스 계층 사이의 데이터 상태 불일치에서 발생할 수 있습니다. 여기 몇 가지 해결 방안을 제시해 드리겠습니다:

  1. 데이터 초기화: 테스트 실행 전, 데이터베이스를 깔끔하게 초기화하는 것이 중요합니다. SQL에서 delete from member;를 사용하여 기존 데이터를 제거하셨겠지만, 트랜잭션 범위 내에서 처리되어야 합니다. 테스트 내에서 데이터베이스 초기화와 관련된 부분을 확인하시길 권합니다.

  2. Autowired 주석 확인: @Autowired는 빈 주입에서 매우 중요합니다. 해당 빈이 주입되지 않으면 null pointer exception 등의 오류가 발생할 수 있습니다. 주석 처리가 되어 있다면, 이를 활성화시켜 테스트 해보세요.

  3. 트랜잭션 처리: @Transactional 어노테이션이 서비스 클래스나 메서드에 적용되어 있어야 합니다. 이는 데이터의 일관성을 보장해 주고, 테스트 간의 데이터 충돌을 방지합니다.

  4. 로그 추가: 다양한 위치에 로그를 추가하여 코드의 흐름을 추적하는 것이 도움이 됩니다. System.out.println뿐만 아니라 로깅 프레임워크(예: Log4j)를 사용해 로그를 남기는 것을 추천합니다.

유사한 문제에 대한 해결책이 담긴 게시물을 찾았습니다:

문제가 지속된다면 전체 프로젝트의 설정이나 코드 내 다른 부분에 의한 영향일 수도 있습니다. 추가적인 디버깅이 필요하시다면 코드를 자세히 살펴보는 것도 방법입니다.

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

김*혜님의 프로필 이미지
김*혜

작성한 질문수

질문하기