WEB BE Repo/Spring

스프링이란?

조금씩 차근차근 2025. 3. 8. 18:28

스프링

스프링은 자바 기반의 애플리케이션 개발을 위한 경량 프레임워크로, 모듈 간 결합도를 낮추고 유지보수를 용이하게 하는 다양한 기능을 제공한다. 스프링은 핵심 기능인 IoC(Inversion of Control)와 DI(Dependency Injection)를 중심으로 작동하며, AOP(Aspect Oriented Programming)를 비롯한 여러 부가기능을 지원한다.

스프링 프레임워크의 주요 특징

스프링은 다음과 같은 주요 특징을 갖고 있다:

  • IoC와 DI를 통한 결합도 감소
    스프링 컨테이너는 객체의 생성, 관리, 라이프사이클을 담당함으로써 개발자가 직접 객체를 생성하고 의존성을 관리할 필요를 줄여준다. 이를 통해 컴포넌트 간의 결합도를 낮추고, 유지보수와 확장이 용이한 애플리케이션을 구현할 수 있다.
    • IoC (제어의 역전): 객체 생성과 라이프사이클 관리를 스프링 컨테이너가 담당함
    • DI (의존성 주입): 필요한 의존 객체를 외부에서 주입하여 클래스 간의 결합도를 낮춘다
  • 경량화된 컨테이너
    스프링은 경량화된 컨테이너를 제공하여 비즈니스 로직보다는 인프라 로직의 관리에 집중할 수 있게 한다. 개발자는 핵심 로직에 집중할 수 있으며, 컨테이너가 대신 객체의 생성, 연결, 초기화 등의 작업을 수행한다.
  • 리플렉션과 어노테이션 기반 설정
    스프링은 리플렉션과 어노테이션을 활용해 컴포넌트 스캔, 의존성 주입, 트랜잭션 관리, AOP 설정 등 다양한 핵심 기능을 빠르게 설정할 수 있다. 이를 통해 복잡한 XML 설정 없이도 간결하게 애플리케이션을 구성할 수 있다.
더보기

그럼 스프링 컨테이너는 일종의 God Object 아닌가?
> 아니다.

"God Object"는 보통 너무 많은 책임을 한 곳에서 몰아넣어, 코드 유지보수와 확장성에 문제를 일으키는 안티패턴을 의미한다. 스프링 컨테이너의 경우, 객체의 생성, 의존성 주입, 라이프사이클 관리 등 특정한 인프라 역할에 집중되어 있으며, 애플리케이션의 비즈니스 로직과는 명확히 분리되어 있다. 비즈니스 로직이 아닌 인프라 로직의 관리 책임을 대신 담당해주는데 집중하는 것이다.

IoC(제어의 역전)와 DI(의존성 주입)

스프링의 핵심 원리인 IoC와 DI는 다음과 같이 설명할 수 있다:

  • IoC (Inversion of Control)
    객체의 생성과 관리, 라이프사이클을 스프링 컨테이너가 담당함으로써, 전통적인 프로그래밍 방식에서 개발자가 직접 객체를 생성하고 관리하는 방식에서 제어권이 역전된다. 이로 인해 코드의 유연성과 테스트 용이성이 향상된다.
  • DI (Dependency Injection)
    DI는 IoC를 구현하는 한 가지 방법으로, 애플리케이션 내에서 필요한 의존 객체를 외부에서 주입해줌으로써 객체 간의 결합도를 낮춘다. DI를 활용하면 객체들이 서로 구체적인 클래스에 의존하지 않고 인터페이스나 추상화에 의존하게 되어, 코드의 재사용성과 유지보수성이 크게 개선된다.

스프링 Bean의 생명주기

스프링 컨테이너에 의해 관리되는 Bean은 다음과 같은 생명주기를 가진다. 이 과정은 Bean이 생성되고 소멸될 때까지의 전 과정을 체계적으로 관리하기 위함이다:

  1. 빈 정의 등록 (Bean Definition Registration)
    • 애플리케이션 설정 파일 또는 어노테이션을 통해 빈의 정의가 스프링 컨테이너에 등록된다.
  2. 빈 인스턴스화 (Instantiation)
    • 스프링 컨테이너가 빈 객체를 생성한다.
  3. 의존성 주입 (Dependency Injection)
    • 생성된 빈에 필요한 의존 객체가 외부에서 주입된다.
  4. 빈 초기화 전 처리 (Pre-Initialization)
    • BeanPostProcessor 인터페이스를 구현한 클래스에 의해 빈의 초기화 이전 단계에서 추가 작업이 수행된다.
  5. 초기화 콜백 (@PostConstruct)
    • 빈의 초기화 작업을 완료하기 위해 필요한 콜백 메서드가 호출된다.
  6. 빈 초기화 후 처리 (Post-Initialization)
    • 초기화 후 다시 한 번 BeanPostProcessor에 의해 후처리 작업이 수행된다.
  7. 빈 사용
    • 초기화가 완료된 빈이 실제 애플리케이션에서 사용된다.
  8. 빈 소멸 (Destruction)
    • 애플리케이션 종료 시, 빈의 소멸 전 콜백(@PreDestroy)이 호출되어 리소스 정리 등 필요한 마무리 작업을 수행한다.

이와 같이 스프링은 빈의 생성부터 소멸까지의 전 과정을 체계적으로 관리하여, 애플리케이션의 안정성과 효율성을 보장한다.

스프링 AOP(관점 지향 프로그래밍)

스프링 AOP는 횡단 관심사(Cross-Cutting Concern)를 효과적으로 분리하여 코드의 중복을 줄이고 유지보수를 용이하게 한다. 주요 특징은 다음과 같다:

  • 횡단 관심사의 처리
    로깅, 보안, 트랜잭션 관리 등 여러 계층에 공통적으로 적용되어야 하는 기능을 분리하여, 핵심 비즈니스 로직과는 독립적으로 관리할 수 있다.
  • 코드의 가독성과 관리 효율 향상
    공통 기능이 애플리케이션 전반에 분산되어 있으면 코드의 가독성이 떨어지고 유지보수가 어려워진다. AOP를 도입하면 이러한 기능을 한 곳에서 관리할 수 있어, 코드의 구조가 명확해지고 관리가 수월해진다.
  • 동적 프록시를 통한 적용
    스프링은 동적 프록시 기법을 사용하여, 런타임 시점에 필요한 기능을 주입한다. 이를 통해 기존 코드를 변경하지 않고도 공통 관심사를 적용할 수 있다.

스프링 vs. 스프링부트

  • 스프링 (Spring Framework)
    • 자바 기반 애플리케이션 개발을 위한 범용 프레임워크이다.
    • IoC, DI, AOP 등의 핵심 기능을 제공하며, 다양한 모듈을 통해 복잡한 엔터프라이즈 애플리케이션을 구축할 수 있다.
    • 설정 파일(XML 또는 자바 기반 설정)을 직접 작성해야 하므로 초기 설정과 구성이 상대적으로 복잡하다.
  • 스프링부트 (Spring Boot)
    • 스프링 프레임워크를 기반으로 한 확장 프레임워크로, 애플리케이션의 빠른 개발과 배포를 목적으로 한다.
    • 자동 구성(Auto-Configuration) 기능과 스타터(Starter) 의존성들을 제공하여 최소한의 설정으로 스프링 애플리케이션을 시작할 수 있다.
    • 내장 서버를 지원하여 별도의 서버 설정 없이 독립 실행형 애플리케이션을 쉽게 생성할 수 있다.