Spring은 객체 지향적인 애플리케이션 개발을 지향하는 프레임워크이다. 객체 지향 설계의 핵심으로 POJO 프로그래밍을 지향하며, 이를 구현하기 위해 IoC/DI, AOP, PSA 개념을 도입한다.
IoC/DI는 객체들의 의존성을 Spring container이 주입하여 애플리케이션의 주도권이 역전되는 것을 의미한다. 의존성을 주입받은 객체들은 컨테이너의 관리를 받게 되므로, 의존성을 관리하는 주체가 개발자가 아닌 컨테이너가 된다. 의존성 주입을 통해 객체 간의 느슨한 결합을 달성하게 된다. 객체 간의 낮은 결합도는 다른 클래스의 로직을 건드리지 않고 유연하게 기능을 추가할 수 있게 한다.
AOP는 공통 관심사 tiny cross-cutting concerns를 핵심 관심사(core concerns)로부터 분리하여 따로 관리하는 프로그래밍 기법이다. OOP에서 각자 다른 책임과 정보를 가진 객체(Object)를 통해 모듈화를 하는 것처럼, AOP에서는 애플리케이션 전반에 걸쳐 적용될 수 있는 공통의 관심사를 정의하고 이를 관점(Aspect)으로 모듈화한다. 이로써 애플리케이션 내 여러 객체들에 나타날 수 있는 코드의 중복을 줄여 각 객체가 핵심 로직에 집중할 수 있게 해준다. OOP를 보완하기 위해 적용되는 프로그래밍 기법이다.
PSA는 고레벨의 클래스, 즉 추상화된 클래스나 인터페이스에 관심을 둠으로써 구현체가 쉽게 바뀔 수 있도록 한다. 특정 서비스에 의존하는 컴포넌트는 해당 서비스의 구체적인 내용은 알 필요 없이 해당 서비스에만 의존성을 가지면 되고, 구현은 서비스를 구현하는 구현체를 통해 관리하면 된다. 구현 객체는 항상 구현 대상인 인터페이스를 참조하도록 하여 생성자 주입 시에 인자로 넘겨주면 된다.
AOP : Aspect-Oriented Programming
‣