[Spring] What is Spring?

JE·2023년 9월 15일

SPRING

목록 보기
2/4

Spring 의 생태계 및 등장 배경

Spring 이란, 하나의 기술이 아닌 Spring Project 들의 모임입니다.
이 모든 Spring Project 는 Spring Framework 를 기반으로 동작합니다.
Spring Framework 는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로써 간단히 스프링(Spring)이라고도 불립니다. 이 Spring Framework 가 Spring 생태계의 핵심이라고 할 수 있습니다.

https://spring.io/projects

Spring 생태계가 커짐에 따라 Spring Framework 가 제공하는 기능들이 많아지면서 이를 사용하기 위한 많은 어려움이 발생하게 됩니다. 이런 어려움을 해결하기 위해 등장한 것이 Spring Boot 입니다.

Spring 이전에는 EJB(Enterprise Java Beans) 라는 프레임워크가 존재했습니다.

목적 : 비즈니스 로직과 애플리케이션 기술의 분리 → 편리한 애플리케이션 개발
실제 : 너무 비싸고 비즈니스 로직보다 EJB 를 사용하기 위한 코드가 너무 많다는 단점 존재
EJB 에 종속적이고 의존적인 개발로인해 기존 JAVA 의 장점인 객체 지향을 살리지 못했습니다.

EJB의 문제점 지적하여 책을 출간한 Rod Johnson(로드 존슨) 에게 Juergen Hoeller(유겐 휠러), Yann Caroff(얀 카로프) 가 오픈 소스 프로젝트를 제안하여 Spring 이 등장하게 되었습니다.


Spring

스프링의 핵심 = 좋은 객체 지향 애플리케이션을 개발할 수 있도록 돕는 프레임워크

스프링은 자바 언어 기반의 프레임워크 이기 때문에 자바의 가장 큰 특징인 객체 지향의 특징을 강력하게 살려냅니다.

좋은 객체 지향 애플리케이션 ?

프로그램을 단순하게, 유연하게, 또 변경에 용이하게 → 역할과 구현을 명확히 분리

자바 언어의 다형성을 활용하여 객체 설계시 역할(인터페이스)을 먼저 부여하고 그 역할을 수행하는 구현 객체 만들면 확장 가능한 설계를 가능케하고 인터페이스를 구현한 객체를 유연하게 변경할 수 있게 됩니다.

POJO 프로그래밍을 지향 (Plain Old Java Object)

다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체를 뜻합니다.
순수 Java만을 사용하여 만든 객체이므로 특정 기술이나 환경에 종속되지 않습니다. 따라서, 외부 기술이나 규약의 변화에 얽매이지 않으며 객체지향 설계를 제한없이 적용하여 보다 유연하게 변화와 확장에 대처할 수 있습니다. 이처럼 비즈니스 로직을 구현하는 데에 POJO 를 적극적으로 활용하는 프로그래밍 패러다임을 POJO 프로그래밍이라고 합니다.

Spring 에서 말하는 제어의 역전(IoC), 의존 관계 주입(DI) 등 을 통해 다형성을 활용하여 POJO 프로그래밍 을 지향할 수 있도록 지원합니다.

의존성 주입, DI(Dependency Injection)

사용자가 직접 new 키워드를 사용하여 객체를 생성하지 않고, 외부(컨테이너)에서 생성된 객체를 주입받는 방식을 말합니다. 즉, 의존하는 객체를 직접 생성하는 대신 스프링 컨테이너로부터 의존 객체를 주입(전달)받는 방식 입니다.

제어의 역전, IoC(Invesion of Control)

컨트롤의 제어권이 개발자에게 있는 것이 아닌 프레임워크에 있는 것을 말합니다.
기존에 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미입니다.


Spring Boot

