스프링(Spring)과 스프링 부트(Spring Boot)의 기본 개념

임정빈·2024년 2월 21일

국비 학원으로 자바와 스프링을 배웠지만 스프링부트에 대해 공부하고자 작성하게 되었다. 스프링 부트를 알기 전에 또한 배웠던 스프링에 대해 좀더 정리하려고 한다.


1. 스프링(Spring)이란?

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

Python을 이용한 Django, Ruby를 이용한 Ruby on Rails, Javascript를 이용한 Node.js 기반의 웹 서버 개발과 같이 Java 개발자들은 Spring을 사용하여 웹 서비스를 만들 수 있다.


1.1 스프링의 특징

  • 경량 컨테이너
  • 제어의 역전(IoC, Invertion of Control)
  • 의존성 주입(Di, Dependency Injection)
  • 관점지향 프로그래밍(AOP, Aspect-Oriented Programming)
  • MVC 패턴 (Model-View-Controller)

1.1.1 경량 컨테이너

스프링을 정의함에 있어 경량급이라 함은 기존에 스프링 대신 사용하던 기술들과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다는 것을 표현하기 위함이다.

스프링은 자바 객체와 라이브러리들을 관리해주며, 톰캣과 같은 웹 어플리케이션 서비스가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있다. 또한, 스프링은 경량 컨테이너로 자바 객체를 직접 스프링 안에서 관리한다. 객체의 생성 및 소멸과 같은 생명 주기를 관리하며, 스프링으로부터 필요한 객체를 가져와 사용한다.


1.1.2 제어의 역전(IoC, Invertion of Control)

일반적으로 자바에서는 개발자가 각 객체를 직접 생성하고 제어해야 했다. 하지만 스프링에서는 스프링 컨테이너에 Bean(객체)를 등록하기만 하면, 스프링 컨테이너에서 객체의 생명주기를 컨트롤 해준다.

컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출하기 때문에 제어의 역전이라고 한다.


1.1.3 의존성 주입(Di, Dependency Injection)

각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크(Spring)가 서로 연결시켜준다.

의존성 주입은 재사용성을 높여주고, 코드를 단순화시켜주며, 결합도를 낮춰준다.


1.1.4 관점지향 프로그래밍(AOP, Aspect-Oriented Programming)

트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

즉, '관심의 분리(Separation of Concerns)' 이며, AOP를 통해서 중복 코드 제거, 효율적인 유지보수, 높은 생산성, 재활용성 극대화, 변화 수용 용이 등의 이점을 얻을 수 있다.


1.1.5 MVC 패턴 (Model-View-Controller)

웹 프로그램밍 개발 시 거의 표준적인 방식인 "Spring MVC"라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. 

  • Model은 애플리케이션의 정보, 데이터를 나타낸다.
  • View는 데이터 및 객체의 입력, 그리고 보여주는 출력을 담당한다.
    데이터를 기반으로 사용자들이 볼 수 있는 화면이다.
  • Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.


2. 스프링 부트(Spring Boot)란?

Spring의 초기 환경 설정시 시간이 많이 할애되는 문제를 해결하고자 등장한 프레임워크가 Spring Boot이다.

스프링 부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크이다.

위와 같은 코드를 스프링부트가 기존의 복잡한 설정을 대신 해주기 때문에 간략화할 수 있다.


2.1 스프링 부트의 핵심 기능

  1. 의존성 관리(dependency management) 간소화
  2. 배포(deployment) 간소화
  3. 자동 설정(auto configuration)

2.1.1 의존성 관리(dependency management) 간소화 - 스타터

스프링 부트의 특별한 점은 의존성을 수월하게 관리한다는 것이다.

일반적으로 애플리케이션에서 제공하는 모든 기능에는 여러 기본 의존성(dependency)이 필요하다.

  • 가령 RESTful API을 포함하는 의존성은 특정 형식으로 응답하는 코드(JSON, XML, HTML등), 요청된 포맷의 객체를 마샬링(marshalling: 객체의 메모리 표현방식을 저장이나 전송에 알맞은 데이터 형식으로 변환하는 프로세스)/언마샬링 하는 코드, 요청을 처리하고 다시 응답을 반환하는 코드와 다양한 유선 프로토콜 등을 지원하는 코드다.

    • 이처럼 RESTful API 같은 간단한 예에서도 빌드 파일에 수많은 의존성이 필요하다.

