JAVA/Spring

[Spring] Spring Framework 특징과 구조

shinwoong_BE 2025. 5. 17. 16:54

Spring Framework 특징

    • IoC (제어의 역행, Inversion of Control)
      : 스프링은 IoC를 통해 애플리케이션을 구성하는 객체 간의 낮은 결합도를 유지한다. IoC는 말 그대로 개발자가 직접 생성하거나 제어하는 것이 아닌 스프링의 Spring Bean모듈에서 객체를 생성하고 제어하며 관리한다.
      // 기존 Java
      public class Car {
      
      	private Engine engine;
          
          public TV(Engine engine) {
          	this.engine = engine;
          }
      }
      
      // Spring
      @Component
      public class Car {
      	
          @Autowired
      	private Engine engine;
      }

    • DI(의존성 주입, Dependency Injection)
      : DI(의존성 주입, Dependency Injection)는 객체 간의 의존성을 크게 줄여준다는 것에서 의미가 있다. 객체 간의 의존성이 줄어든다는 것은 그만큼 유지 보수를 할 때 손이 많이 가는 것을 줄여준다는 의미이기도 하다.
      아래 코드처럼, 외부에서 생성자의 매개변수를 통해 객체를 넣어주는(주입) 방식이 DI(의존성 주입) 이다.
      생성자 주입, 필드 주입, setter 주입 방식이 있고, 의존 관계가 프로그램 실행 중에(런타임) 동적으로 변경되는 경우는 거의 없기 때문에 생성자 주입 방식이 권장된다.
      // DI 적용
      @Service
      public class MemberService {
      
      	private MemberRepository memberRepository;
          
          @Autowired
          public MemberService(MemberRepository memberRepository) {
          	this.memberRepository = memberRepository;
          }
      }

    • AoP(관점 지향 프로그래밍, Aspect Oriented Programming)
      : 스프링은 비즈니스 메서드를 개발할 때 사용하는 공통 로직을 외부의 독립된 클래스로 분리하여, 해당 기능을 프로그램 코드에 직접 명시하지 않고 선언적으로 처리할 수 있다. 이로 인해 응집도가 높은 비즈니스 컴포넌트를 만들 수 있으며, 유지 보수 또한 높일 수 있다. OOP의 문제점 또한 보완할 수 있다.

    • 컨테이너(Container)
      : 컨테이너는 특정 객체의 생성과 관리를 담당하고 객체 운용에 필요한 다양한 기능을 제공한다. 대표적으로 Servlet과 Servlet Container가 그 예인데, Servlet 객체를 생성하고 생명 주기를 관리해주는 게 Servlet Container라는 맥락에서 스프링 또한 애플리케이션의 운용에 필요한 객체의 생성과 의존 관계를 관리한다는 점에서 일종의 컨테이너라고 할 수 있다.
      또한, Spring Container에서는 자바 객체(Bean)의 생성부터 소멸까지 생명주기를 개발자 대신 관리해주는 일종의 컨테이너이다.

Spring Framework 구조

  • Core Container
    : 서블릿의 생명 주기를 관리하는 서블릿 컨테이너와 비슷하게 bean의 생성과 관리를 해주는 container 역할을 한다.
    1. Beans
      : Bean 모듈은 모든 bean 객체들의 생명 주기를 관리한다. Spring Bean이 갖고 있는 Bean Factory는 bean 인스턴스를 생성하거나 bean의 의존성 문제를 해결하는 역할을 담당하고 있다.
    2. Core
      : Core 모듈은 DI와 Ioc 패턴을 적용할 수 있는 기본적인 스프링 프레임워크 클래스들을 포함하고 있다. 어떤 타입의 스프링 애플리케이션을 빌드하든 항상 직간접적으로 이 Spring Core에 대한 종속성을 가진다.
    3. Context
      :  Spring Context는 Bean 객체들의 의존성 주입을 담당한다. 대부분의 경우 Spring 애플리케이션이 실행될 때, Spring Context 모듈이 실행되며 ApplicationContext로 불린다. (흔히 ApplicationContext.xml에 bean을 등록하여 의존성 주입해주는 역할을 해주는 모듈이라고 생각하면 편하다.)
    4. Expression language
      :  Runtime동안 object graph를 쿼링(querying)하고 실행하는데 도움을 준다.

  • Data Access/Integration
    : 데이터베이스, XML 또는 Messaging을 포함한 다양한 형태의 데이터에 접근하기 용이하도록 하는 모듈들의 모음.
    1. JDBC
      : JDBC는 Java JDBC API에 대한 추상화를 제공한다. 이러한 추상화와 함께 JdbcTemplate 또한 제공하여 데이터에 쉽게 접근 가능하도록 한다.
    2. ORM
      : Spring은 Hibernate, JPA와 같이 유명한 ORM 프레임워크를 제공해준다.

    3. Transaction
      : Spring Transactions Management API는 데이터베이스 뿐만 아니라 객체의 트랜잭션을 균일하게 관리해준다. 뿐만 아니라 프로그래밍 방식과 선언적 트랜잭션 관리를 모두 지원해준다.

  • Web(MVC / Remoting)
    : Web Application을 빌드할 때 사용하는 컴포넌트.
    1. Web Socket
      : 웹 애플리케이션에서 Web Sockets(웹 소켓)이란 클라이언트와 서버를 이어주는 터널이라고 생각하면 되는데 Spring Web Sockets은 이러한 Web Sockets을 구축하는데 도움을 준다. 
    2. Servlet
      : Servlet 모듈은 웹 애플리케이션 실행을 위한 MVC 구현이 포함되어 있다.
    3. Web
      : multipart file을 업로드하거나 IoC 컨테이너를 초기화 하는 등 기초적인 웹(Web)에 대한 부분들을 관리한다.