본문 바로가기

Spring/Dependency Injection

[Spring Framework] 직접 Dependency Injection 해보기

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

Spring에서 다루는 DI에 대해서 더 잘 이해하기 위해서 실습을 진행해봅시다!

이번 시간에는 직접 DI를 하면서, 우리가 외부 파일로 설정을 해주어야하는 이유를 알아보도록 하겠습니다.

 

 

 

우선 동물의 이름과 나이에 대한 정보를 저장하기 위해서 Animal이라는 class를 생성하겠습니다.

public class Animal {
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public Animal(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
}

 

 

그리고 Animal이라는 class의 정보를 출력하기 위해 AnimalPrint이라는 interface를 만들어보겠습니다.

public interface AnimalPrint {
	
	void print();

}

 

 

 

AnimalPrint interface를 구현하는 AnimalPrintName 코드를 작성해봅시다.

public class AnimalPrintName implements AnimalPrint {

	Animal animal;
	
	public AnimalPrintName(Animal animal) {
		this.animal = animal;
	}

	@Override
	public void print() {
		System.out.printf("Name is %s", animal.getName());

	}

}

 

 

 

이번에는 PrintAnimal interface를 통해 해당 동물의 나이를 출력하는 PrintAnimalAge을 구현해봅시다.

public class PrintAnimalAge implements PrintAnimal {
	private Animal animal;
    
    public PrintAnimalName(Animal animal) {
    	this.animal = animal;
    }
    
    @Override
    public void print(){
    	System.out.printf("Age is %d\n", animal.age());
    }
}

 

 

 

이제 main에서 Animal의 이름을 출력하기 위해서 아래와 같이 코드를 작성할 수 있습니다.

아래의 코드에서 animal이라는 부품을 AnimalPrintName에서 가져다가 사용하고 있으니,

AnimalPrintName과 결합이 일어나는 Dependency Injection이 일어났다고 할 수 있습니다.

public class Program {
	public static void main(String[] args) {
	    	
        Animal animal = new Animal("BINGO", 5);
        AnimalPrint console = new AnimalPrintName(animal);
        console.print();
        
	}
}

 

 

 

실행하게 되면 우리의 예상대로 출력이 되는 것을 확인할 수 있습니다.

 

 

 

그러면, 만약 우리가 동물의 이름을 출력하는 기능을, 나이를 출력하는 기능으로 수정하고싶다면 어떻게 해야할까요?

우선 AnimalPrint라는 interface를 다른 형식으로 구현하기 위한 코드를 아래와 같이 작성해봅시다.

public class AnimalPrintAge implements AnimalPrint {

Animal animal;
	
	public AnimalPrintAge(Animal animal) {
		this.animal = animal;
	}

	@Override
	public void print() {
		System.out.printf("Age is %d", animal.getAge());

	}

}

 

 

 

그러면 이제 아래와 같이 코드를 변경하여 나이를 출력할 수 있도록 해봅시다.

public class Program {
	public static void main(String[] args) {
	    	
        Animal animal = new Animal("BINGO", 5);
        //AnimalPrint console = new AnimalPrintName(animal);
        AnimalPrint console = new AnimalPrintAge(animal);
        console.print();
        
	}
}

 

 

 

결과는 아래와 같이 나오는 것을 확인할 수 있습니다.

 

 

 

 

자, 이제 다시 한 번 Program의 코드를 찬찬히 살펴봅시다.

우리가 원하던대로 이름을 출력하는 코드를 나이를 출력하는 코드로 수정이 잘 됐지만,

실제로 개발을 할 때에 업데이트마다 객체를 생성하는 코드를 수정하는 것은 굉장히 부담스러운 일일것입니다.

원본 코드를 손대야 하는 일이기 때문입니다.

 

 

 

따라서 우리는 문제가 되는 Dependency Injection을 외부 설정에 맡기게 됩니다.

즉, 저 이름을 결정하는 부분이 코드 내부가 아닌, XML과 같은 다른 부분에 있는 것입니다.

 

 

 

이렇게 직접 DI를 해보면서 어떤 문제점이 발생하고, 외부설정이 왜 필요한지 알아보았습니다 :)

 

728x90
반응형