해결된 질문
작성
·
393
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
강의에서 의존관계 자동 주입의 방법 중 필드 주입의 방법은 스프링에 의존적인 방식이기 때문에 안티 패턴이므로 사용하지 말라고 하셨습니다.
제가 의문인 부분은 세가지입니다.
강의 자료에 참고: 순수한 자바 테스트 코드에는 당연히 @Autowired가 동작하지 않는다. @SpringBootTest 처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능하다.
라고 적혀있는데, 이 말은 @Autowired 애너테이션을 사용한 의존성 주입 방법 자체가 스프링 의존적인건가요? 그게 아니라면 필드 주입이라는 방법 자체가 스프링 의존적인건가요? 만약 그렇다면 필드 주입 방법만 스프링 의존적인 이유가 따로 있을까요? 다른 방식들과 내부 동작 등에서 어떤 차이가 있는지 이해가 잘 가지 않아서요.
만약 @Autowired 방법 자체가 스프링 의존적인 방식인거라면, 의존관계 자동 주입의 네 가지 방법 모두 스프링 의존적인 방식이므로 안티패턴이 되는것이 아닌가요?
왜 꼭 순수 자바 환경에서 테스트를 해야하나요? 스프링부트테스트는 스프링부트 환경에서 테스트할 수 있는걸로 알고있는데, 여기서 모든 테스트를 하면 되는 것 아닌가요??
답변 1
3
안녕하세요. 김민희님, 공식 서포터즈 y2gcoder입니다.
@Autowired를 붙여주면 애플리케이션 실행시 스프링 컨테이너가 자동으로 의존관계 대상이 빈으로 등록되어있는지 찾고, 해당 빈을 주입해줍니다! 그래서 @Autowired를 사용해서 스프링 컨테이너가 의존 객체를 주입해주는 모든 방법이 스프링 의존적이라고 볼 수 있습니다. 다만 다른 방법은 일반적인 POJO(자바 객체)로 사용했을 때도 의존성을 주입해줄 방법이 있습니다. 그러나 필드 주입은 스프링 컨테이너 없이 의존 객체를 주입해줄 방법이 없습니다.
@Autowired가 스프링 컨테이너를 통해 의존 객체를 대상 객체에 주입해주는 방식이라고는 하나 필드 주입을 제외한 다른 방법은 기본적인 자바 객체 상태일 때도 주입해줄 수 있습니다. 스프링을 사용하지 않아서 @Autowired를 제거했을 때도 나머지 방법은 의존하는 객체를 외부에서 주입하여 정상적으로 실행할 수 있기 때문입니다. 그런 점에서는 스프링 의존적인 방식이 아니라고 볼 수 있을 것 같습니다.
좀 더 자세한 설명은 단위 테스트, 통합 테스트에 대해 공부해보시면 좋을 것 같습니다. 다만 제가 실무를 하면서 느꼈던 가장 큰 이유는 가볍기 때문입니다. 실무 환경에서는 개발 중이나 배포하기 전이나 테스트를 굉장히 자주, 그리고 많이 실행하게 됩니다. 이러한 환경 속에서 @SpringBootTest는 스프링 컨테이너를 일일이 띄워서 실행하게 됩니다. 이 때 스프링 컨테이너를 띄우는데 시간이 생각보다 오래 걸리게 됩니다. 개발 중에 굉장히 자주 실행해줘야 하는 테스트들을 실행할 때마다 스프링 컨테이너를 띄워야 한다면 테스트 실행에 생각보다 많은 시간을 할애하게 됩니다. 그래서 스프링 컨테이너를 띄울 필요가 없는 테스트 케이스에서는 순수 자바 객체로 테스트하는 것 같습니다. 이렇게 하면 스프링 컨테이너를 띄울 때마다 훨씬 빠른 속도로 테스트 코드를 실행하고 결과에 대한 피드백을 받을 수 있었습니다.
감사합니다.