본문 바로가기

코딩/JAVA 공부

[Spring] 의존성 관계 자동 주입

Spring에서 Bean을 생성하는 단계는 크게 두 가지 단계로 나눌 수 있음.

1. 스프링 빈 등록(@Bean or @Component를 찾아 빈 등록)

2. 의존관계 주입 (@Autowired  찾아 의존관계 주입)

단, 생성자 주입은 빈 등록하면서 의존관계 주입 동시에 진행 (그런데 의존관계 주입에 필요한 빈이 컨테이너에 없으면..?)

 

 

의존관계 주입 방법

- 생성자 주입

- 수정자 주입(setter 주입)

- 필드 주입

- 일반 메서드 주입

 

1. 생성자 주입

생성자에 @Autowired

등록이 되면 생성자 호출, 생성자 호출 시 생성자에 있는 파라미터들을 자동을 주입한다.

장점: 생성자 호출 시점에 딱 1번만 호출되는걸 보장하기 때문에, 변하지 않는다고 보장할 수 있음 (final) 

* 생성자가 딱 1개 있는 경우에 @Autowired 를 생략해도 됨.

public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;
    
    @Autowired // 생갹가능
    public MemberServiceImpl(MemberRepository memberRepository) {
    	 this.memberRepository = memberRepository;
    }
}

 

 

2. 수정자 주입 (setter 주입)

선택적, 변경 가능성이 있는 의존관계를 주입할 때 사용

@Autowired(required = false) 

로 어노테이션을 달면 주입할 대상이 없어도 동작 가능.

또는 중간에 필드를 변경하고 싶을 때 사용 할 수 있음.

public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}

생성자 주입, 수정자 주입이 둘 다 있으면 생성자 주입 먼저 실행!

 

3. 필드 주입 -> 테스트코드 아니면 사용하지 말자

필드에다 값을 빡 넣어버림!

public class MemberServiceImpl implements MemberService {

    @Autowired private MemberRepository memberRepository;
   
}

코드가 매우 간결해지지만, DI 프레임 워크가 없으면 사용할 수 없음.

즉 테스트코드를 작성할 때 의존관계를 임의로 넣어줄 수 없음.

 

4. 일반 메서드 주입

아무 메서드에서나 @Autowired를 수행할 수 있다.

일반적으로 잘 사용하지 않음..

public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;
    
    @Autowired
    public void init(MemberRepository) {
    	this.memberRepository = memberRepository;
    }
    
    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}