ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dependency Injection Revisited by Juergen Hoeller @ Spring I/O 2025
    Spring/Spring IO 2025. 9. 25. 22:47

     

    Dependency Injection Revisited by Juergen Hoeller @ Spring I/O 2025

    https://www.youtube.com/watch?v=AvZEoxH_wGo

     

    Spring의 모든 세대는 빈 정의 및 주입 지점에 대한 설계 옵션을 미세 조정하여 프레임워크의 라이프사이클 관리와 긴밀하게 통합합니다. 이 강연에서는 Spring 애플리케이션 컨텍스트와의 선언적 및 프로그래밍적 상호작용을 위한 최신 기술을 다시 살펴봅니다. 여기에는 Spring Framework 6.2의 최신 기능과 Spring Framework 7.0의 향후 기능도 포함됩니다.

     

     

    Juergen Hoeller는 Spring의 핵심 설계자인 만큼, Spring 프레임워크의 DI(의존성 주입) 설계와 진화 과정을 깊이 있게 다룹니다. 이 강연에서는 선언적 및 프로그래밍 방식의 DI, 최신 Spring 6.2 기능과 7.0의 신기능(BeanRegistrar)을 포함하여 실무에서 중요한 DI 패턴, 사용법, 최적화 방법 등을 상세히 설명합니다.

    주요 내용 요약:

    • 핵심 개념:
      • ‘코어 컨테이너’는 빈(Bean) 정의와 의존성 주입 전체를 관리하는 Spring의 핵심 모듈입니다.
      • DI는 어노테이션(@Autowired)만의 개념이 아니며, Bean 메타데이터, 이름, 생명주기(lifecycle) 기반의 유연한 아키텍처가 핵심입니다.
    • 주입 포인트(Injection Points):
      • 주입 포인트란 외부 의존성(다른 빈)을 연결하는 위치(생성자, 메서드 파라미터)를 의미합니다.
      • 생성자 인자 하나하나가 독립적인 주입 포인트로 취급됩니다.
      • 최근 버전에서는 단일 생성자 클래스는 @Autowired 없이도 자동 주입이 가능합니다.
    • 의존성 초기화:
      • 기본적으로 Spring은 주입 시점에 의존성이 완전히 초기화되어 있기를 기대합니다.
      • 그러나 실무에서는 단순히 저장만 하고 나중에 사용할 때가 많으므로, @Lazy로 초기화를 늦출 수 있습니다.
      • @Lazy를 붙이면 프록시 객체가 주입되어, 실제 사용 시점에 Bean이 생성됩니다.
    • 옵셔널 및 Null 허용:
      • @Nullable 또는 Java8 Optional<T>로 의존성의 선택적 주입이 가능합니다.
      • 이 패턴을 쓰면 해당 빈이 없어도 null 혹은 empty Optional 값이 주입되어, 서비스의 유연성이 높아집니다.
    • ObjectProvider:
      • ObjectProvider<T>는 Spring 고유의 게터(핸들) 타입으로, 의존성의 지연·선택적·반복적(다중) 접근이 가능합니다.
      • @Lazy와 달리 실제 Bean을 바로 반환하되, 필요할 때 직접 호출(getObject())해야 합니다.
      • getIfAvailable() 등 다양한 메서드와 스트림을 통한 반복처리도 지원합니다.
    • Qualifier 옵션:
      • 타입이 같은 빈이 여러 개 있을 때는 @Qualifier, 사용자 정의 애노테이션, 파라미터/빈 이름 매칭 등으로 명확하게 지정할 수 있습니다.
      • Spring은 파라미터 이름과 빈 이름이 같으면 자동 최적화하여 성능을 높일 수 있게 했습니다.
    • 빈 정의 방법:
      • 선언적(클래스, @Configuration/@Bean)과 프로그래밍적 방식(BeanDefinition, BeanRegistrar)이 있습니다.
      • 일반적으론 선언적 방식을 우선하며, 프로그래밍 방식은 고급 혹은 동적 시나리오에 적용합니다.
    • BeanRegistrar (Spring 7.0 신기능):
      • BeanRegistrar는 프로그래밍적으로 유연하고 동적으로 빈을 등록하는 새로운 방법입니다.
      • 구성 클래스에 비해 if문, 루프, 동적 조건 등 복잡한 logic 처리가 쉽습니다.
      • Spring AOT 및 개발 툴에서 인식되며, 구성 클래스와 상호 운용됩니다.
      • 인프라 코드, 공통 모듈 등에서 주로 사용하며, 앱의 일상적 DI는 여전히 구성 클래스가 표준입니다.
    • 실전 권고:
      • 일반적인 DI는 명확성과 유지보수성 측면에서 선언적으로 구현하세요.
      • 지연/선택적/다중/동적 DI가 필요한 경우 @Lazy, @Nullable, Optional<T>, ObjectProvider<T>, BeanRegistrar 등의 기능을 적재적소에 활용하는 것이 좋습니다.
      • 다수의 후보가 있을 땐 @Primary, 빈 이름, Qualifier로 선택성을 높이세요.
      • BeanRegistrar는 전문적·동적 인프라 코드에 권장; 일반 사용자 코드에는 권장하지 않음.

    댓글

Designed by Tistory.