스프링은 자바 진영의 웹 프레임워크로서, 객체 지향 언어인 자바를 사용하여 웹 개발을 객체지향적이고 편리하게 개발할 수 있도록 도와주는 역할을 합니다.
스프링의 주요 특징
POJO 기반
POJO 란, Plain Old Java Object 로서 순수한 Java 객체를 의미합니다.
만약, 특정 객체가 POJO 가 아니라고 가정해 봅시다. POJO 가 아니라는 것은 외부의 모듈이나 라이브러리의 코드가 클래스 내부에 존재한다는 것이며, 만약 해당 모듈이나 라이브러리가 변경된다면 내부 코드를 모두 변경해 주어야 합니다. 즉, 객체가 외부 모듈이나 라이브러리에 강하게 결합되어 문제가 발생하는 것입니다.
스프링에서는 이런 현상을 막기 위해 DI/IOC, PSA, AOP 를 통해 POJO 를 기반으로 애플리케이션을 구성할 수 있도록 지원합니다.
IOC / DI
IOC / DI 는 각각 제어의 역전과 의존성 주입을 의미하는 단어 입니다.
제어의 역전은 프로그램의 실행 흐름을 개발자가 아닌 외부에서 제어하는 것을 의미하며, 스프링에서는 객체 생성과 관리에 대한 책임을 IOC 컨테이너를 통해 제공하는 것을 의미합니다.
의존성 주입은 필요한 의존 객체를 IOC 컨테이너를 통해 런타임에 동적으로 주입받는 것을 의미합니다.
기존 자바에서는 특정 객체에서 의존 객체를 직접 생성하거나, 외부에서 제공(생성자, 팩토리) 받는 방식으로 구성하였습니다. 하지만, 의존 객체를 직접 생성하는 방식은 해당 객체와 강결합되는 문제가 있었으며, 외부에서 제공받는 방식도 결국에는 개발자가 외부에서 팩토리나 생성자를 통해 직접 넣어주어야 한다는 문제가 있었습니다.
스프링에서는 이를 IOC/DI 를 통해 해결하였습니다. 특정 객체를 IOC 컨테이너에 등록하면, 해당 코드에서 의존 객체에 대한 정보가 없더라도 설정 정보에 의해 자동으로 의존 객체를 주입하여 객체를 생성하고, 사용할 수 있는 형태가 되어 컨테이너에 등록됩니다. 즉, 객체에 대한 생성과 관리 책임을 완전히 IOC 컨테이너에서 전담하게 됩니다.
AOP
AOP 란, 관점지향 프로그래밍을 의미합니다. 관점지향 프로그래밍에서는 특정 기능을 핵심 로직과 부가 로직으로 분리하고, 자주 사용되는 부가 로직을 공통화 함으로써 재사용할 수 있는 형태로 만들게 됩니다.
PSA
PSA 란, 특정 기술에 의존하지 않고 추상화 계층을 사용하여 일관되게 사용할 수 있는 것을 의미합니다.
웹 어플리케이션을 개발하기 위해서는 다양한 기능이 필요합니다. 예를 들어, 데이터베이스의 트랜잭션 기능을 사용해야 한다고 가정해 봅시다. 스프링에서는 @Transactional 어노테이션을 제공하여, JPA 를 사용하던, JDBC 를 사용하던, 일관된 방식으로 트랜잭션을 처리할 수 있도록 지원합니다.