[스프링 트러블슈팅] @Transactional이 이상해…

11월 초나 중순 쯤 KSUG에서 세미나를 한다길래 발표자로 지원했습니다. 예상 날짜는 11월 13인데 어찌될지는 아직 모릅니다. 제가 구상한 주제는 바로 “스프링 트러블슈팅”. 개구리 올챙이적 모른다고.. 저도 처음 스프링, 하이버네이트로 프로젝트를 시작했을 때 사소한 버그도 못잡아 토비님께 여쭤보곤 했었는데 요즘은 강의 다니면서 스프링 관련 문제들 찾아주고 해결해주는 재미가 쏠쏠 합니다. 잡아주기도 하고 잡는 방법을 알려드리기도 하는데… 그런 내용을 전달해 드릴계획입니다.

이번엔 그 중에 하나로 오늘 오전에 해결했던 문제 중 하나를 소개해 드릴까 합니다. 소개만…

[java]
public interface MemberService {

}
[/java]

[java]
@Service
@Transactional
public class MemberServiceImpl implements MemberService {

}
[/java]

[java]
@Controller
public class MemberController {
@Autowired MemberServiceImpl service;
}
[/java]

이렇게 설정한 상태에서 ApplicationContext를 만들다가 에러가 납니다. MemberController에 주입할 MemberServiceImpl 빈을 못 찾아서 MemberController의 @Autowired MemberServiceImpl 부분에서 에러가 납니다.

이 상황은 딱.. 예전에 토비님 블로그에 올라왔던 상황입니다. 토비님은 그 글에 대한 해답편도 올려두셨는데.. 해답은 토스3의 14장을 보라는 내용이었습니다. 지금 이 상황이 바로 그 퀴즈에 대한 정답이기도 하죠.ㅋㅋ

지금 이 상황에서 @Transactional을 지우면 에러 없이 ApplicationContext가 만들어 지지만 원하는 대로 동작하진 않겠죠. 트랜잭션이 필요했는데 그걸 못쓰는 것이니까요. 그럼 무엇이 문제이고 그 해결책은 무엇일까요. 객체지향적으로 생각하면 해결책은 쉽게 알 수 있는데 문제 원인을 남에게 설명할 수 있을 정도로 파악하기는 쉽지 않을 수 있습니다. 스프링 AOP에 대한 기본 지식을 잘 갖추고 있으시거나 토스3에서 AOP부분을 잘 읽으신 분들이라면 쉽게 알 수 있는 내용이긴 하죠.

저는 이 것과 더불어 스프링을 사용하시면서 자주 만나게 될 트러블들을 소개 및 재현해 드리고 그 원인과 해결책을 소개하는 시간으로 KSUG에서 뵙겠습니다. 아참.. 그리고 그날 제 발표 시간에 깜짝 이벤트도 준비 중이오니 많은 참석 바랍니다.