Framework/Spring

[Spring] Spring 프레임워크란 무엇인가?

Joonfluence 2024. 9. 20. 21:44

서론

오늘은 자바 백엔드 진영의 대표적인 프레임워크인 스프링에 대해서 알아보도록 하겠습니다.

본론

스프링의 어원과 탄생 배경

스프링(Spring)이란 영어로 봄을 말합니다. 왜 봄이라고 이름을 지었을까요? 스프링 프레임워크가 등장하기 전인 2000년대 초로 돌아가보면, EJB(Enterprise Java Beans)라는 자바 기업용 애플리케이션 프레임워크를 활용하여 어플리케이션 개발을 했습니다. EJB는 당시 자바의 표준이었죠. 하지만 너무 무겁고 복잡하고 비효율적이었습니다. 이에 불만을 느낀 로드 존슨이란 개발자가 EJB 없이도 고품질의 애플리케이션을 만들 수 있다는 것을 "Expert One-on-One J2EE Design and Development"란 책을 통해 증명해냅니다.

로드 존슨은 순수한 자바 코드로 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주고, 해당 기술을 예제 코드로 선보였습니다. 여기에 스프링 핵심 개념과 기반 코드(BeanFactory, ApplicationContext, POJO, IoC, DI 등등)이 들어가 있으며, 개발자들이 책의 예제 코드를 프로젝트에 사용하기 시작했습니다. 책 출간 직후 유겐 휠러와 얀 카로프가 로드 존슨에게 오픈 소스 프로젝트를 제안하였고, 전통적인 EJB라는 겨울을 넘어 새로운 시작이라는 뜻으로 스프링이라고 명칭을 짓게 되었습니다.

프레임워크란? (프레임워크 vs 라이브러리)

스프링은 자바 기반의 웹 어플리케이션을 만들 수 있는 프레임워크입니다. 프레임워크란 소프트웨어 개발에 필요한 기본적인 설계와 문제 해결을 위한 구조적인 해결책을 제시하는 코드의 집합체를 말합니다. 따라서 프레임워크의 사용자는 내장된 기능들을 직접 구현할 필요 없이, 바로 사용할 수 있게 되므로 어플리케이션의 구현에 집중할 수 있는 장점이 있습니다. 웹과 앱 개발에 활용되는 대표적인 프레임워크들은 다음과 같습니다.

프레임워크의 대표적인 예시들은 아래와 같습니다.

  • Java 서버 개발에 사용되는 Spring
  • Python 서버 개발에 활용되는 Django & Flask
  • React로 만들어진 서버사이드 렌더링(SSR) 프레임워크인 Next.js
  • Dart로 만들 수 있는 크로스 플랫폼 프레임워크인 Flutter

많은 분들이 헷갈려하실 수 있는 프레임워크와 라이브러리의 차이점에 대해 잠깐 알아보겠습니다. 라이브러리란 재사용이 가능한 기능을 미리 구현해놓고 필요한 곳에서 API 형태로 호출하여 사용할 수 있도록 만들어진 집합을 말합니다. 라이브러리의 대표적인 예시들은 아래와 같습니다.

  • 다양한 수학 연산, 선형 대수, 난수 생성 및 푸리에 변환 등을 제공하여 데이터 분석 및 머신 러닝에 널리 사용되는 파이썬 라이브러리 NumPy
  • HTML 문서 조작, 이벤트 처리, 애니메이션 및 Ajax를 단순화한 자바스크립트 라이브러리 jQuery
  • 데이터 조작과 분석을 위한 고성능 데이터 구조와 도구를 제공하는 인기 있는 파이썬 라이브러리 Pandas

프레임워크와 라이브러리의 차이 도식

