Spring 하면 빠질 수 없는 특징이
Dependency Injection 이다.
[[ DI ]]
: Spring 프로그래밍 기법으로써,
현재 자바클래스에서 객체 생성 주도권을 없애고,
Spring 의 Bean container 에서 객체 생성, 전달의 주도권을 갖는다.
이렇게 주도권이 뒤바뀌면서 Inversion Of Control 이 되는 것.
무엇이냐 도 중요하지만 왜? 가 더 중요한 것 같다.
Member m1 = new Member( );
여태 잘만 자바 클래스에서, 주도적으로다가 객체를 생성해서 편하게 사용했는데,
왜 불편하게 Bean container 라는 놈에서만 객체생성해서 사용하라는거야
그냥 쓰면 안되나?
1. Coupling
- 객체를 생성한다는 건, 말 그대로 새롭게 new 하나의 객체를 만들어 내는 것이다.
이 객체들은 생성된 된 각 지역에서만 사용이 가능하다.
즉, coupling(결합도)은 높고 / 공유성은 낮다.
A 에서 Member m1 = new Member( ); 을 생성해서 사용하고
B 에서 Member m1 = new Member( ); 을 생성해서 사용했다.
m1 은 사실상 똑같은 놈임에도 불구하고
서로 다른놈으로 생성된 다른놈이다.
그래서 m1 의 일부 코드만 수정해야할 경우가 생기면
A에 가서 고치고
B에 가서도 또 고쳐야 한다.
=> 객체를 각 클래스에서 주도권을 가지고 각자 생성해서 사용하지말고,
Bean Container 라는 거대한 공장을 만들어두고
객체는 거기서 만들기로 "약속" 하자.
우린 이제 Bean Container 에서 만들어둔 객체를
가져다가 쓰기만 하자.
이렇게 하면, m1 을 수정해야할 경우가 생기더라도
Bean Container 에서 한 번만 고쳐두면
A 와 B가 가져다 쓴 객체에는 자동으로 적용이 된다.
즉, DI 를 이용하면 Coupling 은 낮추고,
객체를 공유하여 사용할 수 있다.
이런 공유하는 방식을 좋아하는게 Interface 다.
(1) interface 에서 대략적인 판을 짜두고
(2) Bean Container 에서 구현클래스들 객체를 만들어 두고
(3) 기능 필요할 때, 객체 가져다가 사용하는데,
Interface를 상속했기 때문에, 부모 Interface 로 묶어서 사용이 가능하다.
=> 공유성이 더욱 올라간다.
2. Dependency
- 객체는 그냥 혼자 독립적으로 사용되는게 아니다.
public class A {
Member m1 = new Member( );
MemberDAO dao = new MemberDAO( );
dao.insert( m1 );
}
A 클래스에서 Member 객체와 MemberDAO 객체를 생성해서 사용해야 한다.
A 는 Member와 MemberDAO 객체에 의존한다. (의존관계)
이런식으로 객체들은 서로 Dependency 를 갖고 서로 맞물리며 사용된다.
- 각 클래스에서 따로 따로 new 객체를 생성하면서 사용하게되면,
의존성이 물리고 물려서, 하나를 고치려면 각 클래스마다 돌아다니면서 의존성을 찾아
하나하나 다 고쳐야 할 경우가 생길 수 있다.
- Bean Container에서 객체생성에 대한 정보를 모아두고 사용하면
어느 클래스에서 어느 인터페이스/혹은 클래스를 객체생성해서 가져다 쓸것인지,
의존성 관계를 관리하고, 수정하기가 용이하다.
=> Spring에서도 여전히 new 로 객체를 생성해 사용할 수는 있다.
하지만 DI기법을 사용해서 스스로 객체생성의 주도권을 Spring에게 반납하고 맡김으로서
객체의 공유성을 높이고 결합도는 낮추고
Dependency 의존성을 Bean Container 에서 관리할 수 있는 이득을 취할 수 있다.
[ Bean 등록 DI 하는 방법 ]
(1) Component Scan 방식 ( @component @service @repository )
(2) Configuration 등록 방식 ( @Bean )
(3) Spring Bean Configuration.xml 등록 방식 ( <bean id =" m1 " class= "Memeber" > )
'Back to the Spring' 카테고리의 다른 글
DispatcherServlet // HandlerMapping // ViewResolver (0) | 2022.08.18 |
---|---|
[DI] xml 방식 / Componenet - Scan 방식 (0) | 2022.08.18 |
[Spring] Spring MVC 의 등장 (0) | 2022.08.18 |
변수 { id } 를 품은 URL (0) | 2022.06.15 |
세션 VS JWT(토큰) .Feat 쿠키 (1) | 2022.06.12 |