스프링 프레임워크에서는 스프링 컨테이너라고 불리는 스프링 런타임 엔진을 제공한다. 스프링 컨테이너는 객체를 생성에서 소멸까지의 라이프 사이클을 관리하고 있다, 이때 스프링 컨테이너는 객체의 라이프 사이클 관리를 위해 IoC/DI를 사용한다.
단어 그대로 프로그램의 제어 흐름 구조가 바뀌는 것이라 할 수 있다.
일반적인 프로그램의 흐름과는 다르게 객체가 언제 생성되고 사용되는지도 알 수 없을뿐더러 객체의 제어의 권한 또한 개발자가 아닌 다른 곳 즉, 스프링 컨테이너에 있다.
그렇기 때문에 IoC를 사용하면 설계가 깔끔해지고 유성이 증가하며 확장성이 좋아진다.
앞서 이야기한 스프링 컨테이너가 제어하여 만들고 관계를 부여하는 객체를 빈(Bean)이라고 부른다.
스프링 컨테이너 내부에서 빈의 제어를 담당하는 객체를 빈 팩토리(Bean Factory)라고 부른다.
그러나 일반적으로는 빈 팩토리의 기능을 모두 포함하고 있는 애플리케이션 컨텍스트(Application Context)를 사용한다.
애플리케이션 컨텍스트는 빈 팩토리를 확장했다고 할 수 있는데 빈 팩토리가 빈의 생성과 제어의 관점에서만 이야기하는 것이라면 애플리케이션 컨텍스트는 스프링이 제공하는 어플리케이션 지원 기능을 모두 포함해서 이야기하는 것이라고 보면 된다.
컨테이너에 의해 생성되는 빈은 싱글턴(Singleton)패턴으로 만들어진다.
서버 환경에서는 수백수천 번의 요청을 받아 처리해야 하는데 그때마다 객체를 새로 만들어 사용한다면 서버가 감당하기 힘들것이다, 의존성 주입 DI(Dependency Injection)은 스프링 IoC기능의 대표적인 동작원리이다.
컨테이너에 의해 객체를 사용할 수 있도록 생성 후 메서드(생성자, setter함수)를 통해 주입해 주는 것과 같다고 해서 이를 의존성 주입이라고 부른다.
기존의 비즈니스 로직 외 작성해야 하는 코드를 별도로 분리함으로써 개발자가 좀 더 비즈니스 로직에만 집중해서 처리할 수 있는 방법을 제공한다.
인터넷 쇼핑몰을 예로 들자면 인터넷 쇼핑몰에서 물건을 하나 구매하기 위해선 장바구니에 물건을 담고 담은 후에는 구매를 해야 한다. 그러나 일반적으로는 이러한 과정은 로그인을 반드시 선행해야 이루어지는 절차이다. 물건을 장바구니에 담고 구매하는 것이 원래의 목적이지만 로그인이라는 사전 절차없이는 원하고자 하는 일을 할 수가 없다.
여기에서 로그인이라는 과정이 궁극적 목표는 아니지만 다른 목표의 반드시 해야 하는 공통된 작업이라 할 수 있다. 이런 행위를 횡단 관심사 라고 한다.
다시 돌아와서 장바구니에 물건을 담고, 구매하는 작업인 핵심적인 비즈니스 로직을 개발자가 몰두할 수 있고 나머지 부가적인 개발, 영향을 미치는 객체로부터 횡단 관심사 분리를 하는 것이 AOP이다.