티스토리 뷰
DI , 의존성 주입을 알기 위해서는 의존성이 뭔지부터 알아야겠다
Object Dependencies(객체 의존성)
현재 객체가 다른 객체와 상호작용을 하고 있다면 현재 객체는 다른 객체에 의존성을 가진다
public class A {
private B b = new B();
}
간단하게 말하자면 한 객체에서 다른 객체를 가지고 와서 쓰면 그게 바로 의존성이다
이 의존성에는 단점이 있는데, A 객체는 B객체의 생성을 제어하기 때문에 두 객체 간에는 긴밀한 결합이 생기고 이에 따라 A 객체를 변경하면 B의 객체도 변경된다 즉 A 객체가 변경되면 B 객체도 변경된다는 것이다 또한 이렇게 두 객체 사이에 의존성이 존재하면 단위 테스트 작성이 어려워진다
DI(Dependency Injection) 의존성 주입
필요한 자원을 외부에서 생성자를 통해 넣어주는게 바로 의존성 주입이다
쉽게 말해서 A 클래스의 b라는 객체 자체가 아니라 Constructor(생성자) 또는 Setter 같은 Framework를 사용하여 b에게 의존성을 주입한다
public class A {
private B b;
public void anyMethod() {
b.~
}
}
토비스프링에서 정의한 의존관계 주입에 조건은 다음과 같다
• 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다 그러기 위해서는 인터페이스만 의존하고 있어야 한다
• 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다
• 의존관계는 사용할 객체에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어진다
이렇게 되면 외부로부터 수많은 인터페이스 타입으로 교체되어 주입할 수 있으니 코드가 유연해지고
의존성 제어로 인해 수많은 객체들에 의존관계를 맺어 개발자는 편하게 비즈니스 로직에 집중할 수 있다
간단하게 풀어보자면 객체에 무언가를 주입하는 것은 프로그램이 알아서 하니 개발자는 로직에만 집중할 수 있다는 것이다
이러한 DI 즉 의존성 주입을 잘 녹인 프레임워크(Framework)가 바로 스프링이다
IoC(Inversion of Control) 제어의 역전
제어의 역전을 정말 간단하게 풀어보자면 개발자가 직접 객체를 생성하고 주입하던 것을 Framework가 대신해주는 것이다
public class A {
@Autowired
private B b;
}
스프링 프레임워크를 사용한다고 하면 B 라는 객체에 어노테이션으로 표시를 해놓고
컨테이너가 알아서 두 객체를 생성하고 의존성 까지 주입시키는 것이다
이는 개발자가 제어의 중심이지만 코드 전체에 대한 제어를 Framework가 대신한다고 이해해도 될 것이다
Spring Container
스프링의 핵심이라고 할 수 있는 스프링 컨테이너는 DI를 사용하여 응용프로그램을 구성하는 bean(객체)을 관리한다
스프링 컨테이너에는 두가지 유형이 있다
1.BeanFactory
말 그대로 빈(bean) 공장인데, bean 객체를 생성하고 관리하는 클래스이다.
빈을 등록하고 생성하고 조회하고 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당한다
빈 팩토리는 빈의 정의를 즉시 로딩하는 반면, 빈 자체를 호출하기 전까지는 인스턴스화 하지 않는다
getBean()이 호출되면 그때서야 팩토가 의존성 주입(DI)을 사용하여 빈은 인스턴스화 하고 빈의 특성을 설정한다
BeanFactory factory = new XmlBeanFactory(new FileInputStream("bean.xml"));
MyBean myBean = (Mybean) factory.getBean("myBean");
2.ApplicationContext
BeanFactory와 유사하지만 향상된 형태의 컨테이너다, 추가적으로 국제화 지원 텍스트 메시지 관리, 이미지 파일 로드, 리스너로 등록된 빈에게 이벤트 발생 통보등의 기능을 추가로 제공한다
ApplicationContext context = new ClassPathXmlApplicationContext("conf/bean.xml");
MyBean bean = context.getBean("myBean");
이 둘의 가장 큰 차이점은 BeanFactory의 경우 호출된 시점에서야 빈을 생성하지만
ApplicationContext같은 경우는 Context 초기화 시점에 모든 싱글톤 빈을 생성해 놓고 바로 호출할 수 있도록 보장한다는 것이다
개인 학습을 위해 작성되는 글입니다.
제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.
참조 링크:
https://velog.io/@turtle601/DI%EB%9E%80
https://gmlwjd9405.github.io/2018/11/09/dependency-injection.html
https://jobjava00.github.io/language/java/framework/spring/container/
'Spring' 카테고리의 다른 글
[Spring] Singleton(싱글톤) (0) | 2021.08.13 |
---|---|
[Spring] Spring Container(스프링 컨테이너) (0) | 2021.08.11 |
[Spring] POJO(Plain Old Java Object) (0) | 2021.08.11 |
[Spring] PSA(Portable Service Abstraction) (0) | 2021.08.11 |
[Spring] AOP (Aspect Oriented Programming) 관점 지향 프로그래밍 (0) | 2021.08.11 |
- Total
- Today
- Yesterday
- 맨코
- Spring MVC
- 제이쿼리 직접 선택자
- Spring TypeConverter
- 캐시
- maenco
- Cache
- uri
- jQuery 직접 선택자
- Spring API Error
- OOP
- ResponseStatusExeceptionResolver
- 제이쿼리 기본 선택자
- spring
- Spring Container
- 제이쿼리 탐색선택자
- cookie
- http
- 세션
- application/x-www-form-urlencoded
- @ExceptionHandlere
- 제이쿼리 인접 관계 선택자
- @ResponseStatus
- 제이쿼리란
- 쿠키
- ExceptionHandlerExceptionResolver
- DTO와 VO의 차이
- 제이쿼리 위치탐색선택자
- DefaultHandlerExceptionResolver
- Session
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |