강의

멘토링

로드맵

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

오리너구리님의 프로필 이미지
오리너구리

작성한 질문수

스프링 빈 과 @BeforeEach

해결된 질문

작성

·

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

오리너구리님의 프로필 이미지
오리너구리

작성한 질문수

질문하기