---
# System prepended metadata

title: Spring이란 무엇인가요? 그리고 장점은?
tags: [Spring]

---

# Spring이란 무엇인가요? 그리고 장점은?
- EJB의 문제점
    - 서비스가 구현해야 하는 실제 비즈니스 로직보다 EJB 컨테이너를 사용하기 위한 상투적인 코드들이 많다는 문제
        - 위의 문제가 발생한 이유는 비즈니스 로직에 특정 기술이 종속되어 있다는 것이다. -> 기술 침투
- 스프링의 기본 철학
    - 특정 기술에 종속되지 않고(기술 비침투적) 객체를 관리할 수 있는 컨테이너를 제공하는 것이 스프링의 기본 철학
        - 스프링은 **기술 비침투**가 핵심이다.
- 스프링 컨테이너
    - 스프링 컨테이너는 특정 클래스를 상속하거나 인터페이스를 구현하지 않는 평범한 자바 클래스(**POJO**, Plain Old Java Object)를 이용하여 **EJB의 기능을 유지하면서 복잡성을 제거하고, 객체들의 라이프 사이클을 관리**해준다.
    - Bean Factory, IoC Container 라고도 한다.
    - 주목적: 의존성 해결
- 스프링 컨테이너는 어떻게 의존성을 해결할까?
    - 스프링 컨테이너에서는 **의존성 주입** ( DI, Dependency Injection )을 통해 의존성을 해결한다.
    - 의존성 주입이란 사용자가 직접 new 키워드를 사용하여 객체를 생성하지 않고, **외부(컨테이너)에서 생성된 객체를 주입 받는 방식**을 말한다.

### IOC
- 스프링에서는 의존성 주입을 통해 객체 간의 의존성 문제를 해결하며, 객체의 생성과 소멸을 개발자가 관리하지 않고 스프링에서 관리하는데, 이러한 현상을 제어 역전 (IoC, Inversion of Control )이라 한다.    

### DI 와 IOC 차이
- DI는 의존관계를 어떻게 가질 것인가에 대한 문제고, 
- IoC는 누가 소프트웨어의 제어권을 갖고 있느냐의 문제다. IoC 컨테이너가 빈을 생성할 때 빈들 간의 의존관계를 DI를 통해 해결한다.
- DI는 IoC 사용을 필수로 요구하지 않는다는 점을 주의해야 한다.

### 스프링의 장점
- **IoC, DI 등 스프링의 특징**이 개발자가 전체적으로 신경써야할 부분에 대해서 스트레스를 줄여주고 **비지니스 로직에 집중**할 수 있기 때문에 **생산성 향상**된다.

--- 
### 스프링 개념
- 간단하게, JAVA 기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임 워크
- 구체적으로, **자바를 위한 오픈 소스 애플리케이션 프레임워크**로써 **자바 기반 엔터프라이즈 애플리케이션 개발**을 위해 다양한 서비스를 제공해주는 프레임워크이다. Spring Framework는 핵심 철학으로 다양한 애플리케이션을 만들기 위해 기본적인 틀을 구성해줌으로써 개발자가 **비즈니스 로직에 집중**하게 끔 도와준다.
    - 애플리케이션 프레임워크란?
        - 특정 계층이나 기술, 업무 분야에 국한되지 않고 **애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크**
        - 애플리케이션 프레임워크는 **애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 일차적인 목표**를 두는 프레임워크이다.

### 참고
#### 프레임워크와 라이브러리의 차이는 무엇인가요?
- 프레임워크(Framework)는 특정한 문제 해결을 위해 어느 정도의 뼈대 즉, 구조를 제공해주는 것을 의미한다.
- 라이브러리(Library)는 특정 기능 사용을 위한 도구나 함수들의 모음을 의미한다.
- 라이브러리와 프레임워크의 차이는 **프로그램의 전체 흐름에 대한 제어권에서 차이**가 발생한다.
    - 프레임워크는 프로그램의 전체적인 흐름을 자체적으로 가지고 있으며 프레임워크가 사용자의 코드를 호출해서 사용한다. 
    - 하지만 라이브러리는 사용자가 프로그램의 전체적인 흐름을 제어하며 사용자가 코드로써 라이브러리의 특정 기능을 직접 가져다 쓰는것을 의미한다.



###### tags: `Spring`