본문 바로가기
Spring 프레임워크/메모

의존 주입

by Hwanii_ 2023. 9. 19.
728x90
class Apple {

	private Banana banana;
    
    public void hello() {
    	banana.hello();
	}
    
}	//	Apple

class Banana {
	
    public void hello() {
    
    ..
    
    }

}	//	Banana

=============================

main() {

	Apple apple = new Apple();
    
    apple.hello();	//	NPE 발생.

}

 

apple을 주체로 해서 Banana 클래스의 인스턴스 메서드를 사용 할 수 있을까 ?

 

정답은 X 이다.

 

NPE 가 발생 한다.

 

왜냐하면, Banana 클래스가 객체화 되지 않았기 때문 이다.

 

스프링 프레임워크를 사용한다고 가정하고,

 

Banana 클래스를 객체화 시켜보자.

 

원래 객체화는 new 키워드를 사용해서 하지만,

@Component 어노테이션을 포함 해서 모든 상속받은 어노테이션을 사용 하여 객체화가 가능 하다.

 

class Apple {

	private Banana banana;
    
    public void hello() {
    	banana.hello();
	}
    
}	//	Apple

@Bean
class Banana {
	
    public void hello() {
    
    ..
    
    }

}	//	Banana

=============================

main() {

	Apple apple = new Apple();
    
    apple.hello();	//	NPE 발생.

}

 

@Component, @Repository, @Service, @Controller 를 그동안 많이 사용했었는데,

 

Spring Boot 에서는 @Bean 어노테이션을 사용해서 객체화가 가능 하다.

 

암튼, 

 

저렇게 객체화를 하면 사용 할 수 있을까 ?

 

정답은 X 이다.

 

객체화 까지 했는데 왜 사용 못함 ?

 

hello() 메서드를 어디서 누가 사용할건지가 중요 하다.

 

그냥 저거 머 객체화 해뒀다고 사용 할 수 있음 ?

 

NO.

 

사용 할 수 없다.

 

class Apple {

	@Autowired
	private Banana banana;
    
    public void hello() {
    	banana.hello();
	}
    
}	//	Apple

@Bean
class Banana {
	
    public void hello() {
    
    ..
    
    }

}	//	Banana

=============================

main() {

	Apple apple = new Apple();
    
    apple.hello();

}

 

Apple 클래스 내부에서 !

 

banana를 주체로 해서 !

 

Banana 클래스 안에 있는 인스턴스 메서드인 hello() 메서드를 사용하는 거니까 !

 

Apple 클래스 내부에 Banana 타입의 참조변수인 Banana banana 를 의존 주입 해줘야 한다.

 

즉, Apple 클래스 내부에 객체화 되어있는 Banana banana를 의존 주입  해주는 것이다.

 

위에서 말했듯이, 스프링 프레임워크를 사용하면서 객체화를 할 수 있는 어노테이션은 많다.

 

위에서, 어떤 클래스에다가 어노테이션을 명시해서, 스프링 컨테이너가 빈 객체로 등록을 하면,

 

컨테이너에 빈으로 등록이 된 객체를,

Xxx 클래스 내부에서 의존 관계로 사용된다는 것을 명시 할 수 있는 기능을 가진

@Autowired 어노테이션을 사용 한다.

 

그러면 이미 객체화 해뒀던 객체를 그냥 가지고 와서 의존 주입을 하는것이기 때문에,

싱글톤 패턴의 개념이 유지되고, 개발자는 직접 객체화를 하지 않으니까 IoC 개념 이라고 할 수 있다.

 

정리

 

Apple 클래스 내부에 hello() 메서드는 banana를 주체로 해서 Banana 클래스의 인스턴스 메서드를 사용하므로,

 

둘은 의존 관계에 놓였다고 할 수 있으니,

 

의존 관계 라는것은 강한 안정성을 가질 수 있게 도와주는 프로그래밍 개발 기법 이라고 볼 수 있다.

 

Apple을 사용 하려면 Banana가 반드시 있어야만 하네 ?

 

Banana가 객체화 되어 있지 않고, 암튼 의존 주입이 안되어있으면 Apple 을 사용 할 수 없네 ?

 

이런식으로 안정성을 갖게 하는 것이다.

반응형