티스토리 뷰

IT/Spring

Spring Framework의 핵심 원리 - IoC, DI, AOP

Stv 2025. 5. 11. 19:03

목차


    1. Spring Framework란?

    Spring은 자바 기반의 엔터프라이즈 애플리케이션을 만들기 위한 경량화된 프레임워크이다.
    핵심 철학은 "객체 간의 결합도를 낮추고, 유연하고 확장 가능한 구조"를 만드는 것에 있다.

     

    핵심 철학을 구성하는 키워드

    • IoC (제어의 역전)
    • DI (의존성 주입)
    • AOP (관점 지향 프로그래밍)

    2. IoC - Inversion of Control (제어의 역전)

     

    📌 개념

    객체의 생성과 생명주기 관리를 "개발자가 아니라 컨테이너(Spring)가 대신하는 것"
    개발자가 제어하던 객체 생성/연결을
    -> 스프링 컨테이너가 역으로 제어한다는 개념

     

    ✅왜 중요한가?

    • 객체 간의 강결합을 제거
    • 애플리케이션 전체 흐름을 중앙 컨테이너가 제어
    • 테스트와 유지보수가 쉬워짐

    3. DI - Dependency Injection (의존성 주입)

     

    📌개념

    클래스가 의존하는 객체를 직접 생성하지 않고, 외부에서 주입받는 방식

     

    📍DI 방식 종류

    종류 설명
    생성자 주입 가장 권장되는 방식, 불변성과 테스트 용이성 확보
    필드 주입 간단하지만 테스트 불가능, 프레임워크 의존성 강함
    Setter 주입 선택적 의존성 주입 시 사용 가능

     

    🔎예제

    ✅나쁜 예 (직접 생성)

    class OrderService {
        private final OrderRepository repo = new OrderRepository(); // DIP 위반
    }

     

    ✅좋은 예 (DI 적용)

    class OrderService {
        private final OrderRepository repo;
    
        public OrderService(OrderRepository repo) {
            this.repo = repo; // DIP 만족
        }
    }

     

    • 객체를 스프링이 대신 주입해줌
    • 구현게 교체가 쉬움, 테스트에서도 Mock 주입 가능

    4. AOP - Aspect-Priented Programming (관점 지향 프로그래밍)

     

    📌개념

    핵심 로직과는 별개인 공통 관심사(로깅, 트랜잭션, 보안 등)를 별도로 분리하여 모듈화하는 기법

     

    📍주요 용도

    • 로깅
    • 트랜잭션 처리
    • 예외 처리
    • 보안 검사
    • 성능 측정

    ✅AOP 적용 전

    public void doBusiness() {
        System.out.println("[LOG] 시작");
        // 핵심 로직
        System.out.println("[LOG] 종료");
    }

     

    ✅AOP 적용 후

    @Around("execution(* com.example..*(..))")
    public Object log(ProceedingJoinPoint joinPoint) {
        // 로깅 로직
        return joinPoint.proceed(); // 핵심 로직 실행
    }
    • 핵심 로직은 깔끔하게 남고, 공통 기능은 별도 관리

    🔁5. Spring Container와 Bean 관리 흐름

    ✅IoC 컨테이너 작동 흐름

    1. 애플리케이션 실행 시, 스프링 컨테이너 (ApplicationContext) 생성
    2. @Component, @Service, @Repository 등 어노테이션 기반 Bean 등록
    3. 의존 관계를 파악하여 자동 주입 (DI)
    4. Bean 생성 -> 초기화 -> 사용 -> 소멸까지 생명주기 관리

    6. Spring 핵심 개념과 SOLID 연결

    SOLID 원칙 Spring 기능과의 연결
    SRP 컴포넌트별 역할 분리 (@Service, @Repository)
    OCP 인터페이스 기반 주입 + @ComponentScan
    LSP 다형성 기반 구조 설계, Bean 교체 시 안정성 유지
    ISP 역할에 따른 Bean 분리 (@Qualifier 등 활용)
    DIP 의존성 주입 구조 = DIP 실현

     

    ✅ 마무리 요약

    • IoC는 제어의 주체를 스프링에게 넘기는 것
    • DI는 의존 객체를 외부에서 주입받아 유연성과 테스트성을 높이는 구조
    • AOP는 핵심 로직과 부가 기능을 분리하여 유지보수성을 향상
    • Spring은 SOLID 원칙을 자연스럽게 실현하도록 설계된 프레임워크

    🔜 다음 포스팅에서는 Spring Bean과 생명주기 - Bean의 생성부터 소멸까지, 내부에서는 어떤 일이 벌어질까? 라는 주제로 내용을 다뤄보려고 한다.