이 둘 간의 차이점은 프레임워크는 프레임워크의 사용자에게 코드 흐름의 제어권이 없고, 라이브러리는 라이브러리의 사용자에게 제어권이 있습니다. 둘 다 특정 문제해결을 도와주는 도구라는 사실을 동일하지만, 프레임워크는 단순히 기능 개발에 국한되지 않으며 프레임워크를 사용하는 개발자는 프레임워크에 맞춰 개발해야 한다는 점에서 차이가 존재합니다. 스프링에서의 예시를 들어보면, HTTP API를 개발하기 위해서 Spring MVC를 사용합니다. Spring MVC는 스프링 기반의 HTTP 요청 및 응답 처리, 데이터 검증 및 바인딩, 뷰 렌더링 등과 같은 웹 개발을 위한 모델-뷰-컨트롤러(MVC) 아키텍처를 제공하는 프레임워크입니다. Spring MVC 사용자는 @Controller, @RequestMapping, @ModelAttribute 등과 같은 주석을 사용하여 클래스 및 메서드의 역할 및 종속성을 지정할 수도 있습니다. 그러나 Spring MVC 사용자는 요청을 디스패치하고 처리하는 방법, 뷰를 해결하고 렌더링하는 방법, 데이터를 변환하고 매핑하는 방법 등과 같이 Spring MVC 프레임워크 자체가 내부적으로 작동하는 방식을 수정할 수 없습니다. Spring MVC 사용자는 프레임워크를 사용하여 이러한 측면을 관리해야 합니다.

스프링 프레임워크란

자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

애플리케이션 프레임워크

단순히 프레임워크가 아닌, 애플리케이션 프레임워크라고 언급한 것이 인상적입니다. 애플리케이션 프레임워크란 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애츨리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말합니다. 단순히 다양한 기술을 한데 모아뒀기 때문에 이렇게 부르는 것이 아니라, 애플리케이션의 전 영역을 관통하는 일관된 프로그래밍 모델과 핵심 기술을 바탕으로 해서 각 분야의 특성에 맞는 필요를 채워주고 있기 때문에, 애플리케이션을 빠르고 효과적으로 개발할 수가 있습니다. 바로 이것이 스프링이 애플리케이션 프레임워크라고 불리는 이유입니다.

혹자는 스프링이 MVC 프레임워크 또는 JDBC/ORM 지원 프레임워크라고 생각하실 수도 있습니다. 또, 스프링을 IoC/DI 프레임워크나 AOP 툴이라고 볼 수도 있습니다. 전자는 스프링이 다루는 일부 영역만 봤기 때문이며, 후자는 스프링이 제공하는 핵심 기술에만 주목했기 때문입니다. 그러나 스프링의 일차적인 존재 목적은 핵심 기술에 담긴 프로그래밍 모델을 일관되게 적용해서 엔터프라이즈 애플리케이션 전 계층과 전 영역에 전략과 기능을 제공해줌으로써 애플리케이션을 편리하게 개발하게 해주는 애플리케이션 프레임워크로 사용되는 것임을 기억해 두는 것이 좋습니다.

오픈소스 경량급

경량급은 기존의 EJB처럼 툴의 도움 없이는 다루기 힘든 난해한 설정파일 구조와 까다로운 패키징, 불편한 서버 배치 등으로 인한 부담을 없이, 단순한 개발툴과 기본적인 개발환경으로도 엔터프라이즈 개발에서 필요로 하는 주요한 기능을 갖춘 애플리케이션을 개발하기에 충분하다는 의미입니다. 오픈 소스는 다들 잘 아시다시피 소스가 공개되어 있어서, 언제든 수정이 가능하고, 이슈를 제기하여 해결할 수 있는 소스를 말합니다.

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

이를 통해, 스프링이 통합적인 기능을 제공해준다는 사실을 알 수 있습니다.

스프링 프레임워크의 구조

실제 스프링은 Data Access/Integration, Web, Aop, Aspects, Instrumentation, Messaging 등 어플리케이션 개발에 필요한 다양한 기능들을 제공하는 요소들과 쉽게 통합할 수 있습니다. 다음으로 스프링 프레임워크에 대해서 알아보겠습니다.

