Spring은 자바 기반의 경량 애플리케이션 프레임워크로, 객체지향 설계 원칙에 기반하여 유연하고 확장 가능한 시스템을 개발할 수 있도록 도와줍니다.
본 글에서는 Spring의 특징, 구조, 동작 방식, 그리고 핵심 개념들을 정리해봅니다.
| 특징 | 설명 |
|---|---|
| 경량 프레임워크 | 필요한 기능만 선택적으로 사용 가능, 빠르고 가볍다 |
| POJO 기반 개발 | 순수 자바 객체로 구성되어 있어 프레임워크에 종속되지 않음 |
| IoC/DI 지원 | 객체 생성 및 의존성 주입을 스프링 컨테이너가 관리 |
| AOP 지원 | 공통 관심사(로깅, 트랜잭션 등)를 핵심 로직과 분리 |
| MVC 아키텍처 | 웹 애플리케이션을 구조적으로 관리 가능 |
| 테스트 용이성 | 컨테이너 없이도 단위 테스트가 가능함 |
POJO는 Java EE를 사용하면서 등장한 개념으로, 플랫폼에 종속적인 무거운 객체 대신,
getter/setter만 가진 단순하고 순수한 자바 객체를 의미합니다.
POJO (Plain Old Java Object)
간단하게 말해서 필드와 Getter, Setter와 같은 기본 기능만을 갖는 기본 객체를 의미한다.
자세히는 특정 "기술"에 종속되 있는 상태로 개발하지 않는 개념을 위해 등장한 언어이다.종속성으로 인해 시스템 업그레이드, 모듈 교체와 같은 상황에서 많은 불편함이 있었기에 POJO라는 개념이 탄생했다.
(특정 기술 == Framework)
public class User {
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
Spring Framework
├── Core Container (IoC/DI)
│ ├── Beans, Core, Context
├── AOP (Aspect-Oriented Programming)
├── Data Access (JDBC, ORM)
├── Web (Spring MVC, WebSocket)
├── Test (JUnit, Mockito)
[Client 요청]
↓
DispatcherServlet (Front Controller)
↓
HandlerMapping → Controller 찾기
↓
Controller → Service → Repository
↓
DB 처리 후 View 반환
↓
ViewResolver → 사용자 응답 렌더링
DispatcherServlet: 모든 요청의 진입점Controller: 요청 처리 메서드 정의Service: 비즈니스 로직 담당Repository: 데이터베이스 접근🧩 1) 설정
개발자가 @Component, @Service, @Controller 등의 어노테이션을 클래스에 부여하거나
applicationContext.xml 또는 Java Config(@Configuration)를 통해 Bean을 등록합니다.
⚙️ 2) Bean 등록 및 초기화
Spring 컨테이너는 시작 시, 설정된 클래스들을 스캔하여 Bean으로 등록하고 초기화합니다.
🔄 3) 의존성 주입 (DI)
@Autowired, @Inject, 생성자 등으로 필요한 의존 객체를 자동 주입합니다.
🌀 4) 요청 처리 (MVC 구조 기준)
클라이언트 → DispatcherServlet → HandlerMapping → Controller → Service → Repository → DB
다시 응답을 ViewResolver를 통해 View로 전달
@Service
public class MyService {
private final MyRepository repo;
@Autowired
public MyService(MyRepository repo) {
this.repo = repo;
}
}
@Aspect
@Component
public class LogAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("호출된 메서드: " + joinPoint.getSignature());
}
}
객체 생성 → 의존성 주입 → 초기화 → 사용 → 소멸
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("초기화");
}
@PreDestroy
public void destroy() {
System.out.println("소멸");
}
}
Spring은 단순한 웹 프레임워크를 넘어, 객체지향 설계, 유연한 구조, 생산성 높은 개발 환경을 지원합니다.
자바 개발자라면 반드시 이해하고 익혀야 할 필수 기술이며,
POJO, DI, AOP, MVC와 같은 스프링의 철학과 구조를 이해하면 실무에서도 높은 생산성과 안정성을 확보할 수 있습니다.