해결된 질문
작성
·
141
0
public class MemberServiceTest{
@BeforeEach
public void beforeEach(){
memberRepository= new MemoryMemberRepository();
memberService= new MemberService(memberRepository);
}
}
public class MemberService {
private final MemberRepository memberRepository;
// 외부에서 memberRepository의 값을 주입 받음 : 생성자 주입
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
위의 두 코드를 작성할 때 @Controller, @Service,@Repository 어노테이션을 사용하지 않았습니다.
그렇기 때문에 스프링 컨테이너에 MemberService를 생성하는데 필요한 memberRepository 객체가 없기 때문에 직접 memberRepository의 객체 값을 넘겨준건가요??
스프링 빈으로 등록되지 않아 @Autowired를 사용할 수 없다면,
@BeforeEach 어노테이션을 이용해 생성자를 호출할 때 직접 객체의 값을 주입해줘야하는 건지 궁금합니다
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
오리너구리님의 질문에 답변드리겠습니다.
네, 맞습니다. 작성하신 코드에서 @Controller
, @Service
, @Repository
와 같은 스테레오타입 어노테이션을 사용하지 않았기 때문에, 스프링 컨테이너가 자동으로 MemberService
에 필요한 MemberRepository
의 빈을 주입해주지 않습니다. 따라서 테스트를 실행하기 전에 @BeforeEach
어노테이션이 붙은 beforeEach
메서드를 활용하여 직접 MemberRepository
의 인스턴스를 생성하고, 이를 MemberService
의 생성자를 통해 주입해주고 있는 것입니다.
스프링 컨테이너로부터 자동으로 빈을 주입받으려면 해당 클래스에 스테레오타입 어노테이션을 붙이고, 스프링이 관리하는 빈으로 등록해야 합니다. 그러면 스프링은 @Autowired
와 같은 어노테이션을 통해 의존성 주입을 자동으로 처리할 수 있게 됩니다. 그러나 테스트 상황에서는 각각의 테스트 케이스가 독립적인 환경에서 실행되기를 원할 수 있기 때문에, @BeforeEach
등을 활용해 직접 인스턴스를 생성하고 주입하는 것이 일반적입니다.
스프링 빈과 관련된 문서에서 더 자세한 정보를 얻고 싶을 경우 다음 URL을 참고하시길 바랍니다.
Spring Boot Reference Documentation: Using Spring Beans and Dependency Injection