스프링은 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를 동적으로 만들어서 삽입된다.
- 관점지향 프로그래밍, AspectJ, JBossAOP, SpringAOP가 존재
의존하는 관계
- 상속하는관계
- has a
- 사용하는 관계 (dependency)
스프링에서 말하는 것은 2번을 말한다.
넌 태어날때부터 가지고 태어나라~ 하는 것
객체의존성 - 코드에서 두 모듈간에 연결, 객체간에 연결 일반적으로 하나가 다른 하나를 사용, 가지는 관계
의존관계가 많아지면 나중에 테스트할 코드가 많아진다. 회귀테스트할 것이 많아진다. 수동으로 하기엔 너무 많으니 자동으로 해야하는 데 방법은? 이때 assert가 쓰이는데 사용할 줄 알아야..
스프링에서 빈은 컨테이너가 관리
빈의 생성은 컨테이너가 해준다.
빈(A)에 생성된 빈(B)을 사용할 수 있도록 값을 할당해준다 - 이것이 DI
효과적으로 사용하려면? interface를 사용한다. - 이는 설계를 의미한다, 아키텍처(구조)에 대한 이해가 필요하다.
또 설계를 하려면 업무(비지니스)를 잘 알아야하고 업무를 분석해야 한다. 설계는 메소드 정하는 것 까지
설계를 잘하려면 디자인 패턴을 공부해야 한다.
메소드를 잘 구현하려면 알고리즘을 알아야한다.
애자일 - 짧은 주기로 분석 설계 미니워터폴
스프링으로 아키텍처를 말하자면
컨트롤러 | —-> | 서비스 | —-> | 레파지토리 |
---|---|---|---|---|
도메인 | 도메인 | 도메인 | ||
뷰 |
컨트롤러는 서비스를 가지고 서비스는 래퍼지토리를 갖는다.
각 단계는 도메인을 사용하고
컨트롤러는 뷰를 사용한다.
이런 관계구조
DI 방법
스프링에선 생성자 주입 setter 주입 필드에 주입(autowired) - 스프링 의존적인 객체가 된다. 바람직하진 않다.
스프링DI가 가장 많이 쓰이는 이유는
호환성이 좋아 이전 코드도 사용 가능하다. 오래된 새 것 같은…
AOP - 관점지향 프로그래밍