스프링 기본(김영한)_기억할 point

HyunJunSon·2024년 4월 2일
0
  1. 생성자가 딱 1개만 있으면 @Autowired를 생략해도 주입이 자동으로 된다. (스프링 4.3 이후로)
import org.springframework.stereotype.Component;

@Component
public class MyService {
    private final DependencyComponent dependency;

    // @Autowired 가 없어도 스프링이 DI를 자동으로 해준다.
    public MyService(DependencyComponent dependency) {
        this.dependency = dependency;
    }
}
  1. @Autowired의 기본동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(reqired=false)로 지정하면 된다.
  1. 필드 주입방식은 테스트하기 힘들다는 치명적인 단점이 있다. 즉, DI 프레임워크가 없으면 아무것도 할수 없다. (사용하지 말것)
    https://codingnojam.tistory.com/9 (참고)
    추천하는 방식은 생성자에 @Autowired를 사용하는 방식이다.
  • 필수적으로 사용해야 하는 reference 없이는 생체생성을 못하도록 강제할 수 있다.

  • field injection이나 setter injection은 필수 의존성이 없이 도 일단 객체를 만들수는 있게 된다.

  • A, B 객체가 서로 참조하고 있는 경우, 생성자주입 방식을 이용하면 순환참조 문제가 발생할 수 있다. 이럴경우는 setter 방식이나,필드 주입방식을 고려해 볼 수 있지만, 대부분의 경우는 생성자 방식을 고려하는 것을 추천한다.

  1. @Autowired를 필드 주입, setter방식 과 함께 사용하는 경우, final을 사용할 수 없다. 왜냐하면 final 필드는 생성자에서 초기화되어야 하고 나중에 수정될 수 없기 때문에 Spring이 구성 후에 final 필드에 값을 주입할 기회가 없기 때문이다.따라서 생성자에 @Autowired를 붙여 주입을 한번으로 제한하고 불변하게 만드는 방식이 추천되는 것임
  • @Autowired(required=false) :: 자동 주입할 대상이 없으면 수정자 메소드 호출 자체가 안됨

  • org.springframework.lang.@Nullable : 자동주입할 대상이 없으면 null 이 입력된다.

  • Optional<> : 자동 주입할 대상이 없으면 Optional.empty가 입력됨

  1. @Autowired 는 타입매칭을 시도한후, 빈이 여러개 있는 경우, 필드이름, 파라미터 이름을 추가로 매칭시도 한다.

  2. 빈에 등록된 같은 타입의 여러 객체르 한번에 Map, 이나 List를 활용해 주입받을 수 있다. 전략패턴을 매우 간략하게 구사할 수 있다.

@Component
public class DiscountService{
 
        private final Map<String, DiscountPolicy> policyMap;
        private final List<DiscountPolicy> policyList;
 
        @Autowired
        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policyList){
            this.policyMap = policyMap;
            this.policyList = policyList;
 
            System.out.println("policyMap = " + policyMap);
            System.out.println("policyList = " + policyList);
        }
}
  1. 어플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는 수동 빈으로 등록해서 딱! 설정 정보에 바로 나타나게 하는 것이 유지보수하기에 좋다.
profile
즐겁게 공부하고 사람들에게 도움을 주는 개발자가 되고 싶습니다.

0개의 댓글