본문 바로가기

🌈 Spring Framework

스프링 삼각형 : 1. 스프링을 이용하지 않은 DI/ IoC

스프링 삼각형

스프링 프레임워크를 이해하기 위해서 POJO (Plain Old Java Object)를 기반으로 구성되어 있는 3대 프로그래밍 모델 : 의존성 주입 (DI / Dependency Injection) 혹은 제어의 역전 (IoC / Inversion of Control) + 관점 중심 프로그래밍 (AOP / Aspect Oriented Programming) +이식 가능한 서비스 추상화 (PSA/ Portable Service Abstraction)에 대한 이해가 필요합니다. 

 

그중에 먼저 DI/IoC 에 대한 내용을 다뤄보려고 합니다. 

 

일단 프로그래밍에서 의존성이란 무엇일까? 

의존성이란 전체에 new()를 생성하게 되면 전체가 부분에 의존하게 된다. 

그러며 의존 객체(전체)와 의존되는 객체 (부분) 사이에 집합 관계 (Aggregation)과 구성 관계 (Composition)로 구분도 가능합니다. 

 

의존성 주입하는 방식은 총 6가지가 있습니다 : 

 

1. 스프링 없이 의존성 주입 - 생성자를 통한 의존성 주입

2. 스프링 없이 의존성 주입 - 속성을 통한 의존성 주입 

3. 스프링을 통한 의존성 주입 - XML 파일

4. 스프링을 통한 의존성 주입 - XML 에 속성 주입

5. 스프링 통한 의존성 주입 - @Autowired / @Resource 통한 속성 주입

6. 스프링 통한 의존성 주입 - @Autowired vs. @Resource vs. <property> 태그 

 

이 모든 방법을 알고 있어야 의존성 주입에 대한 개념이 확실하게 이해할 수 있습니다.

의존성 주입에 방식에 대한 내용이 길어서 이번 포스트에서는 스프링 없이 의존성 주입에 대해 설명해 보도록 하겠습니다. 

이해를 돕기 위해 자동차의 타이어를 예시로 모든 방식의 예시를 다루어 보겠습니다. 

 

🌱 스프링 없이 의존성 주입 - 생성자를 통한 DI

public class Driver {
	public static void main(String[] args) {
        Tire tire = new KoreanTire();
        Car car = new Car(tire);
        
        System.out.println(car.getTireBrand());
    }
}

자동차 내부에서 타이어를 생산하는 것이 아니라 외부에서 생산된 타이어를 자동차에 정착하는 주입 작업이 이루어졌습니다. 

외부에서 생산된 tire 이라는 객체를 Car 생성자의 인자로 의존성 주입을 구현해 보았습니다. 

 

이러한 구현을 통해 자동차 생산을 할 때 어떤 타이어를 생산해서 장착해야 할지에 대한 고민을 하지 않아도 되기 때문에 코드가 유연해집니다. 의존성 주입을 하게 되면 Car는 Tire 인터페이스를 구현한 객체가 들어오기만 하면 정상적으로 작동하게 되므로 확장성과 코드를 변경할 필요 없이 새로운 타이어 브랜드를 사용할 수 있는 장점이 있습니다. 인터페이스를 통해 Tire를 구현했기에 코드를 재배포할  필요 없이 구성해야만 하는 코드 재컴파일과 재배포에 대한 부담을 덜 수 있습니다. 

인터페이스의 구현은 결국에 현실세계에서 표준화 시켰다는 말과 같은 의미입니다. 

 

스프링 없이 생성자를 통한 의존성 주입은 디자인 패턴의 "전략 패턴" 을 이용하고 있습니다. 

여기서! 전략 패턴이란 클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴이며 개방 폐쇄 원칙 (OCP)와 의존 역전 원칙 (DIP)가 적용된 것입니다. 

 

전략 패턴에는 세가지 구성 요소가 있는데 :

 

  • 전략 메서드를 가진 전략 객체 
  • 전략 객체를 사용하는 컨텍스트 (사용자/ 소비자)
  • 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 (제3 자, 전략 객체의 공급자) 

스프링에서 대입을 해보게 되면 구성이 이렇게 됩니다. 

전략 = Tire 을 구현한 KoreaTire

컨텍스트 = Car의 getTireBrand() 메서드

클라이언트 = Driver의 main() 메서드 

 

🌱 스프링 없이 의존성 주입 - 속성을 통한 DI

public class Driver {
	public static void main(String[] args) {
        Tire tire = new KoreanTire();
        Car car = new Car();
        car.setTire(tire);
    }
}

생성자를 통해 타이어를 주입하는 것은 타이어를 한번 장착하면 교체할 방법이 없다는 의미가 된다. 그래서 생성자가 아닌 속성에 의존성 주입하는 방법을 통해 운전자가 Car의 Tire 교체를 하게 해주는 방법이 있다. 

 

👉🏻 속성을 통한 의존성 보다는 생성자를 통한 의존성을 선호하는 사람이 더 많다고 하네요 

public class Car {
	Tire tire;
    
    public Tire getTire() {
    	return tire;
    }
    
    public void setTire(Tire tire) {
    	this.tire = tire;
    }
}

Car 클래스에 생성자를 없애고 tire 속성 (state/ 상태)에 대한 접근자와 설정자 메서드를 넣어 의존성 주입을 구현해 보았습니다.

 

 

'🌈 Spring Framework' 카테고리의 다른 글

객체 지향 설계: SOLID 원칙  (0) 2021.04.07