스프링의 가장 큰 특징은 POJO 프로그래밍을 지향한다는 점이다.
그렇다면 생기는 의문은 "스프링은 어떻게 POJO 중심의 설계를 구현하는가"다.
답은 IoC/DI, AOP, PSA다.

1. IoC / DI (Inversion of Control / Dependency Injection)
자바는 객체지향 언어다.
객체지향에서 가장 중요한 것은 객체 간의 관계(의존성)다.
class A {
B b = new B();
}
class B {
public void example() {
...
}
}
이 경우, A는 B에 의존한다.
그리고 이 의존성은 개발자가 직접 new 키워드로 생성했다.
문제 상황 : 변화에 취약한 코드
문제는 여기서 발생한다.
만약 B 대신 C를 사용해야 한다면, A의 코드를 아래처럼 수정해야 한다.
class A {
C c = new C();
}
class C {
public void example() {
...
}
}
더 큰 문제는 B를 사용하는 클래스가 수십, 수백 개라면 모두 수정해야 한다.
이 구조는 변화에 매우 취약하다.
해결 방법 : 객체 생성을 외부로 위임
class A {
private final Interface i;
public A(Interface i) {
this.i = i;
}
}
A는 이제 B인지 C인지 모르고, 단지 Interface 타입만 알고 있다.
A는 이제 프레임워크를 몰라도 되고, new를 직접 호출하지 않아도 되고, 단지 인터페이스에만 의존한다.
이 때 B 또는 C를 생성해서 A에게 전달하는 것이 스프링 컨테이너다.
IoC와 DI의 차이
- IoC (Inversion of Control) : 객체 생성과 의존성 결정의 제어권이 개발자에서 스프링으로 넘어감.
- DI (Dependency Injection) : 스프링이 객체를 생성하고 생성자를 통해 주입함.
즉, IoC는 개념이고, DI는 그 구현 방식이다.
2. AOP (Aspect Oriented Programming)
애플리케이션에는 두 종류의 관심사가 존재한다.
핵심 관심사 (Core Concern)
- 주문 생성
- 회원 가입
- 결제 처리
비즈니스 로직 그 자체다.
공통 관심사 (Cross-cutting Concern)
- 로깅
- 보안
- 트랜잭션
- 예외 처리
모든 기능에 공통적으로 적용되는 기능이다.

스프링은 프록시를 사용해 핵심 로직은 그대로 두고, 외부에서 공통 로직을 삽입한다.
이처럼 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직에서 분리해내는 것이 AOP(관심 지향 프로그래밍)다.
3. PSA (Portable Service Abstraction)
백엔드 개발에서 데이터베이스는 필수다.
하지만 데이터베이스는 다양하다.
그리고 그 데이터베이스마다 접근 방식이 다르다면, DB를 변경할 때마다 코드를 전면 수정해야 한다.
스프링은 특정 기술을 직접 사용하지 않고, 표준 인터페이스를 제공한다.
JDBC와 Spring Data JPA가 대표적이다.
예를 들어 JDBC는 DB 회사가 제공하는 드라이버가 JDBC 인터페이스를 구현하고, 개발자는 JDBC API에 맞춰 코드를 작성한다.
따라서 DB 변경 시에는 드라이버만 교체하면 되고, 코드는 그대로 유지된다.

PSA는 특정 기술을 추상화하여 일관된 방식을 사용하게 만든다.
덕분에 애플리케이션은 특정 DB에 강하게 결합되지 않고, 추상화에 의존하게 된다.
4. 정리 : 스프링이 POJO 프로그래밍을 가능하게 하는 구조
| 기술 | 해결하는 문제 | POJO 유지 방식 |
| IoC / DI | 객체 간 강한 결합 | 생성 책임을 컨테이너로 이동 |
| AOP | 공통 로직 중복 | 비즈니스 로직과 분리 |
| PSA | 기술 종속성 | 추상화에 의존 |
5. 결론
스프링은 단순히 "편리한 프레임워크"가 아니다.
그 핵심은 "객체지향 원칙을 지키면서도 대규모 애플리케이션을 유연히 만드는 기술 집합"이다.
- IoC/DI는 객체 관계를 유연하게 만들고
- AOP는 공통 기능을 분리하며
- PSA는 기술 종속성을 줄인다.
이 세가지를 결합하여 스프링은 POJO 기반의 확장 가능하고, 유지보수 가능한 애플리케이션을 만드는 것이 가능해진다.
참고 출처
- 스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법
Powered By. ChatGPT
'Backend' 카테고리의 다른 글
| [Spring] Spring 이해하기(1) - POJO, Java Bean, Spring Bean (0) | 2026.02.17 |
|---|---|
| [Backend] Spring Data JPA 환경 내, @Lob + ByteArray 조합으로 인한 bytea / oid 혼동 문제 (1) | 2026.02.12 |
| [Backend] Kotlin JDBC 연결 유형 정리 (0) | 2026.02.02 |
| [Backend] 9주차 내용 정리 (0) | 2026.01.22 |
| [Backend] Kotlin 기반 HTTP 서버 구현 (0) | 2026.01.16 |