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

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

작성한 질문수

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

자바 코드로 직접 스프링 빈 등록하기

생성자 주입 방법이 아닌 필드 주입 방법일 때 @Autowired

해결된 질문

작성

·

1K

·

수정됨

0


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

[질문 내용]

컴포넌트 스캔과 자동 의존 관계 설정 방법을 통했을 때는 MemberService가 아래 코드와 같았었는데

@Service
public class MemberService {
    private final MemberRepository memberRepository;
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

MemberService를 SpringConfig에 등록한 이후로는 아래 코드와 같이 @Service와 @Autowired를 지웠잖아요?

public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

이 경우엔 생성자 주입 방식의 경우인데

 

만약 필드 주입 방식을 사용한다면 @Autowired를 어떻게 해야 하나요?

 

1) 컴포넌트 스캔과 자동 의존 관계 설정 방법일 땐 필드에 @Autowired를 붙이고

@Service
public class MemberService {
    @Autowired private MemberRepository memberRepository;
}

 

 

 

 

2) 자바 코드로 직접 스프링 빈 등록하기 방법(SpringConfig에 등록)일 땐 필드에 @Autowired를 붙이지 않아도 되나요?

public class MemberService {
    private MemberRepository memberRepository;
}

답변 2

2

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

네, 맞습니다. 필드 주입을 받으시려면 필드에 @Autowired를 붙여주셔야 합니다.

생성자 주입의 경우, 파라미터를 가지는 생성자 하나만 있을 경우 @Autowired를 생략하여도 붙여준 것과 동일하게 동작하므로 @Autowired를 생략하기도 합니다.

감사합니다.

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

답변 감사합니다.

생성자 1개일 땐 @Autowired를 생략할 수 있는 건 알겠는데

SpringConfig 클래스를 만들어서 @Configuration과 @Bean을 통해 등록했을 경우엔

생성자 개수랑 상관없이 @Autowired를 생략할 수 있나요? 그게 아니면 오로지 생성자 개수와만 상관이 있나요?

코드로 예시를 들어주실 수 있으실까요?

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

만약 @Configuration이 붙은 SpringConfig가 다음과 같이 있을 때

 

image

아래 코드처럼 @Service와 @Autowired를 쓰지 않아도 된다고 알고 있습니다.

public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

다만 이 경우엔 @Autowired를 쓰지 않아도 되는 이유가, 생성자의 개수가 1개일 땐 @Autowired를 생략 가능하다는 이유가 있기 때문에 생략 가능한 것일 수도 있어서

 

생성자가 하나가 아니라 여러 개라고 하더라도 @Autowired를 생략해도 되는지 궁금했습니다.

 

왜냐하면 강의에선 MemberService를 SpringConfig에서 @Bean 설정을 하지 않고, MemberService 클래스에 @Service를 붙였을 땐 생성자에 @Autowired가 붙어 있었거든요. 그런데 @Bean을 설정하는 부분으로 넘어가면서 김영한 선생님이 MemberService에서 @Service뿐 아니라 생성자의 @Autowired도 지우셨습니다. 생성자의 개수와 관계 없이 MemberService가 @Bean으로 등록되어 있다면 MemberService의 생성자에서 @Autowired를 생략 가능한지 궁금합니다.

@Service, @Autowired 둘 다 제거하신 이유는 SpringConfig 클래스의 memberService 메서드에서 다 처리해주기 때문입니다.

@Service이 붙으면 빈으로 생성 및 등록을 진행하게 되고, @Autowired는 의존관계를 자동으로 주입해줍니다.

memberService에 붙은 @Bean으로 인해, return new MemberService()로 인해 생성되는 객체가 빈으로 등록됩니다.

new MemberService(memberRepository())에서 memberRepository()로 인해 MemoryMemberRepository가 생성되어 MemberService 생성자의 파라미터로 넘겨지기 때문에 의존관계가 주입됩니다. 따라서, @Autowired가 없어도 의존관계가 주입되는 것입니다. 이는 생성자의 개수와 무관하게 수동으로 의존관계를 주입하기 때문에 가능한 것입니다.

@Autowired를 생략해도 @Autowired가 붙은 것처럼 동작하는 경우는 생성자가 1개일 때 가능합니다.

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

답변 감사합니다!

0

안녕하세요, 인프런 AI 인턴이에요. 필드 주입 방법을 사용할 때 @Autowired를 어떻게 사용해야 하는지 알려드릴게요.

필드 주입 방법은 생성자나 Setter 메서드를 사용하지 않고, 필드에 바로 의존성을 주입하는 방법입니다. 이 때에는 @Autowired 어노테이션을 필드 위에 붙여주면 됩니다.

예를 들어, MemberService의 필드 주입 방식을 사용할 때는 다음과 같이 코드를 작성할 수 있습니다.

@Service
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;
}

위와 같이 필드에 @Autowired를 붙이면 스프링이 MemberRepository 타입의 빈을 찾아서 자동으로 주입해줍니다. 이렇게 하면 생성자나 Setter 메서드를 사용하지 않아도 되기 때문에 코드가 간결해질 수 있습니다.

하지만 필드 주입 방법은 일부에서는 권장하지 않는 방식이기도 합니다. 이유는 필드 주입 방식은 바로바로 문제를 발견하기 힘들어지고 테스트하기 어렵다는 점 때문입니다. 따라서 생성자 주입 방법이나 Setter 주입 방법을 사용하는 것이 좋을 수도 있습니다.

필드 주입 방식을 사용할지, 생성자 주입 방식을 사용할지는 개발자의 판단에 따라 다를 수 있으니 적절한 방법을 선택하시면 됩니다. 다른 질문이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!

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

작성한 질문수

질문하기