다양한 의존 관계 주입 방법

inhalin·2022년 7월 24일
0

김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 정리한 내용입니다.

참고❗️ 의존관계 자동 주입은 아무데나 @Autowired 붙인다고 다 되는게 아니라 스프링 빈이어야 동작한다.

생성자 주입

  • 객체가 생성될때 딱 한번 만들어지고 그 이후로는 불변한다. 필수 의존관계에 사용한다.
  • 이렇게 써줄때는 나중에 값이 변경되면 안되기 때문에 setter를 만들면 안된다.
  • 생성자가 하나일때는 @Autowired를 생략해도 된다. 두개 이상이면 생략 불가.
  • 스프링 빈을 등록하면서 스프링 컨테이너에서 의존관계를 자동으로 찾아와서 의존관계 주입이 동시에 일어난다.
@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

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

수정자 주입 setter

  • 수정자 setter 메서드로 의존관계를 주입할 때는 @Autowired를 꼭 써주어야 한다.
  • 나중에라도 의존관계 값을 변경 가능하다. 선택적으로 의존관계를 주입할 수 있다.
  • 주입 대상 없이도 동작하게 하려면 @Autowired(required = false)를 붙여줘야 한다.
  • 스프링 빈이 등록된 후에 나중에 의존관계 주입이 이루어진다.
@Component
public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;

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

필드 주입

  • 필드에 @Autowired를 붙여서 바로 주입하는 방식
  • 코드는 간결하지만 외부에서 변경할 수가 없어서 테스트가 굉장히 어렵다.
  • 의존관계 주입을 스프링에서 해주고 있어서 순수 자바 코드로 테스트 하려고 하면 NullPointerException이 난다. 이걸 해결하려면 결국 setter를 만들어줘야 한다.
  • 실제 코드에는 사용하지 말고 테스트 코드에는 사용해도 무관하다.
@Component
public class MemberServiceImpl implements MemberService {

    @Autowired private MemberRepository memberRepository;
}

일반 메서드 주입

  • 그냥 아무 메서드에다가 @Autowired 붙여서 의존관계 주입을 할 수 있다.
  • 보통 생성자 주입이나 setter 주입으로 사용해서 이렇게는 쓸일이 거의 없다.
@Component
public class MemberServiceImpl implements MemberService {

    private MemberRepository memberRepository;

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

0개의 댓글