의존관계 자동 주입 방법

2022. 10. 26. 15:37Spring

의존관계가 무엇인지에 대해서는 IOC와 DI에서!

@AutoWired란?

스프링이 의존관계를 주입(DI)할 때 사용되는 애노테이션이다. 의존주입에 필요한 객체의 타입에 맞는 빈을 스프링 컨테이너에서 찾아와 의존관계를 주입해준다. 때문에 자동 의존 관계 주입은 스프링 컨테이서에서 관리되는 스프링 빈이여야만 동작한다.

1) 생성자 주입

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

}
  • 생성시점에 딱 한번이 호출되며, 불변하게 설계 가능하다.
  • 생성자를 통해서 의존 관계를 주입받는다.
  • 생성자가 한개인 경우에는 @Autowired 생략 가능하다.
  • 롬복을 적용하고 @RequiredArgsConstructor를 클래스 레벨에 붙여주면 final이 붙은 필드를 모아서 자동으로 생성자를 만들어준다.

2) setter주입

@Component
public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;

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

}
  • 필드값을 변경하는 수정자 메서드를 통해 의존 관계를 주입받는다.
    • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법이다.
  • 변경 가능성이 있는 의존 관계에 사용된다.

3) 필드 주입

@Component
public class MemberServiceImpl implements MemberService {

    @Autowiredprivate MemberRepository memberRepository;

}
  • 필드에 바로 주입받는 방식이다.
  • 코드가 간결하다.
  • DI 프레임워크에 의존이 강하고 외부에서 변경이 불가능해서 테스트가 힘들다.
  • 필요한 객체 생성부터 연결, 기능 수행까지 하므로 단일 책임 원칙(SRP)에 위배되기도 한다.
  • 인텔리제이에서도 필드 주입을 추천하지 않음
  • 결론적으로는 추천하지않음!!

결론은

생성자를 사용하여 자동주입을 하는것이 가장 베스트!!

  • 프레임워크에 의존하지 않고, 순수한 자바 언어의 특징을 가장 잘 살리는 방법

@Autowired 옵션

  1. required
    @Autowired(required=false)
    • 주입할 스프링 빈 없이도 동작해야할 때
    • 기본값은 true
    • 자동 주입할 대상이 없으면 메서드 자체가 호출이 안된다.
  2. @Nullable
    • 주입할 대상이 없어도 호출은 되지만 null이 입력된다.
  3. @Autowired
    public void setNoBean(@Nullable Member member) {
        System.out.println("setNoBean2 = " + member);
    }

참고 생성자 주입에만 final을 쓸 수 있다. 그 외의 방식들은 모두 생성자 이후에 호출되므로.