스프링 부트와 스타터는 이런 어려움을 해결하기 위해 등장했다.

스프링 부트 스타터는 거의 매번 동일한 방식으로 특정 기능을 제공한다는 입증된 전제를 바탕으로 제작된 BOM이다.

  • BOM(Bills Of Material)은 프로젝트 아티팩트(라이브러리 등의 구성 요소)의 정보, 버전, 의존성 관리를 포함한 특수한 POM이다.

  • POM(Project Object Model)은 빌드 도구에서 의존성을 가져오고 프로젝트 빌드에 사용하는 정보와 프로젝트 구성이 담긴 파일이다.

spring-boot-starter-web 같은 단일 스타터를 추가하면 단일 어플리케이션에 필요한 기능을 모두 제공한다.

단일 스타터에 포함된 여러 의존성 안에 들어 있는 각 의존성 내의 여러 라이브러리 버전이 모든 의존성에 맞게 동기화된다.

  • 메이븐의 pom.xml 또는 그레이들의 빌드 파일에 있는 ‘dependencies’에 추가하는 파일은 ‘의존성(dependencies)’이라 하고, 각 의존성을 구성하는 실제 파일(.jar file)을 ‘라이브러리’라고 한다. 만약 의존성을 구성하는 .jar 파일이 하나라면, 그 의존성을 ‘라이브러리’로 부를 수 있다.
  • 스프링 부트의 스타터 개념은 의존성을 간소화하고 애플리케이션에 기능 전체를 추가하는 데 필요한 작업을 줄여준다.
  • 테스트, 유지보수, 업그레이드에 드는 오버헤드(overhead)를 크게 줄인다.

2.1.2 배포(deployment) 간소화 - 실행 가능한 JAR

오래전부터 애플리케이션 서버에 자바 애플리케이션을 배포하는 과정은 복잡했다.

모든 의존성이 포함된 단일 스프링 부트 JAR*는 배포를 용이하게 한다.

  • JAR(Java Archive): 자바 프로그램을 배포할 수 있도록 패키징한 파일 형식

모든 의존성을 수집해 배포하는 대신 스프링 부트 플러그인이 모든 의존성을 결과 JAR(output jar)에 압축한다.

JAR가 있으면, JVM(Java Virtual Machine)이 있는 환경에서 Java -jar <SpringBootAppName.jar> 같은 명령만으로 애플리케이션을 실행한다.

빌드 파일에 단일 속성을 설정하면, 스프링 부트 빌드 플러그인은 단일 JAR를 완전 자체적으로 실행 가능한 파일로 만든다.

JVM이 존재한다고 가정할 경우, 전체 명령어를 입력하거나 스크립트를 만들어 사용할 필요 없이, 간단히 <SpringBootAppName.jar> (사용자의 파일 이름)을 입력하면 된다.


2.1.3 자동 설정(auto configuration)

스프링 부트가 널리 사용되고 반복되는 사용 사례에서 의견*을 제시해 생산성을 향상시킨다.

  • 의견(Opinions): 스프링 개발팀이 제공하는 대부분의 사용 사례에 맞는 특정 기본값 또는 프로세스

소프트웨어에서 특정 패턴이 반복된다. 스프링 부트 스타터 역시 반복된 패턴이 일관되므로 특정 작업에서 작성해야 할 코드가 간소화된다.

사용 사례가 80~90%의 일반적인 범주에 들지 않고, 드물지만 유용한 10~20% 범주에 속하기도 한다. 이 경우 자동 설정을 선택적으로 오버라이딩하거나 완전히 사용하지 않도록 설정할 수도 있다(스프링 부트의 장점이 소멸되긴 한다). 특정 경우의 오버라이딩은 일반적으로 하나 이상의 속성을 원하는 대로 설정하거나, 스프링 부트가 사용자들 대신해 자동 설정 작업을 하는 빈(Bean)을 제공하는 경우에 수행된다.

드물지만 필요할 때는 이런 작업을 매우 쉽게할 수 있다.




참고

https://goddaehee.tistory.com/156
https://m.blog.naver.com/jhc9639/220967034588
https://www.codestates.com/blog/content/스프링-스프링부트
https://velog.io/@falling_star3/SpringBoot-스프링과-스프링-부트
책 처음부터 제대로 배우는 스프링 부트 - 마크 헤틀러

profile
신입개발자

0개의 댓글