Spring 이란?
Spring은 Java 기반의 웹 애플리케이션을 만들 수 있는 프레임워크이다. spring.io 사이트에서 확인하면 스프링 프레임워크는 현대 자바 기반의 엔터프라이즈 애플리케이션을 위한 프로그래밍 및 Configuration Model을 제공한다고 언급하고 있다.
Python을 이용한 Django, JS를 이용한 Node.js 기반의 웹 서버 개발과 같이 Java 개발자들은 Spring을 사용하여 웹 서비스를 만들 수 있다.
Spring의 구조는 아래와 같은 구조로 이루어져 있다.
Spring의 특징
☑️ Spring은 경량 컨테이너로 Java 객체를 직접 Spring 안에서 관리한다. 객체의 생성 및 소멸과 같은 생명 주기(Life Cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용한다.
☑️ Spring의 가장 큰 특징으로 IoC와 DI가 있다.
제어의 역전 (IoC, Inversion of Control)
일반적으로 Java 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성하고 조작하는 작업을 했다. (객체를 직접 생성하여 메소드 호출) 즉, 모든 작업을 사용자가 제어하는 구조였다. 예를 들어 A 객체에서 B 객체에 있는 메소드를 사용하려면 B 객체를 직접 A 객체 내에서 생성하고 메소드를 호출했다.
하지만 IoC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에 맡긴다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다. 즉, 사용자의 제어권을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다.
요약하자면 IoC란,
클래스 내부의 객체 생성 > 의존성 객체의 메소드 호출 이 아닌,
Spring에게 제어를 위임하여 Spring이 만든 객체를 주입 > 의존성 객체의 메소드 호출 구조이다.
Spring에서는 모든 의존성 객체를 Spring이 실행될 때 만들어주고 필요한 곳에 주입해준다.
의존성 주입 (DI, Dependency Injection)
어떤 객체(B)를 사용하는 주체(A)가 객체 (B)를 직접 생성하는게 아니라 객체를 외부(Spring)에서 생성해서 사용하려는 주체 객체(A)에 주입시켜주는 방식이다. 사용하는 주체(A)가 사용하려는 객체(B)를 직접 생성하는 경우 의존성이 높아진다. (변경사항이 있는 경우 서로에게 영향을 많이 줌) 하지만, 외부(Spring)에서 직접 생성하여 관리하는 경우에는 객체 A와 객체 B의 의존성이 줄어든다.
Spring Boot란?
Spring Framework는 기능이 많은 만큼 환경설정이 복잡한 편이다. 이에 어려움을 느껴 사용자들을 위해 나온 것이 바로 Spring Boot이다. Spring Boot는 Spring Framework를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 편하게 Spring을 사용할 수 있도록 돕는다. Spring Boot starter dependency만 추가해주면 바로 API를 정의하고, Tomcat과 같은 WAS가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있다.
(+) Framework VS Library
프레임워크와 라이브러리의 정확한 차이점은 무엇일까?
대충 알 것 같지만 정확히 어떤 차이점이 있는 다시 정리해봤다.
이전 정리했듯 Framework는 단지 미리 만들어 둔 반제품이나, 확장해서 사용할 수 있도록 준비된 추상 Library의 집합이 아니다. 제대로 이해하려면 Framework와 Library가 어떻게 다른지 알아야 한다.
Framework (프레임워크)
프레임워크는 뼈대나 기반구조를 뜻하고, 제어의 역전 개념이 적용된 대표적인 기술이다.
소프트웨어에서의 프레임워크는 '소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합' 이라 할 수 있으며, 완성된 어플리케이션이 아닌 프로그래머가 완성시키는 작업을 해야한다.
객체 지향 개발을 하게 되면서 통합성, 일관성의 부족이 발생되는 문제를 해결할 방법중 하나라고 할 수 있다.
Framework의 특징
- 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성되어 있다.
- 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의한다.
- 컴포넌트들은 재사용이 가능하다.
- 높은 수준에서 패턴들을 조작화 할 수 있다.
Library (라이브러리)
라이브러리는 단순 활용가능한 도구들의 집합을 말한다.
즉, 개발자가 만든 클래스에서 호출하여 사용, 클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식을 취하고 있다.
Framework와 Library의 차이점
라이브러리와 프레임워크의 차이는 제어 흐름에 대한 주도성이 누구에게/어디에 있는가에 있다.
즉, 어플리케이션의 Flow(흐름)를 누가 쥐고 있느냐에 달려 있다.
프레임워크는 전체적인 흐름을 스스로가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣으며 반면에 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것이라고 할 수 있다.
다시 말해, 라이브러리는 라이브러리를 가져다가 사용하고 호출하는 측에 전적으로 주도성이 있으며 프레임워크는 그 틀안에 이미 제어 흐름에 대한 주도성이 내재(내포)하고 있다.
프레임워크는 가져다가 사용한다기보다는 거기에 들어가서 사용한다는 느낌/관점으로 접근할 수 있다.
Reference
'Spring' 카테고리의 다른 글
[Spring] 🌱ResponseEntity란 / Spring Boot에서 Response하기 (0) | 2022.09.04 |
---|---|
[Spring] 🌱 AOP(Aspect Oriented Programming) (0) | 2022.07.24 |
[Spring] 🌱 HelloController (0) | 2022.07.22 |