본문으로 바로가기

Spring - DI, IoC

category CS 공부/Java, Spring (재정리) 2021. 3. 25. 18:37

Dependency Injection

  • 자바 애플리케이션은 애플리케이션의 행동 방식을 제공하기 위해 상호자 작용하는 여러 객체들로 이루어진다.
  • 객체가 다른 객체와 상호 작용하는 경우를 의존 관계라고 한다. ( 다른 클래스 객체의 메소드를 사용하는 경우 )
  • 의존성 주입은, 객체간의 의존 관계를 생성자나 세터 메소드로 ( 정확히는 arguments ) 명시하고,
    객체를 생성할 때 이들을 사용하여 의존 관계를 주입하는 방식인 디자인 패턴이다.
  • 의존성 주입 주체
    • 프로그래머 - 코드를 통해 직접 ( 세터, 생성자, 팩토리, 서비스 로케이터 등의 디자인 패턴 사용 )
    • 프레임워크 - 메타 데이터를 참조하여 대행 ( IoC )
  • 스프링에서의 DI 방식 ( 느슨한 방식, 런타임 주입 )
    • 세터 사용 - NullPointer 참조 오류 가능
    • 생성자 사용 - 추천된다!
    • 필드 사용 - 세터와 비슷함.
    • Autowired - 필요한 의존 객체의 타입 ( 위 3가지 ) 에 해당하는 빈을  IoC 컨테이너에서 찾아 주입한다.

Inversion of Control

  • 이러한 의존성 주입 역할을, 프로그래머가 코드를 통해 직접 책임지는 것이 아니라,
    스프링이라는 프레임워크가 스프링 IoC 컨테이너를 통해 객체를 생성하고 DI를 대신 담당한다. ( 제어의 역전 )
  • 스프링 Ioc 컨테이너가 관리하는 애플리케이션 객체들을 bean이라고 부른다.
  • bean 과 이들의 의존 관계를 설정 메타 데이터를 통해 알 수 있으며,
    메타 데이터는 XML, Annotation, 자바 코드를 통해 제공 받는다.
  • 제공 받은 메타 데이터를 참조하고, 자바 리플렉션 API를 사용해 객체를 인스턴스화하고 의존 관계를 주입한다.
  • 이런식으로 스프링 컨테이너가 관리하는 애플리케이션 객체( bean )를 Plain Old Java Object ( POJO )로 모델링 할 수 있다.
  • DI를 스프링 IoC 컨테이너가 외부 메타 데이터를 통해 처리해주는 것은 유지, 보수에 큰 장점이 있다.
    ( 수정 시 코드를 변경하는 것이 아닌, 빈 설정들을 변경해주면 되기 때문 )
  • 스프링 DI 기능의 흐름
    1. 애플리케이션에 쓰이는 여러 객체간 의존 관계 파악
    2. 위에서 파악한 각 애플리케이션 객체에 상응하는 POJO 클래스 작성
    3. 애플리케이션 객체 간 의존 관계를 표현하는 설정 메타데이터 작성
    4. 스프링 IoC 컨테이너의 인스턴스 ( ApplicationContext )를 만들고 메타데이터 참조
    5. 각 애플리케이션 객체에 접근 ( 생성 )

Spring의 장점

  • IoC 컨테이너를 통한 DI 대신 수행 및 유지, 보수 이점.
  • 지역과 전역 트랜잭션을 일관성 있게 섞어 사용 가능.
  • 선언적 트랜잭션 관리 가능.
  • 스프링 시큐리티 + @Secured 를 사용해서 보안성 확보.
  • JMX + @ManagedOperation 를 통해 확장 기능 적용 및 외부 상호작용 용이.
  • 이외에도 번거로운 준비 코드를 알아서 처리해주는 추상화 계층 제공을 통해 여러 확장성을 가짐..

'CS 공부 > Java, Spring (재정리)' 카테고리의 다른 글

Spring - AOP  (0) 2021.04.08
Spring - MVC, 서블릿  (0) 2021.04.01
java template 메서드  (0) 2020.01.02
java abstract 클래스, 추상클래스  (0) 2020.01.02
자바 항목에 있는 글들은  (0) 2020.01.01