인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

11 1님의 프로필 이미지
11 1

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 통합 테스트

MemberServiceIntegrationTest에서 필드 주입 방식에 @Autowired를 쓰는 이유

작성

·

369

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

강의를 쭉 따라왔습니다.

궁금한 점이 있는데 통합 테스트 클래스인

MemberServiceIntegrationTest에서 필드 주입 방식으로


@Autowired MemberService memberService; @Autowired MemberRepository memberRepository;

 

이렇게 선언했잖아요?

그런데 SpringConfig에서 MemberService랑 MemberRepository를 스프링 빈으로 등록했으니깐

여기서도 @Autowired를 빼도 될 것 같았는데

오류가 나더라구요.

 

이유를 뭔가 알 것 같기도 하면서 개념이 좀 헷갈리는데 @Autowired를 붙여야 하는 이유가 뭔가요?

 

답변 1

1

안녕하세요. 11 1님, 공식 서포터즈 OMG입니다.

질문에 대한 답변 내용을 비유를 들어 설명드리면 이해하시기에 도움이 되실 것 같아 설명드리겠습니다.

스프링 빈으로 등록한다는 것은 껍데기에 어떤 알맹이가 채워지는지 알려주는 행위라 볼 수 있습니다.

그리고, 주입이라는 것은 껍데기에 알맹이를 채워넣는 행위입니다.

따라서 @Autowired로 필드 주입을 하지 않는다면 껍데기만 만들어놓고 알맹이를 채워넣지 않아 오류가 발생하는 것으로 이해하시면 될 것 같습니다 :)

 

 

감사합니다.

11 1님의 프로필 이미지
11 1
질문자

조금 헷갈렸는데 다시 고민해 보니깐 알 것 같기도 합니다. 개념이 제대로 잡히지 않았어서 추가 질문을 좀 이상하게 했었던 것 같네요..;; 그래서 지우고 다시 질문드립니다.

 

기존 강의 방식대로 MemberServiceIntegrationTest에서 필드 주입 방식으로 했을 땐 아래 코드였는데요

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

이걸 생성자 주입 방식으로 바꾼다면

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

    private final MemberService memberService;
    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceIntegrationTest(MemberService memberService, MemberRepository memberRepository) {
        this.memberService = memberService;
        this.memberRepository = memberRepository;
    }

 

제대로 바꾼 거 맞나요? 제대로 변환하지 않았다면 어디를 수정해야 하는지 궁금합니다. 제가 머릿속에서 헷갈려하는 부분이 있었는데 이거에 대한 답변을 들으면 해소가 될 것 같습니다.

그리고 SpringConfig에 MemberServiceIntegrationTest는 빈으로 등록하지 않았기 때문에 생성자에 @Autowired를 반드시 해야 하는 거죠?

 

 

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기