필자가 배운 내용을 정리하고자 함에 의의를 뒀으니 비유적인 표현이 많고 개념을 정의함에 있어서 정석적인 정의가 아님을 인식해주었으면한다.
피드백 절대환영!!!
말 그대로 frame(틀 안에서)work(동작하다) -> 틀 안에서 움직인다는 뜻이다.
이 말이 뭐냐면, 특정 역할을 하기 위해(웹 서버의 역할을 하기 위해) 그와 관련된 기능을 모아두었고 이 기능들을 틀 안에 정의해두었다는 뜻이다.
말을 좀 어렵게 한 것 같은데.. 정확한 표현은 아니지만, 그냥 웹 서버 개발을 하는데 필요한 기능들을 묶어둔 패키지라고 생각하면 편할 것이다.
오픈소스라는말은 무료여서 우리가 마음껏 갖다 쓸 수 있다는 말이고, 우리가 사용하면서 불편한 부분들을 개선시켜 오픈소스의 프로젝트에 기여할 수 있다는 말이다.
이렇게 되면 배포한 사람도 자신의 기술을 집단지성으로 개선할 수 있어 좋고, 무료로 사용하는 사용자들도 좋다.(누이좋고 매부좋고~)
IoC란 Inversion of Control(제어의 역전)라는 뜻인데, 제어의 역전이라는게 무슨 의미일까?
요약하자면 제어권이 스프링에게
아래의 자바 코드를 보자
public void make(){
의자 s = new 의자();
}
public void use(){
의자 s = new 의자();
}
다음과 같은 자바 코드가 있다고 할 때, make 메서드의 참조변수 s와 use 메서드의 참조변수 s는 같아보이지만 다르다.
이게 무슨 말이냐? 각 메서드 안에서 new 키워드를 통해 각각의새로운 인스턴스를 생성했고, 생성되는 인스턴스는 heap메모리에 올라가기 때문에 다른 메모리 공간을 가리킨다.
(즉 make 메서드를 호출하면 s1 인스턴스가 heap메모리에 올라가고, use 메서드를 호출하면 s2 인스턴스가 heap 메모리에 올라간다.
그리고 참조변수 s1과 s2는 각각 다른 heap의 메모리 공간을 가리킨다.)
또한 이 메서드가 실행되는 순간에만 메모리에 존재한다.
즉, use 메서드 내에서 make 메서드 내의 인스턴스 s1을 사용하기 힘들고 반대로 make 메서드 내에서도 use 메서드 안의 s2를 사용하기 힘들다.
그러나 우리는 s1을 use 메서드 내에서 사용하고 싶고, 그 반대의 경우도 마찬가지 일때가 있을 것이다.
그래서 스프링 컨테이너는 Object들을 모두 스캔해 heap 메모리에 올려 관리한다.
스프링 내의 싱글톤 스코프라는 기능을 사용해 이 빈들을(쉽게 말해 인스턴스) 다른 클래스의 메서드 내에서도 사용할 수 있도록 한다
최종적인 결론은, 본래 코드는 개발자가 작성하므로 각 빈(인스턴스)들의 제어권이 개발자에게 있어야하지만 스프링을 사용하는 한 이 빈들의 제어권은 스프링에게 있다! 라는 말이 되시겠다.
DI란 Dependency Injection(의존관계 주입)을 의미한다.
위의 예제에서 빨간 박스를 각각 다른 클래스의 메소드들이라고 가정하고 만약 각각의 클래스의 생성자나 메서드에서 의자라는 Object가 호출이 됐다고 할 때, 스프링 컨테이너가 관리하는 빈(의자 인스턴스)을 생성자나 메서드에 주입해주는 것을 DI라고 한다.