스프링은 DI 컨테이너라고도 부른다.

IOC - 대신 해줌
DI - 미리 찜해 놓음

  • DI 의 개념

각 클래스간의 의존관계를 빈 설정( XML, 어노테이션) 정보를 바탕으로 컨테이너가 자동으로 연결해주는것을 말함
개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하기만 하면 된다.
객체 레퍼런스를 컨테이너로부터 주입받아서, 실행 시에 동적으로 의존관계가 생성된다.
컨테이너가 흐름의 주체가 되어 어플리케이션 코드에 의존관계를 주입해주는 것이다.
new를 사용하지않고 외부의 빈을 사용

  • DI 의 장점
    코드가 단순해진다.
    컴포넌트 간의 결합도가 제거된다.

  • Spring DI 컨테이너의 개념
    Spring DI 컨테이너가 관리하는 객체를 빈 이라고 하고, 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리라고 한다.

  • BeanFactory ( 이러한 것을 인터페이스라고함)
    Bean을 등록, 생성, 조회, 반환 관리함
    보통 바로 사용하지않고 확장한 ApplicationContext를 사용함
    getBean() 메서드가 정의되어 있음.

  • ApplicationContext (이러한 것을 인터페이스라고함)

spring 각종부가서비스를 추가 제공함

  • 다른 di 컨테이너
    • 스프링, 피코, 구글에선 만든 것,…
  • AOP
    • 관점지향 프로그래밍, AspectJ, JBossAOP, SpringAOP가 존재
      • 공통적인 부분을 코드밖에서 삽입
      • join point - 메소드를 호출(삽입)하는 부분
      • 포인트컷 - join 된 것들과 advice를 매핑
      • 어드바이스 - 작동될 코드(메소드)
      • 포인트컷 + 어드바이스
      • 자동으로 코드를 삽입
      • proxy를 동적으로 만들어서 삽입된다.

의존하는 관계

  1. 상속하는관계
  2. has a
  3. 사용하는 관계 (dependency)

스프링에서 말하는 것은 2번을 말한다.
넌 태어날때부터 가지고 태어나라~ 하는 것

객체의존성 - 코드에서 두 모듈간에 연결, 객체간에 연결 일반적으로 하나가 다른 하나를 사용, 가지는 관계

의존관계가 많아지면 나중에 테스트할 코드가 많아진다. 회귀테스트할 것이 많아진다. 수동으로 하기엔 너무 많으니 자동으로 해야하는 데 방법은? 이때 assert가 쓰이는데 사용할 줄 알아야..

스프링에서 빈은 컨테이너가 관리
빈의 생성은 컨테이너가 해준다.
빈(A)에 생성된 빈(B)을 사용할 수 있도록 값을 할당해준다 - 이것이 DI

효과적으로 사용하려면? interface를 사용한다. - 이는 설계를 의미한다, 아키텍처(구조)에 대한 이해가 필요하다.

또 설계를 하려면 업무(비지니스)를 잘 알아야하고 업무를 분석해야 한다. 설계는 메소드 정하는 것 까지
설계를 잘하려면 디자인 패턴을 공부해야 한다. 메소드를 잘 구현하려면 알고리즘을 알아야한다.

애자일 - 짧은 주기로 분석 설계 미니워터폴

스프링으로 아키텍처를 말하자면

컨트롤러 —-> 서비스 —-> 레파지토리
         
도메인   도메인   도메인
       

컨트롤러는 서비스를 가지고 서비스는 래퍼지토리를 갖는다.
각 단계는 도메인을 사용하고
컨트롤러는 뷰를 사용한다.
이런 관계구조

DI 방법

스프링에선 생성자 주입 setter 주입 필드에 주입(autowired) - 스프링 의존적인 객체가 된다. 바람직하진 않다.

스프링DI가 가장 많이 쓰이는 이유는

호환성이 좋아 이전 코드도 사용 가능하다. 오래된 새 것 같은…

AOP - 관점지향 프로그래밍