Spring Framework Core

Spring Framework의 본질은 "제어를 개발자에게서 Framework로 넘기고(IoC), 개발자는 POJO로 비즈니스 로직에만 집중하게 한다"는 것이다. 이 페이지는 Library와 Framework의 근본 차이, 그리고 그 위에서 동작하는 Spring Triangle(IoC/DI, AOP, PSA)을 다룬다. Spring AOP는 AOP의 프록시 기반 구체적 구현이고, Spring Transaction은 DI + AOP로 선언적 트랜잭션을 구현한 사례이며, Spring MVC Controller는 PSA 기반 웹 계층이다.

Library vs Framework — 근본 차이: IoC

구분 Library Framework
제어 주체 개발자(내가 Library를 호출) Framework(Framework가 내 코드를 호출)
흐름 결정 개발자가 순서·시점 관리 Framework가 시작·호출 시점 결정
예시 HikariCP(new HikariDataSource()), Jackson, Lombok Spring, Django, Vue.js

Library vs Framework의 근본 차이는 IoC(제어의 역전)다. Library는 개발자가 호출하고, Framework는 Framework가 개발자 코드를 호출한다.[1] Tomcat이 doGet()을 개발자 대신 호출하는 것이 대표적 예다.

IoC(Inversion of Control) — 프로그램의 제어 흐름이 뒤바뀌는 것. 개발자가 작성한 코드를 직접 제어하는 것이 아니라, 외부(Framework)에 의해 제어가 이루어진다.[1:1]

Framework는 "반완성된 틀"로 공통 기능이 미리 구현되어 있고, 개발자는 정해진 규칙에 따라 비즈니스 로직만 작성한다.[2]

Spring Triangle — POJO 위의 3대 요소

flowchart TD
  POJO["POJO
(Plain Old Java Object)"] IoC["IoC / DI
(제어 역전 + 의존성 주입)"] AOP["AOP
(횡단 관심사 분리)"] PSA["PSA
(서비스 추상화)"] POJO --> IoC POJO --> AOP POJO --> PSA
요소 의미 핵심 역할
POJO 특정 환경/기술에 종속되지 않는 순수 Java 객체 유지보수 용이, 테스트 용이, 객체지향 설계 자유
IoC/DI 객체 생성·생명주기 관리를 Spring Container가 대신함. "어떻게 만들지" 대신 "무엇을 원하는지"만 선언 개발자는 비즈니스 로직에 집중
AOP 횡단 관심사(로깅·트랜잭션·보안·성능 측정)를 비즈니스 코드와 분리 모듈성 향상, 공통 기능 중복 제거
PSA 환경·세부 기술 변경과 무관하게 일관된 방식으로 기술 접근 MyBatis/JPA 어떤 ORM을 써도 트랜잭션 처리 동일

Spring 핵심 철학은 POJO 기반 개발이다 — 순수 Java 클래스만으로 엔터프라이즈 수준 개발이 가능하며, Spring 코드가 비즈니스 코드에 침투하지 않는 비침투적 설계를 따른다.[3]

이 구조가 비침투적 설계를 가능케 한다고 볼 수 있다 — Spring 코드가 비즈니스 코드에 침투하지 않으므로 비즈니스 로직은 순수 Java 객체로 남고, 프레임워크를 바꿔도 비즈니스 코드는 살아남는다는 것이 이 페이지의 종합이다.

EJB에서 Spring으로

실패 모드

관련

출처

테스트 질문


  1. Framework.md — "근본적 차이 : 제어의 역전 (Inversion of Control, IoC)", "프로그램의 제어 흐름 구조가 뒤바뀌는 것", "개발자가 작성한 코드를 직접 제어하는 것이 아니라, 외부(Framework)에 의해 제어가 이루어지는 것" ↩︎ ↩︎

  2. Framework.md — "완성된 애플리케이션이 아닌 "반완성된 틀"", "개발자는 정해진 규칙 (Convention)에 따라 비즈니스 로직 (핵심 코드)만 작성하면 됨" ↩︎

  3. Framework.md — "POJO (Plain Old Java Object) 기반 개발", "순수 Java 클래스만으로 엔터프라이즈 수준 개발 가능", "비침투적 설계 (Spring 코드가 비즈니스 코드에 침투하지 않음)" ↩︎

  4. Framework.md — "객체의 생성과 생명주기 관리를 Spring Container가 대신 해 줌", "DI: IoC를 구현하는 구체적인 방법", "객체가 필요로 하는 의존 객체를 외부 (Spring)에서 주입해줌" ↩︎

  5. Framework.md — "횡단 관심사 (Cross-Cutting Concerns)를 비즈니스 코드와 분리하는 기술이 AOP", 모든 메서드 실행 시간 측정·로그 기록·트랜잭션·보안 검사를 횡단 관심사 예시로 제시. ↩︎

  6. Framework.md — "환경과 세부기술의 변경과 관계없이 일관된 방식으로 기술에 접근할 수 있게 해주는 설계 원칙", "MyBatis나 JPA등 어떤 ORM을 쓰더라도 트랜잭션 처리는 동일" ↩︎

  7. Framework.md — "설정이 극도로 복잡 (XML 설정 파일만 수십 개)", "EJB 컨테이너 없이는 동작하지 않아 테스트 불가", "Rod Johnson이 2002년 저서 "Expert One-on-One J2EE Design and Development"에서 EJB 없이도 좋은 설계가 가능함을 증명", "2003년 이 코드를 기반으로 Spring Framework 공개 (오픈소스)" ↩︎ ↩︎