제어의 역전
객체는 자기 자신이 의존성을 제어하는 것이 아니라 객체를 사용하는 주체가 의존성을 제어하도록 한다는 개념이 제어의 역전이다.
(Spring Framework에서 '사용하는 주체'는 IOC컨테이너를 의미한다.)
예를 들어, 생성자 주입방식을 예를 들어보겠다. 클래스에서 의존성을 주입받을 때 new 로 인스턴스를 생성하여 의존성을 주입해주는 것이 아니라 생성자를 만들어 놓고 사용 시점에서 직접 의존성을 제어하도록 열어둔 것이 제어의 역전의 한 예이다.
* Spring Framework에서 쓰이는 IOC 컨테이너 = Application conetext
Application conetext는 Bean Factory를 상속받은 인터페이스이다. 객체를 Bean으로 등록/ 관리해주고 Bean간 의존성도 직접 관리해준다.
(Application Context 자체도 Bean으로 등록돼있다.)
중복되는 공통 기능을 한 곳에 모아 사용하는 개념 ex) 어노테이션
하나의 추상화(인터페이스)로 여러 서비스를 묶는 것
Spring Framework API가 제공하는 대부분의 라이브러리/API는 추상화되어 제공된다.
예를 들어, @Transaction 어노테이션을 사용하면 그 밑단에서 어떤 DB 접근 기술 (JPA, Mybatis ... )을 사용하든지 상관 없이 기술 독립적으로 동작한다. 구현체는 숨겨져 있고 추상화되어 제공된 인터페이스를 사용하여 코딩한다.
=> 객체지향프로그래밍 설계 5원칙 중 OCP (개방-폐쇄 원칙) 에 해당되는 내용