스프링 프레임워크의 특징

  1. 경량 컨테이너로서 자바 객체를 직접 관리합니다
  • 스프링 프레임워크는 개발자를 대신해서 스프링의 빈(Spring IoC 컨테이너가 관리하는 자바 객체)을 생성하고 관리하는 컨테이너를 가지고 있고, 이를 스프링 컨테이너라고 부릅니다. 컨테이너가 대신 빈의 생명주기를 관리하기 때문에 스프링 컨테이너는 스프링 빈의 생성, 소멸, 라이프 사이클을 관리하고 의존성 주입(DI)을 통해 객체 간의 연결을 해줍니다.
  1. POJO 기반의 구성
  • POJO(Plain Old Java Object)란 평범한 구식 자바 객체를 말합니다. 예시는 다음과 같습니다.
public class Member {
    private Long id;
    private String name;
    private Grade grade;

    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}
  • 스프링은 이러한 POJO를 기반으로 합니다. 따라서 특정한 인터페이스나 클래스를 상속받지 않아도 되므로 기존의 라이브러리와 호환성이 좋고 객체가 가볍습니다.
  1. 제어 반전(IOC)와 의존성 주입(DI)을 통한 객체 간의 관계 구성
  • 제어의 역행(IoC)이란 코드의 최종 호출을 개발자가 결정하는 것이 아니라 스프링 프레임워크 내부에서 이루어지는 것을 말합니다. 이는 프레임워크라면 갖는 공통의 특성으로, 코드 제어의 흐름이 프레임워크에 종속됨을 의미합니다. 스프링은 이미 구조가 설계되어 있어, 스프링을 사용하는 개발자는 부품을 만들어 조립하는 형태로 개발합니다. 이는 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 돕습니다. 이를 통해, 가독성이나 코드 중복, 유지 보수가 쉬워지는 장점이 있습니다.
  • 의존성 주입(DI)란 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 스프링 프레임워크에서 스프링 내부의 객체들 간의 관계를 만들어주는 것을 말합니다. 이는 객체를 직접 생성해서 객체 의존관계를 주는 것이 아닌, 외부에서(스프링이) 생성해서 주입시켜주는 방식입니다. 스프링에서는 의존성 주입 방법으로 필드 주입, Setter 주입, 생성자 주입 방식이 있으며, 자세한 내용은 해당 글을 통해 설명드리겠습니다.
  1. AOP 지원
  • AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)이란 프로그램 내 로직을 핵심 기능과 부가 기능(횡단 관심사라고도 말합니다)으로 분리하여 바라보는 프로그래밍 방식으로, 여러 모듈에서 공통적으로 사용하는 부가 기능을 핵심 기능에서 분리하여 관리하는 기능을 말합니다. 비즈니스 로직으로부터 부가 기능을 담당하는 로직을 분리함으로써, 코드를 단순하고 깔끔하게 작성하도록 돕습니다. 자세한 내용은 추가 포스팅을 통해 설명드리겠습니다.
  1. WAS에 독립적인 개발 환경
  • 과거 EJB가 느리고 무거운 자바 서버(WAS)에서만 동작한 반면, 스프링은 WAS로부터 독립적인 개발 환경을 구축할 수 있습니다. 가장 단순한 서버환경인 톰캣(Tomcat)이나 제티(Jetty) 위에서도 완벽하게 동작합니다.
  1. 영속성과 관련된 다양한 서비스를 지원한다.
  • MyBatis나 JPA 등 다양한 데이터 접근 기술과 쉽게 통합하여 사용할 수 있습니다.
  1. 확장성이 높다.
  • 스프링 프레임워크는 객체지향적으로 설계되었습니다. 이는 SOLID 원칙에 부합하게 프로그래밍 됐다는 의미이고, 이러한 어플리케이션은 확장성이 높을 수 밖에 없습니다. 기본적으로 스프링과 특정 요소가 통합될 때, 구현체가 아닌 추상화된 인터페이스에 의존합니다. 의존성 주입을 통해 스프링 컨테이너에서 해당 객체를 관리해주기 때문에, 구현체의 변경이 필요할 때 손쉽게 변경할 수 있습니다. 자세한 내용은 추가 포스팅을 통해 설명드리겠습니다.

참조한 사이트

https://spring.io/projects/spring-framework

반응형