[스프링] 프레임워크란 무엇인가? ( 제어의 역전 (IOC) )
스프링은 '프레임워크(FrameWork)'이다.
프레임워크가 개발자의 작업을
도와준다는 말을 많이 들어봤을 것이다.
어떻게 도와준다는 말일까?
'프레임워크'란 무엇인가?
프레임워크를 사용하지 않으면
개발자의 소스코드가 프로그램의 흐름을 제어한다.
User user = new User("22231123l","민구","1111"); // user 객체 생성
ConnectionMaker connectionMaker = new AConnectionMaker(); // connectionMaker 객체 생성
UserDao userDao = new UserDao(connectionMaker); // userDao객체 생성 및 userDao와 connectionMaker 간의 관계설정
어떤 객체를 생성할지
어떤 객체와 어떤 객체를 관계설정 할지를
개발자가 소스코드로 작성한다.
프레임워크는 이런 흐름을 '역전'시킨다.
이를 제어의 역전(IOC)라 부른다.
제어의 역전 개념이 적용되지 않으면
프레임워크라 부를 수 없다.
그러므로 라이브러리, 툴킷, 엔진 등은 프레임워크가 아니다.
제어의 역전(Invension Of Control)
객체지향개발에서 중요한 개념은 아래와 같다.
어떤 객체를 생성하느냐?
어떻게 객체를 생성하느냐?
어느 객체와 관계를 설정하느냐?
그러므로 객체지향언어에서 '제어(Control)'란 위 3가지 권한을 이르는 말이다.
User user = new User("22231123l","민구","1111"); // user 객체 생성
ConnectionMaker connectionMaker = new AConnectionMaker(); // connectionMaker 객체 생성
UserDao userDao = new UserDao(connectionMaker); // userDao객체 생성 및 userDao와 connectionMaker 간의 관계설정
이처럼 소스코드가 객체의 생성과 객체간 관계설정을 능동적으로 해줄 수 있다. 그러나 이는 유지보수에 좋지 않다. 객체는 상황에 따라 언제든 바뀔 수 있기 때문이다. 소스코드는 '변화'가 발생했을 때, 그 영향이 최대한 덜 전파되도록 작성되어야 한다.
그러면 소스코드로 관계생성 및 관계설정을 해줄 때 왜 유지보수가 힘든지 알아보자.
클래스B와 클래스C와 클래스D는 인터페이스 I의 기능이 필요하여 구현클래스 A의 객체를 각각 생성하였다. 그런데 해당 모듈이 다른 회사로 넘어가면서 그 회사 환경에 맞게 구현클래스A를 구현클래스S로 대체되어야 한다고 가정해보자. 그렇다면 구현클래스A를 구현클래스S로 바꾸는 것 뿐만 아니라, 클래스B, 클래스C, 클래스D까지 모두 바꾸어야 한다.
이처럼 구현클래스A의 변화가 클래스 B,C,D로 전파되는 것이다. 이는 유지보수에 많은 비용을 소모하게 만든다. 그러나 소스코드로 이런 상황을 타개할 수 있다. "팩토리(Factory)" 클래스를 만드는 것이다.
팩토리(Factory) 클래스
팩토리 클래스는 객체의 생성과 관계설정을 한 곳에 모아 놓은 클래스이다. 간단히 말해서 구현클래스A의 객체 생성을 클래스B,C,D가 직접하지 않고 팩토리클래스가 구현클래스 객체를 생성한 후, 이를 클래스B,C,D에 '공급'하는 것이다. 한마디로 클래스B,C,D의 제어는 팩토리클래스로 넘어가게 된다. 클래스B,C,D는 팩토리클래스에 수동적 존재가 된다. 이를 제어의 역전(IOC)라 부른다.
그림과 같이, 팩토리 클래스가 구현클래스A의 객체를 생성한 후, return하여 클래스B,C,D에 공급한다. 만약 구현클래스A를 구현클래스S로 변경하는 경우, Factory 클래스에서 변경할 뿐, 변화가 다른 클래스로 전파되지 않는다.
정리
이처럼 각 클래스의 제어권한을 분산시키기보다 한 곳에 모아 제어하는 것이 유지보수에 유리하다. 여기서 더 발전하여 팩토리 클래스가 아닌, 제어 자체를 아예 소스코드에서 '분리'시키는 시도가 이루어졌는데, 그것이 바로 '프레임워크(FrameWork)'이다.
그러므로 프레임워크는 소스코드의 제어권을 가져가는 '제어의역전(IOC)'을 통해 어플리케이션의 흐름을 제어하여 개발자의 작업을 수월하게 진행되도록 돕는 도구이다.
참고문헌