의존관계 주입 방법

박채은·2022년 12월 12일
0

Spring

목록 보기
9/35

의존관계 주입 방법

  1. 생성자 주입
  2. setter 주입
  3. 필드 주입
  4. 일반 메서드 주입

1. 생성자 주입

  • 생성자에 의존 관계인 객체를 주입하는 방법

  • 불변과 필수 의존 관계에 사용된다.

  • 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈들을 찾아 주입해준다.

  • 생성자가 1개만 존재하는 경우에는 @Autowired를 생략해도 자동 주입된다.

Q) 생성자가 1개일 때, @Autowired를 생략해도 되는 이유는?
A) 스프링이 해당 클래스 객체를 생성하여 빈에 넣어야하는데, 생성할 때 생성자를 무조건 호출해야 하므로 그 때 의존성 주입도 같이 발생한다.

2. setter 주입

  • 선택과 변경 가능성이 있는 의존 관계에 사용된다.

  • @Autowired를 입력하지 않으면 실행이 되지 않는다.

3. 필드 주입

  • 필드에 @Autowired를 붙여서 바로 주입하는 방법
  • 외부에서 변경이 불가능하다.
@Component
public class CoffeeService {
  @Autowired
  privat MemberRepository memberRepository;
  
  @Autowired
  privat CoffeeRepository coffeeRepository;
}

4. 일반 메서드 주입

  • 일반적으로 잘 사용되지 않음

옵션 설정

의존성 주입할 Bean이 없는 경우가 있다.
@Autowired는 required 옵션의 기본값이 true이기 때문에 주입 대상이 Bean으로 등록되지 않았으면 오류가 발생한다.

이때는 @Autowired(required=false)를 작성해준다.

@Autowired(required=false) : 자동 주입할 대상이 없으면 메서드 자체가 호출되지 않는다.


생성자 주입 방식의 장점

  • 의존 관계 설정이 되지 않으면 객체 생성이 불가능하다.

    • 컴파일 타임에 인지가 가능
    • NPE(Null Point Exception) 에러 방지가 가능
  • 의존 관계 주입은 처음 애플리케이션이 실행될 때 대부분 정해지고 종료 전까지 변경되서는 안 된다. 생성자 주입을 사용하면 최초로 1번만 호출되고 그 이후에는 다시는 호출되는 일이 없기 때문에 불변함을 충족할 수 있다.

  • 의존성 주입이 필요한 필드를 final로 선언 가능하다.

    • 다른 주입 방식은 생성자 이후에 호출되기 때문에 final 키워드를 사용할 수가 없다.
    • final로 설정하면, 컴파일 시점에서 오류를 바로 확인할 수 있다.

      java: variable (데이터 이름) might not have been initialized

  • (스프링에서) 순환참조를 방지할 수 있다.

    • 순환 참조 : A-> B를 참조, B-> A를 참조
    • 순환 참조 시 앱구동이 실패하게 됨
    • 다른 주입 방식은 Bean이 생성된 후에 참조하기 때문에, 실제 코드를 실행하고 나서야 문제를 파악할 수 있다.
  • 테스트 코드 작성 용이하다.

  • setter 주입이 필요한 경우가 있는데 그 때만 사용하면 되고 평상시에는 생성자 주입을 사용할 것!

0개의 댓글