반응형

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
반응형

Spring의 핵심 요소

- 제어 역전(IoC, Inversion of Control)

- 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)

- 서비스 추상화(PSA, Portable Service Abstraction)

라고 볼 수 있다.

 

IoC는 우리가 제어의 역전이라고 알고 있다.

그렇다면 제어의 역전이라는 것은 무엇일까, 일반적으로 프로그램을 개발할 때 개발자(주체)가 객체의 생명 주기를 관리하게 된다. 제어의 역전이란 외부(컨테이너, 주체)에서 객체의 생명 주기를 관리하는 것이다.

이러한 IoC를 위해 DI(Dependency Injection)이 사용된다.

 

Spring IoC컨테이너가 우리가 필요한 인터페이스 자리에 객체를 생성해서 넣어준다(DI).

 

Spring에서는 IoC 컨테이너ApplicationContext 인터페이스를 구현한 오브젝트(객체)이다.

추가로 ApplicationContext는 BeanFactory를 상속한 하위 인터페이스이다.

 

IoC컨테이너를 통해 Bean이 관리된다.

Bean이란 IoC컨테이너가 관리하는 대상(객체)이다.

 

IoC컨테이너가 객체를 관리하기 위해서는 Bean을 IoC컨테이너에 등록해 주어야 한다.

등록하는 방법은 xml을 통한 방법과 java를 이용하는 방법이 있다.

 

방법은 추가로 등록하겠습니다.

반응형

'공부 > Spring' 카테고리의 다른 글

[Spring] DI란?  (0) 2021.09.20
@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

+ Recent posts