#1. Spring Framework 정의
스프링 프레임워크(Spring Framework)란 자바(Java) 기반의 애플리케이션 프레임워크로 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공합니다. 쉽게 말해 Java로 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용할 수 있도록 돕는 도구입니다
▶ 엔터프라이즈급 개발은 기업 환경을 대상으로 하는 개발을 뜻합니다. 네이버나 카카오톡 같은 대규모 데이터를 처리하는 환경을 엔터프라이즈 환경이라고 부릅니다. 스프링은 이 환경에 알맞게 설계되어 있어 개발자는 애플리케이션을 개발할 때 많은 요소를 프레임워크에 위임하고 비즈니스 로직을 구현하는데 집중할 수 있습니다.
스프링의 핵심가치는 아래와 같습니다.
어플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것
#2. Spring Framework의 특징
Spring Framework의 특징은 크게 3가지로 분류할 수 있습니다.
1) Ioc (Inversion of Control : 제어 역전)
- Spring Framework는 기존 Java 개발 방식과 다르게 동작합니다. Ioc를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 스프링 컨테이너(Spring Container)에 위임합니다. 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 뒤에 나올 DI (Dependency Injection : 의존성 주입), AOP(Aspect-Oriented Programming : 관점 지향 개발) 등이 가능해집니다.
2) DI (Dependency Injection : 의존성 주입)
- Ioc(Inversion of Control : 제어 역전)의 제어 역전 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미합니다.
- Spring Framework에서는 의존성을 주입하는 방법은 3가지가 있습니다. 그리고 스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식입니다. 이는 다른 방식과 달리 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 때문입니다.
> 생성자를 통한 의존성 주입
> 필드 객체를 통한 의존성 주입
> Setter 메서드를 통한 의존성 주입
3) AOP(Aspect-Oriented Programming : 관점 지향 개발)
- Spring Framework의 아주 중요한 특징으로써 AOP는 관점을 기준으로 묶에 개발하는 방식을 의미합니다. 여기서 관점(Aspect)란 어떤 기능을 구현할 때 그 기능을 '핵심 기능'과 '부가 기능'으로 구분해 각각을 하나의 관점으로 보는 것을 의미합니다. 그럼 '핵심 기능'은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능이고, '부가 기능'은 Log, Trasaction과 같이 핵심 기능이 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행하기만 하면 되는 기능입니다.
- AOP는 여러 비즈니스 로직에서 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 말합니다. 이러한 AOP를 구현하는 방법은 3가지가 있습니다. 이 가운데 스프링은 디자인 패턴 중 하나인 Proxy(프락시) 패턴을 통해 AOP 기능을 제공하고 있습니다.
> 컴파일 과정에 삽입하는 방식
> 바이트 코드를 메모리에 로드하는 과정에 삽입하는 방식
> Proxy(프락시) 패턴을 이용한 방식
- Spring Framework AOP의 목적은 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는데만 집중할 수 있게 도와주는 것입니다.
Reference
1. 장정우 [스프링부트 핵심 가이드]
'Development > Web' 카테고리의 다른 글
[Web] Spring의 Dispatcher Servlet의 정의와 기능 (0) | 2022.09.24 |
---|---|
[Web] Spring Framework vs Spring Boot (0) | 2022.09.24 |
[Web] 크로스 도메인 (0) | 2022.09.23 |
[Web] 뷰 컴포넌트 통신 (0) | 2022.09.19 |
[Web] 뷰 컴포넌트 (0) | 2022.09.18 |