Spring 이란?
- 자바 기반의 엔터프라이즈 애플리케이션 개발을 쉽게 해주는 오픈소스 프레임워크
- 목표는
객체지향적 설계 + 개발 생산성 + 유지보수성 향상
Spring이 등장한 이유
- 과거 EJB(Enterprise Java Bean)의 복잡한 설정, 무거운 실행 구조를 대체하기 위해 등장
- POJO 기반 경량 컨테이너로, 단순한 객체 관리 및 DI 지원을 핵심으로 함
Spring의 핵심 개념
- POJO
- 특별한 상속/규약 없이 순수 자바 객체로 구성
- IoC/DI
- AOP
- 로깅, 보안, 트랜잭션과 같은 공통 기능을 모듈화하여 하나의 책임을 가지게 하는 기법
- PSA
- 스프링이 제공하는 일관된 추상화 계층을 통해 개발자가 특정 기술(JDBC, JMS, 트랜잭션 등)에 종속되지 않고 하나의 통일된 방식으로 서비스에 접근할 수 있도록 한 개념
Spring Container 개념
- 스프링에서 의존관계 주입을 이용하여 애플리케이션을 구성하는 여러 빈(Bean)들의 생명주기(Lifecycle)와 애플리케이션의 서비스 실행 등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것을 부르는 말이다.
- 컨테이너에 적절한 설정만 있다면 프로그래머의 개입 없이도 작성된 코드를 컨테이너가 빈을 스스로 참조한 뒤 알아서 관리한다.
- 스프링 컨테이너를 언급할때는 빈 팩토리(BeanFactory) 와 애플리케이션 컨텍스트(ApplicationContext) 두 가지로 다룬다.
BeanFactory
- 스프링 컨테이너의 기본적인 형태
- Bean의 생성 및 의존성 주입만 담당
- 지연 로딩 방식 사용 → 요청이 들어올 때 Bean 생성
- 기능이 단순해서 거의 사용하지 않음
ApplicationContext
- BeanFactory를 확장한 상위 컨테이너
- Bean 관리뿐 아니라 다음 기능을 추가로 제공
- 국제화(i18n)
- 이벤트 리스너
- 환경 설정(Profile)
- AOP / 트랜잭션 관리
- 즉시 로딩 방식 사용 → 컨테이너 초기화 시 모든 Bean 생성
- 대부분의 프로젝트에서 사용하는 표준 컨테이너
스프링 공식 문서에서는 두 컨테이너 중 특별한 이유가 없다면 ApplicationContext를 사용해야 한다고 나와있다.
이유는 BeanFactory의 모든 기능을 포함하는 것은 물론이고 추가 기능들을 제공하기 때문이다.
1. 설정 파일(@Configuration or XML) → Bean 정의 읽음
2. Container 생성 (ApplicationContext)
3. Bean 등록 및 의존성 주입 (DI)
4. Bean 초기화 → 서비스 실행
5. 애플리케이션 종료 시 Bean 소멸
스프링 프레임워크의 주요 모듈들

- 코어 :
DI, IoC에 대한 핵심 기능 제공 (Bean, Bean Factory, Application Context)
- 횡단 관심 :
AOP에서 핵심기능 외에 중간중간 삽입되어야 할 기능들
- 웹 : 웹 서비스를 위한 기능들
- 비즈니스 : 비즈니스 로직을 실행, 선언적 트랜잭션 관리
- 데이터 : 데이터베이스 및 외부 인터페이스와의 상호작용
흐름
개발자 코드(POJO)
↓
Spring Container (ApplicationContext)
↓
Bean 등록 & 관리 (IoC)
↓
의존성 주입 (DI)
↓
공통 관심사 처리 (AOP)
↓
애플리케이션 실행 (MVC 구조 기반)