Spring을 처음 사용하게 되면서 가장 익숙치 않은 개념이 바로 제어의역전과 의존성주입이었다. 이에 이번엔 의존성주입이 뭔지 간단히 정리해본다.

 

 Dependency 의존성

 의존성이란 하나의 객체가 동작하기 위해 다른 객체가 필요한 경우를 말한다. 예를들어 A라는 객체는 반듯이 B라는 객체가 있어야만 동작하는 경우 A는 B에 의존한다 라고 이야기 할 수 있다.

 

 Injection 주입

 주입은 단어의 뜻 그대로 밀어넣는 것인데 Spring에서 주입은 외부에서 객체를 넣는 것을 의미한다.

 

 이제 의존성과 주입을 합쳐서 보면 의존하는 객체를 외부에서 밀어넣는다 라는 말이된다.

 

 그러면 의존성주입이 필요한 이유는 뭘까? 한 객체가 동작하기 위해 필요로 하는 다른 객체를 직접 new 연산자로 생성하는 것보단 의존성주입을 통해서 필요한 객체를 넣어주는 것이 객체간 결합도가 낮아지기 때문이다.

 

 쉽게 예를 들어 보면 어떠한 하나의 서비스를 완수하기 위해서 여러가지 과정을 거쳐야한다고 보자. 그럴땐 서비스를 구성하는 과정을 모두 하나로 묶어서 서비스 객체를 만들었을 경우, 나중에 한 과정만 수정이 필요할때도 전체 서비스를 들여다 봐야할 상황이 발생하게 된다.

 반면 서비스를 구성하는 과정들을 나눠서 놓고 서비스를 실행할때마다 필요한 과정을 주입하는 방식이라면 특정 과정만 수정하는 비용이 훨씬 적어질 것이다.

 

 DI가 필요한 또 다른 이유로는 Spring의 특징 중 하나인 IoC(제어의 역전)라는 제어 흐름을 따르기 위함이다. 제어의 역전에 대해서는 별도의 포스팅이 있지만 간략하게 말하자면, 개발자가 라이브러리의 메소드를 호출하는 것이 아니라 반대로 라이브러리(그 중에서 프레임워크)가 개발자가 작성한 코드를 호출하는 방식이다.

 스프링에서 제어의역전은 개발자가 객체를 직접 생성하지 않고 Container가 객체(Bean)을 생성해서 관리하고 필요에 따라 객체를 주입해주는 방식으로 이루어지는데 이 과정에서 객체를 주입하는 DI의 개념이 필수적일 수 밖에 없다.

 

아래는 간단하게 의존성삽입의 예를 보여주는 코드.

interface Car {
	void ride();
}

class Sedan implements Car {
	public void ride() {
    	System.out.println("ride Sedan");
    }
}

class Cupe implements Car {
	public void ride() {
    	System.out.println("ride Cupe");
    }
}

//Owner 객체는 car 객체에 의존적이다.
public class Owner() {
	private Car car;
    
    public void setCar(Car car) {
    	this.car = car;
    }
    
    public void rideCar() {
    	car.ride();
    }
}

public class Main {

	public static void Main(String[] args) {
    	Owner owner = new Owner();
        
        //onwer객체에 sedan 객체를 주입한다.
        owner.setCar(new Sedan);
        owner.rideCar();
        
        //onwer객체에 cupe 객체를 주입한다.
        owner.setCar(new Cupe);
        owner.rideCar();
    }
}

'스프링' 카테고리의 다른 글

Spring Encoding 설정  (0) 2021.01.07
Spring ComponentScan 역할과 설정  (0) 2020.12.24
IoC(Inversion of Control) 제어의역전 과 IoC Container  (0) 2020.11.27

+ Recent posts