inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

다양한 의존관계 주입 방법

fieldInjectionTest() 질문

3

애송이

작성한 질문수 3

0



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

[질문 내용]
강의의 fieldInjectionTest()에서는 new OrderServiceImpl()로 객체를 직접 생성하는데, 이 경우 스프링 컨테이너를 거치지 않으므로 @Autowired 필드 주입이 실행되지 않는 것 아닌가요?
그렇다면 이 테스트는 필드주입의 단점을 보여주는 테스트가 아닌것 같아서요..

spring 객체지향

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

애송이님, 이해하신 내용이 맞습니다. new OrderServiceImpl()로 객체를 직접 생성하면 스프링 컨테이너가 관리하지 않는 순수한 자바 객체가 되므로, @Autowired 필드 주입이 실행되지 않습니다. 따라서 memberRepository와 discountPolicy가 null인 상태로 남아 NullPointerException이 발생합니다.

이 테스트는 “필드 주입이 항상 동작하지 않는다”는 의미가 아니라, 필드 주입 방식은 객체를 직접 생성하는 단위 테스트에서 의존관계를 외부에서 주입하기 어렵다는 단점이 있다는 점을 보여주는 예제입니다. 반면 생성자 주입을 사용하면 다음과 같이 테스트 코드에서 필요한 의존 객체를 직접 전달할 수 있습니다.

OrderServiceImpl orderService =
    new OrderServiceImpl(memberRepository, discountPolicy);

스프링 컨테이너를 사용하는 테스트라면 컨테이너가 OrderServiceImpl을 생성하고 @Autowired를 처리하므로 정상적으로 의존관계가 주입됩니다.

관련 답변을 참고해 주세요.

  • 필드주입에 대해서 질문드립니다.
    new OrderServiceImpl()로 직접 생성한 객체는 스프링의 관리를 받지 않기 때문에 @Autowired가 동작하지 않고, 내부 의존 객체가 null이 된다는 설명이 있습니다.
  • 21:03 fieldInjectionTest부분에서부터 질문있습니다.
    필드 주입은 테스트 실행 시점에 스프링 컨테이너가 객체를 관리해야 주입되며, 컨테이너를 사용하지 않는 테스트에서는 주입되지 않는다는 내용입니다.
  • 강의에서 21:36 쯤에
    new로 생성한 객체는 스프링 빈이 아니므로 MemberRepository와 DiscountPolicy가 주입되지 않는다는 설명과 관련 이미지가 포함되어 있습니다.

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

AutoAppConfig의 존재이유

0

12

1

AppConfig와 스프링 빈 질문

0

17

1

[영한님]Spring Boot 및 프로젝트 생성

0

105

2

퀴즈가 안열려요

0

98

2

회원 도메인 인터페이스 개발

0

85

2

빈 스코프 개념의 중요성

0

88

1

SingletonService가 JVM이 뜰 때 생성되는게 맞나요?

0

139

2

섹션3. 11 회원객체 다이어그램

0

74

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

73

1

코드 자료

0

125

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

125

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

142

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

139

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

130

1

테스트 속도가 나중에 영향이 있을까요?

0

124

1

gradle 설정 안떠서 질문 남깁니다!

0

251

2

build.gradle로 프로젝트를 여는 이유

0

157

1

provider 사용하는 이유

0

153

1

다음 강의 뭘 들어야 할까요

0

187

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

109

1

beanB

0

131

2

퀴즈다시풀기

0

104

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

149

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

118

3