Spring의 핵심 요소는
- 제어 역전(IoC, Inversion of Control)
- 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)
- 서비스 추상화(PSA, Portable Service Abstraction)
라고 볼 수 있다.
오늘 볼 것은 IoC, 제어의 역전을 위한 DI(Dependency Injection)에 대해서 알아보고자 한다.
참고로 DI는 스프링에만 있는 것이 아니다. DI는 디자인 패턴 중 하나이다.
DI, 의존성 주입은 무엇일까, DI에 대해 이야기하기 전에 먼저 의존성이라는 것에 대해 알아야한다.
의존성이랑 A객체 내 B객체가 사용될 때 A는 B에 대해 의존성을 가진다고 한다. 이유인 즉슨 B가 바뀌게 되거나 다른 객체를 사용해야할 때 그 영향을 A도 받기 때문이다. 이런 의존성은 개발 또는 유지보수를 힘들게 한다.
따라서 우리는 결합도는 낮고 응집도는 높게 개발할 필요가 있다.
그러면 어떻게 의존성을 줄일 수 있을까, 그것은 객체를 직접 만들지 않고 외부에서 만들어서 객체를 넣어주는 방식을 사용하면 된다. 이런 것을 우리는 DI라고 부른다.
그러면 DI의 방법은 무엇이 있을까
- 생성자 주입
- Setter 주입
생성자 주입의 예
B b = new B();
A a = new A(b);
a를 생성하기 전 객체 b를 생성하여 a를 생성할 때 b를 생성자를 통해 주입해준다.
Setter 주입의 예
B b = new B();
A a = new A();
a.setB(b);
이번에는 객체 b를 생성하고 객체 a를 생성한 후 a의 setB메서드를 통해 객체 b를 주입해준다.
이렇게 되면 우리가 주입한 객체에 따라 a가 동작하게 되고 a는 b가 다른 객체가 주입되면 다른 객체에 맞게 동작할 수 있다.
그런데 어떻게 다른 객체를 주입할 수 있을까
그것은 인터페이스를 이용하면 된다.
우리가 a 내에 b를 주입 받을 필드를 B클래스의 레퍼런스 변수를 지정하면 우리는 B밖에 주입할 수 없다.
그러나 B 대신 B가 구현하고 있는 인터페이스 SuperB를 사용해서 레퍼런스 변수를 만든다면 우리는 SuperB를 구현하고 있는 객체를 주입할 수 있게 된다.
SuperB를 구현한 Class인 B와 BB 그리고 BBB가 있을 때 우리는 a에 B, BB, BBB를 주입할 수 있다.
이렇게 되면 우리의 프로그램이 필요한 객체를 SuperB인터페이스에 맞게 구현해서 주입한다면, A 클래스를 수정하지 않아도 주입된 객체에 따라 A의 객체를 동작을 변경할 수 있게 된다.
JAVA를 처음 배울 때 인터페이스가 왜 필요하지라는 생각을 많이 갖고 있었는데, 스프링이나 디자인 패턴들을 공부할 때마다 인터페이스의 활용도가 높다는 것을 느낀다.
'공부 > Spring' 카테고리의 다른 글
[Spring] IoC란 무엇인가? (0) | 2021.09.16 |
---|---|
@Transactional 동작하지 않는 경우 (0) | 2021.09.10 |
[Spring] AOP란? (0) | 2021.09.08 |
[Spring] Filter & Interceptor (0) | 2021.05.05 |
Servlet Working Flow (0) | 2021.05.04 |