의존관계 주입 방법들

namkun·2022년 3월 14일
0

Spring

목록 보기
10/18

해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.


생성자 주입

  • 이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법
  • 특징
    • 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다.
    • 불변, 필수 의존관계에서만 사용
  • 만약 생성자가 딱 1개만 존재한다면, @Autowired를 생략해도 알아서 주입된다. 물론 스프링 빈에만 해당.

수정자 주입

  • 필드의 값을 변경하는 setter 메서드를 통해서 의존 관계를 주입하는 방법
  • 특징
    • 선택, 변경 가능성이 있는 의존관계에서 사용
    • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용하는 방법
      • 자바빈 프로퍼티 규약은 setter와 getter 메서드를 만들때 이름은 setXXX, getXXX로 만들자는 규약

필드 주입

  • 이름 그대로 필드에 값을 주입해버리는 방법
  • 그니까 그냥 필드에 @Autowired를 붙여버리면 된다.
  • 코드는 간단하지만...절대 좋은 방법이 아니다.
    1. 외부에서 변경할 수 없어서 테스트 불가.
      • setter 메서드를 생성하면 되지만...굳이?
    2. DI 프레임워크가 없으면 아무것도 할 수 없음.
  • 왠만하면 사용하지 말자!
    • 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용은 가능.

일반 메서드 주입

  • 일반 메서드를 통해서 주입 받을 수 있음.
  • 특징
    • 한 번에 여러 필드 주입 가능
    • 그러나 생성자랑 크게 다른 이유가 없기에 잘 사용하지 않음.

Options!

때로는 자동으로 주입해야하는 스프링 빈이 없어도 작동해야하는 경우도 있다.

그런데 @Autowired만 사용하면 자동으로 required 옵션이 true로 되어있어서 자동 주입 대상이 없으면 에러가 발생한다.

이럴때 사용하는 옵션이 3가지 있다.

  • Autowired(required=false)
    • 만약 Autowired 할 대상이 없으면 생성자 메서드가 호출이 되지 않는다.
  • org.springframework.lang.@Nullable
    • 만약 의존성을 주입할 대상이 없다면, 대신 null이 입력된다.
  • Optional<>
    • 만약 의존성을 주입할 대상이 없다면, Optional.empty가 입력된다.

아래의 옵션들로 한번 테스트 해보자.

AutowiredTest.java

public class AutoWiredTest {

    @Test
    void AutowiredOption() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
    }

    static class TestBean {

        @Autowired(required = false)
        public void setNoBean1(FuelTank fuelTank){
            System.out.println("fuelTank1 = " + fuelTank);
        }

        @Autowired
        public void setNoBean2(@Nullable FuelTank fuelTank){
            System.out.println("fuelTank2 = " + fuelTank);
        }

        @Autowired
        public void setNoBean3(Optional<FuelTank> fuelTank){
            System.out.println("fuelTank3 = " + fuelTank);
        }
    }
}

빌드되면서 출력되는 내용은 다음과 같다.

fuelTank2 = null
fuelTank3 = Optional.empty

위에서 말한 것 처럼 required=false 이면 아예 호출이 되지 않는다.

참고로, @Nullable, Optional은 스프링 전반에 걸쳐서 지원된다.

그러니까 생성자 자동 주입에서 특정 필드 같은 곳에만 사용해도 된다.

profile
개발하는 중국학과 사람

0개의 댓글