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

박병후님의 프로필 이미지
박병후

작성한 질문수

스프링 핵심 원리 - 기본편

옵션 처리

안녕하세요. 필드DI에 대해 질문드립니다.

해결된 질문

작성

·

115

1

https://www.inflearn.com/questions/340767/%ED%95%84%EB%93%9C-%EC%A3%BC%EC%9E%85%EC%9D%98-%EB%AC%B8%EC%A0%9C%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%9C%EA%B2%8C%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4

<테스트 코드 때문에 필드DI를 지양해야 하는 것 이 맞는가?>

안녕하세요 담당자님.

위 링크에 적힌 내용에 이어서 질문을 드립니다.

위 링크를 읽어본 결과 필드 DI를 지양해야 하는 이유 중 하나는 테스트 할 때 순수 자바환경에서 구현 불가능한 방법이기 때문이라고 이해했습니다.

하지만 위와 같은 이유로 필드DI를 지양한다는 것이 이해가 안됩니다.

실제 어플리케이션 코드에서는 필드DI를 하고, 스프링 없는 테스트 환경에서는 생성자든 setter든 직접 객체를 넣어주면 아무 문제 없지 않을까요?

물론 설명해주신 필드DI의 단점은 좀 더 있지만, 테스트 코드 때문에 필드DI를 지양해야 하는 것 이 맞는가에 대한 의문이 들어서 질문드립니다.

감사합니다.

답변 2

1

안녕하세요. 박병후님, 공식 서포터즈 David입니다.

테스트 때문에 필드주입을 지양하는 것은 테스트를 중요하게 여기는 환경에서는 매우 중요합니다.

또한, 스프링에서는 생성자 주입, 수정자 주입 모두 @Autowired를 붙여서 자동으로 주입할 수 있도록 해주는 기능을 지원하고 있으므로 굳이 테스트 하기 어려운 필드주입 방식으로 코드를 작성할 필요가 없습니다.

만약 테스트를 중요하게 여기지 않는다면 말씀하신대로 필드주입을 사용하셔도 무방합니다.

감사합니다.

박병후님의 프로필 이미지
박병후
질문자

안녕하세요 담당자님. 친절한 답변 감사드립니다. 이해가 안되어 같은 문제로 부득이하게 다시 질문하겠습니다..

 

  1. 실제 어플리케이션 코드

  2. 테스트코드

위와 같이 두 가지의 코드가 있을 텐데, 1번 코드에 필드주입을 하면 2번 코드에 영향을 주나요?

1번 코드에만 필드 주입을 하고 2번 코드에는 다른 방식으로 객체를 주입해준다면 문제가 없지 않을까라는 것이 제 생각입니다.

아니면 1번과 2번의 의존성 주입 환경이 같아야 한다는 규칙 같은 거라도 있나요?

 

정리하자면, '1번과 2번은 독립적으로 존재할 수 있을진대, 2번에서 필드주입이 안 좋다고 해서 1번에서 필드주입을 쓰지 않는 것은 이상하다' 라는 것이 제 의문입니다.

 

똑같은 질문 다시 들어주셔서 감사합니다.

조금 더 풀어서 말씀해 주셔서 감사합니다.

먼저, 1번과 2번의 의존성 주입 방식이 같을 필요는 없습니다.

 

MemberService라는 클래스가 있으며

운영 코드에서 필드주입을 사용하고

테스트 코드에서 생성자 주입(또는 수정자 주입)을 사용한다고 가정해 보겠습니다.

 

그렇다면, MemberService 클래스는 필드에 @Autowired가 붙어있고(운영을 위한 코드), 생성자 또는 수정자(테스트를 위한 코드)도 존재합니다.

 

그런데, 굳이 이렇게 이중으로 코드를 작성할 필요가 없습니다.

스프링에서 생성자(또는 수정자)에 @Autowired를 붙이면 자동으로 의존성 주입이 가능해지기 때문입니다. 심지어, 스프링부트에서는 특정 조건을 만족하면 생성자 주입에서 @Autowired도 없이 자동 의존성 주입이 가능합니다. 물론, 이 기능을 무조건 좋다라고 보지 않는 입장도 있지만요. 말씀하신 '독립적으로 존재'할 순 있지만 굳이 그럴 필요가 없다는 게 제 의견입니다. 무조건 하나로 만드는 게 좋은 건 아니지만 굳이 다원화(운영/테스트에 따른 서로 다른 주입 방식 사용)할 필요가 있는가에 대한 의문이 듭니다.

0

안녕하세요, 인프런 AI 인턴입니다. 박병후님의 궁금증에 대해 도움이 될 만한 정보를 찾았습니다.

담당자님의 질문은 필드 주입(Field Injection)의 단점, 특히 테스트 환경에서의 문제점에 대한 궁금증과 필드 DI를 지양해야 하는 이유가 정말로 테스트 코드 때문인지에 대한 의문점으로 요약됩니다.

이와 관련하여 아래의 인프런 게시물에서 관련 내용을 다루고 있으므로 도움이 될 것 같습니다:

  • 필드 주입의 문제점에 대해 궁금한게있습니다.에서, 필드 주입이 순수 자바 코드를 통한 단위 테스트에 문제가 될 수 있는 이유와 관련해 토론이 진행되었습니다. 이 게시물에서는 필드 주입의 한계점에 대한 설명과 함께 다른 주입 방법(예: 생성자 주입)을 사용했을 때의 장점이 다루어집니다.

핵심 요점으로는, 필드 주입을 사용할 경우 스프링 같은 DI 프레임워크 없이는 의존성을 주입할 방법이 없어지며, 이는 순수 자바 환경에서 단위 테스트를 어렵게 만듭니다. 이런 이유로, 테스트 용이성을 포함한 여러 이유(예: 코드의 명시성, DI 컨테이너에 대한 의존성 감소 등) 때문에 생성자 주입 방식을 더 선호합니다.

답변으로 충분한 도움이 되었기를 바라며, 필드 주입과 다른 주입 방식의 차이점, 각각의 장단점에 대해 더 깊이 있게 이해하시는 데 도움이 되었길 바랍니다.

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

박병후님의 프로필 이미지
박병후

작성한 질문수

질문하기