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 을 사용 할 수 없네 ?
이런식으로 안정성을 갖게 하는 것이다.
'Spring 프레임워크 > 메모' 카테고리의 다른 글
[ Spring ] MyBatis 연결 하기 01 (0) | 2023.09.27 |
---|---|
인터페이스 개념 메모 (0) | 2023.09.21 |
파일 업로드시, 비동기처리를 통해, 썸네일 기능을 구현 하기 (0) | 2023.08.18 |
throws 와 try-catch 메모 (0) | 2023.08.17 |
Spring 프레임워크 JoinPoint 인터페이스 (0) | 2023.08.12 |