[Spring] 스프링 기초 개념

Updated: Categories:

Spring 기초 개념 다시 정리 (DI, IoC 등)

DI / IoC

DI

  • Dependency Injection, 의존성 주입
  • 특정 객체를 사용해야 할 때 클래스 내에서 객체를 생성하는 것이 아닌, 이미 생성된 객체를 외부에서 주입받는 것
      // 클래스 내부에서 직접 생성하기
      class A {
          private final B b = new b();
      }
      // 외부에서 주입받기
      class A {
          private final B b;
          A(B b){
              this.b = b;
          }
      }
    
  • 장점
    • 인터페이스로 주입받으면 의존성이 줄어들고, 결합도를 낮출 수 있다.
    • 코드 재사용성을 높힐 수 있다
    • 테스트가 편리하고, 가독성이 좋아진다

IoC

  • Inversion Of Control, 제어의 역전을 뜻한다
  • 어떠한 의존성 객체의 제어권(생성, 생명주기)이 개발자가 아닌 외부(프레임워크)에서 가지고 있는 것
    • Spring에서는 IoC 컨테이너에서 DI 등의 의존성 관리를 대신함


Srping

Spring Boot의 내용은 빼고 정리

Spring이란

  • 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
  • 장점
    • POJO를 사용한 객체지향적 구성
    • DI, IoC를 통한 객체 관계 구성으로 결합도 낮추고 재사용성 높임
    • AOP 지원

IoC Container

  • BeanFactory
    • 가장 기본적인 IoC Container
    • Bean 객체의 생성과 생명주기를 관리하는 컨테이너이다
  • ApplicationContext
    • BeanFactory를 상속받아 추가적인 기능을 제공하는 IoC Container

Bean

  • IoC 컨테이너에 의해 생성되고 관리되는 POJO 객체
    • Bean끼리 DI가 가능하다
  • Scope를 가진다
    • 총 6개의 Bean Scope가 존재한다
    • default는 싱글톤으로 동작한다
    • prototype으로 변경시 싱글톤으로 동작하지 않음
  • 생성과 소멸시 생명주기를 가진다

Bean 등록

  • Bean을 IoC 컨테이너에 등록하는 방법에는 두가지가 있음
    1. xml에 직접 등록
    2. java config -> @Configuration + @Bean@Component으로 등록
      • @Bean@Configuration 클래스의 메소드에 사용한다
      • @Component는 클래스에 사용한다
  • 두 방법 모두 IoC Container 생성시 Component scan이 일어난다.
    • @Configuration 클래스의 @Bean들과, @Component 클래스를 모두 빈으로 등록

Bean DI

  • Bean을 등록할때 DI가 이루어져야 한다.
    • 단 순환참조(Circular Dependency)를 주의해야 한다
  • 의존성 주입에 두가지 방법이 있음
    1. @Bean으로 의존관계를 맺어주는 메소드 직접 만들기 (@Configuration 클래스에서 사용)
    2. @Autowired 기능 사용하기 (@Component 클래스에서 사용)
  • @Autowired 사용시
    • Bean 타입을 기준으로 주입시켜주기 때문에, 타입이 중복되는 Bean이 여러개일 경우 하나를 선택해야한다.
    • Autowired시 주입엔 세가지 방법이 있음
      1. 필드값
        • 주입 객체를 final로 선언 불가
        • 테스트 어려움
        • 의존관계 파악 어려움
        • SRP 위반함
      2. Setter
        • 주입 객체를 final로 선언 불가
        • 선택적 DI 구현시 사용
        • 테스트 쉬움
        • Setter를 열어놓는것이 불편함
      3. 생성자
        • 테스트 쉬움
        • 의존관계 파악 쉬움
        • 순환참조 감지 가능
        • final로 선언 가능
        • Spring 4.3 이상에서 생성자가 유일하면 @Autowired 생략가능