Spring 이용하여 개발할 때에 여러 Spring Framework 의 기능들, 다양한 오픈 소스의 등장으로 외부 라이브러리를 함께 사용할 일이 많아졌습니다. Spring 은 개발자가 직접 설정을 해주어야하기 때문에 설정하는데 많은 시간이 소요됩니다. 하지만 Spring Boot 을 사용하면 Spring Boot 가 자동으로 설정해주어 개발자가 편하게 Spring 을 활용할 수 있도록 해줍니다. Spring Boot 는 Spring 을 더 쉽게 이용하기 위한 도구라고 볼 수 있습니다. 최근에는 Spring Framework 를 사용하여 개발을 할때 기본으로 Spring Boot 를 사용합니다.

  • 스프링 애플리케이션을 쉽게 생성해줍니다.

  • Tomcat 내장 서버를 제공하여 별도의 웹 서버 설치없이 웹 애플리케이션을 실행할 수 있습니다.

  • Actuator 라는 모니터링과 관리를 위한 기능을 제공하여, 애플리케이션의 상태를 모니터링하고, 필요한 조치를 취할 수 있도록 해줍니다.

  • 손쉬운 빌드 구성을 위한 starter 종속성 제공
    (관련 라이브러리를 호환성에 맞게 알아서 버전을 선택하여 구성해줍니다)

ex. Spring-boot-starter-web (Spring MVC, Tomcat 등..)
ex. Spring-boot-starter-jdbc (JDBC, HikariPC, 커넥션풀 등..)


Spring CORE : Spring Container, Spring Bean

Spring Framework의 핵심 모듈

Spring Core 는 Spring Container 를 의미합니다. Core 라는 말 그대로 Container 는 Spring Framework 의 핵심이라고 할 수 있습니다. 스프링 컨테이너는 자바 객체의 생성, 관리, 제거 등 자바 객체의 생명 주기를 관리하는 역할을 합니다. 여기서 말하는 Spring Container 가 관리하는 자바 객체를 스프링에서는 스프링 빈(Bean)이라고 부릅니다. IoC와 DI 의 원리가 이 스프링 컨테이너에 적용됩니다.

개발자는 new 연산자, 인터페이스 호출 등 여러 방식으로 객체를 생성하고 소멸시킬 수 있는데, 스프링 컨테이너가 이 역할을 대신해 줍니다. 즉, 제어 흐름을 외부에서 관리하는 것입니다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 줍니다.

스프링 컨테이너는 BeanFactory 와 ApplicationContext 두 종류의 인터페이스로 구현되어 있습니다.

BeanFactory

스프링 컨테이너의 최상위 인터페이스로, 빈을 생성, 등록, 조회 등의 빈을 관리하는 역할을 합니다.

ApplicationContext

BeanFactory 의 기능을 조금 더 확장하여 제공합니다.
빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공합니다.

  • 부가 기능
    • MessageSource : 메시지 다국화를 위한 인터페이스
    • EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
    • ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
    • ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회

ApplicationContext 는 IoC 방식을 따라 만들어진 일종의 BeanFactory 로 둘 다 동일한 개념이라고 할 수 있습니다. 주로 사용되는 스프링 컨테이너는 ApplicationContext 입니다.

개발자가 직접 객체를 생성하기 위해서 new 생성자를 사용하면 이로 인해 애플리케이션에서는 수많은 객체가 존재하고 서로를 참조하게 됩니다. 객체 간의 참조가 많아질수록 서로에 대한 의존성이 높아지게 됩니다.

이는 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그래밍의 핵심과는 먼 방식입니다.
따라서, 스프링 컨테이너가 의존성 주입을 통해 객체 간의 의존성을 관리합니다. 이를 통해 객체 간의 결합도를 낮추고, 유지보수성을 향상시킵니다.

또한, 기존의 방식으로는 새로운 기능이 생기게 되면 변경 사항들을 수작업으로 수정해야 하는데,
프로젝트가 커질수록 의존도는 높아지고 이에 따라 코드의 변경도 많아질 것 입니다.

하지만, 스프링 컨테이너를 사용하면 구현 클래스를 의존하지 않고 인터페이스에만 의존하도록 설계하여 객체 지향 원칙을 준수하며, 유지보수성이 뛰어나고 확장 가능한 애플리케이션을 개발할 수 있습니다.

참고

김영한 스프링 핵심 원리 -기본편
https://ittrue.tistory.com/220

0개의 댓글