스프링강의

의존관계 주입

lby132 2022. 5. 28. 21:05

생성자 주입에는 생성자 주입, 필드 주입, 수정자 주입(setter 주입), 일반 메서드 주입이 있다.

생성자 주입은 

private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}

이런식으로 작성을 하는데 생성자 주입의 장점은 주입해주는 것들은 언제든지 바꿀 수 있다는 점이다. 그렇게 되면 OCP(개방 폐쇄 원칙)을 지킬수 있다. 예를 들면 만약 따로 빈을 관리하는 (@Configuration이 있는)곳이 있다면 그곳에서 그때 그때 필요한 구현체들만 변경해주면 생성자 주입이 된 클래스에서는 아무것도 관리 할 필요가 없어진다. 만약 빈을 따로 관리하지 않고 @Component를 써줘서 빈 컴포넌트 스캔의 대상이 되어서 스프링 컨테이너에서 관리를 해준다. 밑에 그림을 보면

(인프런에서 가져옴)

이런식으로 빈 저장소에 @Component가 붙어있는 애들을 등록을 해둔다.

그래서 생성자에 @Autowired가 붙어있으면 스프링 컨테이너가 생성자에 있는 타입이 같은 빈 들을 조회해서 주입을 해준다.

(생성자가 하나면 @Autowired 생략 가능)

 

하지만 필드 주입 

@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;

이런식으로 작성하는게 필드주입인데 이렇게 해두면 내부에서 변경이 일어나도 변경할 수가 없다.

변경하려면 코드를 수정해야하는데 그럼 OCP를 위반하게 되어서 좋은 코드가 아니다.

 

수정자 주입은 

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

@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
    this.discountPolicy = discountPolicy;
}

이런식으로 작성을 하는데 다른곳에서 호출해서 값을 막 변경 할 수 있어서 좋지 않다.

 

일반 메서드 주입

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

이건 잘 안쓴다고 한다. 이유는 잘 모르겠지만 굳이 쓸 이유가 없을것 같기도 하다. 

생성자 주입을 사용하도록 하자.

'스프링강의' 카테고리의 다른 글

생성자 주입의 장점  (0) 2022.06.12
InputStream  (0) 2022.05.31
프레임워크와 라이브러리의 차이  (0) 2022.05.10
로깅 설정  (0) 2022.01.13
WEB-INF  (0) 2021.12.28