먼저 Spring의 DI에 대하여 공부를 할려구 했더니... IOC를 먼저 알아야될거 같아서 먼저 기록을 하겠습니다.
IOC는 Inversion of Control 즉 제어의 역전이라고 부릅니다.
음... Spring을 쓰기전에 옛날에는 개발자가 프로그램의 흐름을 제어하는 주체였지만 스프링을 사용하고 나서 부터는 프로그램의 흐름을 프레임워크가 주도하게 됬다고 합니다.
즉 스프링에서의 객체의 생성~ 생명주기 관리를 컨테이너라는 녀석이 도맡아서 하게 된다고 합니다.
그래서! 제어권이 컨테이너로 넘어가게 되고 이것을 제어권의 흐름이 바뀌었다고 해서 IOC라고 하게 된다고 합니다.
그래서 IOC로 인하여 DI(의존성 주입), AOP(관점 지향 프로그래밍)등이 가능하다고 합니다.
DI는 Dependency Injection즉 의존성 주입이라고 합니다.
객체간의 의존성을 자신이 아닌 외부에서 주입하는 개념입니다.
그러면 왜 Spring에서 이런 개념을 사용을 할까요?!
예제를 한번 보겠습니다.
public class MessageApp{
public static void main(String[] ars){
MessageBean bean = new MessageBean();
bean.sayHello("Spring")
}
}
public class MessageBean{
public void sayHello(String name){
System.out.prinln(name);
}
}
public class MessageBean2{
public void sayHello(String name){
System.out.prinln(name);
}
}
위의 코드를 보면 MessageApp은 MessageBean이라는 클래스에서 sayHello라는 메소드를 호출합니다.
만약에 MessageBean bean = new MessageBean()을 MessageBean2로 바꿔야 될상황이 생기면 어떻게 해야될까요?
public class MessageApp{
public static void main(String[] ars){
MessageBean2 bean2 = new MessageBean2();
bean.sayHello("Spring")
}
}
이런 경우에는 MessageApp이 MessageBean에 의존성을 가지고 있다고 합니다.
왜냐하면 MessageApp의 기능을 바꾸고자 할 경우 MessageBean도 바꿔줘야 하기 때문입니다.
이러한 의존성을 해결하기 위해서 DI 기능을 이용한다고 합니다.
Spring DI란, IoC 컨테이너에서 빈객체를 생성하는 방식을 말합니다.
위 그림에서와 같이 기존 new로 생성하는 것을 외부에서 주입하는 방식으로 Spring에서는 Bean 생명주기를 관리하여 줍니다.
즉 IoC와 DI는 밀접한 관련이 있고 컨테이너에서 생명주기를 관리하여 준다는 것입니다.
이러한 DI는 3가지 의존성 주입 방식이 있습니다.
- 필드 주입
@RestController
public class BookController {
@Autowired
private BookService bookService;
}
가장 일반적이고 쉬운 DI 방법이라고 합니다.
- 수정자 주입
@RestController
public class BookController {
private BookService bookService;
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
}
생성당시 주입을 꼭 하지 않아도 됩니다. 즉, 원하는 호출 타이밍에 함수를 호출하여 주입시킬 수 있습니다.
- 생성자 주입
@RestController
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
}
가장 권장하는 DI방식이고 final을 지정이 가능하기에 Immutable하다고 합니다.
앞에서 Bean이라는 단어가 나왔는데요... 과연 Bean이란 무엇일까요?
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부릅니다.
우리가 알던 기존의 Java Programming을 생각하시면 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성후에 사용하였습니다. 하지만 Spring에서는 직접 new를 이용하여 생성한 객체가 아니라 Spring에 의하여 관리당하는 자바 객체를 사용합니다!
이렇게 Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 합니다