이번에는 스프링 부트에 대해서 공부해보겠습니다.
나는 스프링을 공부하면서 IOC와 DI가 엄청 중요한 개념이라고 생각이 들었다.
그런데 이런 개념을 이해하기 위해서는 스프링 부트에 대한 기본적인 이해가 필요하다고 생각했고
이번 시간에 스프링 부트에 대해 이해하고 다음 포스팅에서 IOC와 DI에 대해서 정리해보겠다.

01. 스프링 부트란 무엇인가?
정의 : 스프링 부트란 스프링의 프레임 워크를 말한다.
사실 스프링 프레임 워크 자체는 아닌데 스프링 프레임워크는 장점이 아주 많지만 설정이 복잡하다는 단점이 있었고 이를 해결하고자 자동 설정이라는 큰 강점을 가진 스프링 부트를 만들어낸 것이다.

※ 프레임워크가 무엇인지 알고가자! ( 프레임워크 VS 라이브러리)
- 프레임 워크 :
여러 라이브러리들을 활용하여 개발의 흐름을 제어하는 틀을 가진 것을 말한다.
쉽게 말해 프로그램의 골격이고 골격 안의 규칙에 맞춰 내가 살을 채워나가는 것을 말한다.
그렇다면 라이브러리란 무엇인가? - 라이브러리 :
내가 직접 골격을 만들고 그때그때 필요한 기능을 라이브러리에서 가져와서 사용하는 것을 말한다.
※ 왜 프레임 워크를 사용하나?
- 가장 기본적인 이유는 바로 골격(틀)이 있기 때문이다.
- 틀이 있는 덕에 개발의 효율성이 높아지고,
- 틀이 있는 덕에 디자인 패턴 적용에 용이해지고,
- 틀이 있는 덕에 규칙이 있어 유지 보수에 비용 절감이 가능하고
- 틀이 있는 덕에 불필요한 적업이나 반복적인 작업을 줄일 수 있기 때문이다
지금까지 단순 프레임 워크가 무엇인지 알았으니
이제 스프링 프레임 워크가 무엇이고 어떤 장점이 있는지 알아보도록 하겠다.
02. Spring Framework에 대해 (자바 어플리케이션 프레임 워크)
정의 : 쉽게 자바 개발을 편리하게 해주는 오픈소스 경량급 애플리케이션 프레임 워크이다.
※ 여기서 말하는 경량급이란 : 가볍다는 의미로 POJO기반이기 때문에 복잡한 설정이 필요하지 않으며 또한 자바 기반 설정을 지원하여 간편하게 설정이 가능하다는 의미입니다.
Spring Framework의 장점 :
- 경량 컨테이너로서, Spring Bean을 직접 관리한다.
: 쉽게 말해 스프링이 직접 BEan을 관리하는 의미이다. 개발자가 빈을 관리할 필요 없이 컨테이너가 관리해준다. - POJO 기반의 프레임워크
: 특별한 클래스를 상속받지 않고 순수 JAVA 객체만으로 개발할 수 있어 유지 보수가 쉽다. - 제어의 역전 (IOC)
: 객체를 직접 생성하지 않고, 스프링이 대신 만들어준다. 이 덕분에 객체 초기화의 위치나 객체 생성에 대한 실수로 부터 방지가 가능하다. - 관점 지향 프로그래밍 (AOP)
: 공통의 로직(보안이나 로깅, 트랜잭션과 같은 공통 기능)을 분리하여 관리한다. 쉽게 말해 반복적으로 사용하는 기능을 한곳에서 관리하고 필요할 때 적용하도록 하고 있다. AOP는 내부적으로 Proxy패턴을 활용하여 공통 기는을 적용하는데 이 덕분에 코드가 간결해지고 유지보수가 간편해진다. - 서비스 추상화
: 특정 기술에 종속되지 않는다. 코드가 특정 기술 (JDBC, JPA 등)에 종속될 경우 특정 기술의 조건이 없으면 코드 자체를 못쓰는 큰 문제가 발생한다. 하지만 스프링이 제공하는 인터페이스만 사용하여 다양한 기술로 쉽게 변경이 가능하다.
03. 스프링 부트의 목표
위의 내용들을 정리해보면 스프링 부트는 기존의 스프링 프레임워크의 설정이 많다는 단점을 보안하기 위해 만들어진 프로젝트이다. 따라서 스프링 부트의 목적은 아래와 같다.
Spring Boot는 설정을 최소화해 빠르게 Spring 기반 애플리케이션을 개발할 수 있는 프레임워크
스프링 부트의 주요 기능들을 보면 그 목표에 대해 더 잘 이해할 수 있다.
- 단독 실행 가능한 애플리케이션 생성
: Jar/War 파일 만으로 서버 없이 실행이 가능하다 - 내장형 웹 애플리케이션 서버 지원
: 별도의 서버 설치 없이 내장된 웹 서버를 통해 개발 및 배포가 간편해졌다. - Starter 모듈 제공
: 유용성을 위해 자동 설정 기능들이 존재(의존성, 버전호환성…) - 자동 설정 :
: 개발자들이 별도의 설정 없이 필요한 Bean과 설저을 자동으로 구성해준다.
04. 스프링 부트 내부 코드 파헤치기 (Spring Boot가 어떻게 동작하는지 알아보기)
우리는 개념적으로 스프링 부트를 이해했다.
이번에는 스프링 부트의 내부들을 살피며 어떻게 Spring Boot가 동작되었는지를 이해해보겠다.
04-1. 자동 생성 코드 - pom.xml
pom.xml파일을 보면 아래와 같은 의존성을 살펴볼 수 있다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/>
</parent>
위의 코드에서의 spring-boot-starter-parent는 spring-boot-dependencies를 상속하고 있다.
내부를 살펴보면 라이브러리들의 의존성들이 들어있고 각 의존성들의 버전들이 선언되어 있다.
그 덕분에 우리는 pom.xml에 버전 설정을 따로 하지 않더라도 잘 작동하는 것이다.
즉, spring-boot 버전별로 지원하는 라이브러리 의존성 목록들이 존재하고 있다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.2.5</version>
</dependency>
위의 코드는 spring-boot-starter인데 parent의 자식이라고 생각하면 될 것 같다.
이 의존성만 pom에 추가해줘도 core, context, logging 등 자주 사용되는 라이브러리들을 자동으로 추가해준다.


04-2. 자동 생성 코드 - Main.java
기본 파일인 Main클래스를 보면 한가지 어노테이션이 붙어있다.
@SpringBootApplication 어노테이션의 구현체를 들어가보면 여러가지 어노테이션들이 붙어있는 것을 볼 수 있다.
[ @SpringBootApplication ]
: @SpringBootApplication는 main() 메소드를 포함하는 클래스에 달리며, 스프링 부트에서 매우 중요한 역할을 한다. main함수의 내부를 보면 아래와 같이 run함수에 자기 자신 클래스와 인자값들을 넘기며 프로그램을 실행시킨다. 또한 여러가지 기능을 수행하는데,
SpringApplication.run(Main.class, args);
1. applicationContext 생성한다.
2. 빈 팩토리 생성한다.
3. 빈 생성 (초기화)
정리 : 스프링 부트가 프로젝트가 실행되면, SpringApplication.run() 이 실행되고, 실행을 따라가보면 applicationContext 생성 및 초기화, 코드 해석, 빈 초기화 등 여러 동작을 하는 것을 알 수 있다.
[ @SpringBootConfiguration ]
: @SpringBootConfiguration는 Spring Boot 전용 설정 클래스이다.
[ @ComponentScan ]
:@ComponentScan은 스프링 프레임 워크에서 자동으로 스테레오타입어노테이션이 붙은 클래스들을 검색하고 빈으로 등록하는 역할을 한다. 기본적으로 선언된 클래스가 속한 패키지와 하위 패키지들이 Scan 범위이다.
정리 : @CompoenentScan은 Spring Boot 프로젝트가 코드를 어디까지 해석할지를 결정한다.
※ 스테레오타입어노테이션 : (@Component, @Configuration , @Service, @Repository, @Controller 등 )
[ @Configuration ]
: @Configuration은 기본적인 스프링 설정 클래스인데 일반적으로 스프링 빈을 등록하는 역할을 한다.
[ @Autowired ]
: @Autowrited는 의존성 주입 어노테이션으로 Spring Boot가 해당 어노테이션을 보고 Spring Bean이 적절한 위치에 주입될 수 있도록 서절한다.
위의 Main함수의 자동 생성 코드를 정리해보면 다음과 같다
1. @SpringBootApplication이 있는 Main 클래스를 SpringApplication.run(Main.class, args);로 실행하면 해당 클래스를 해석한다
2. @SpringBootApplication은 내부적으로 @ComponentScan을 포함하고 있으며, 이를 통해 스프링 컨테이너(ApplicationContext)와 빈 팩토리를 생성한다
3. @ComponentScan이 실행되면서 @Component, @Service, @Repository, @Controller, @Configuration 등의 애너테이션이 붙은 클래스를 탐색하고 빈(Bean)으로 등록한다
4. @SpringBootApplication이 만든 빈 팩토리에 @ComponentScan이 탐지한 빈 객체들을 등록하고 초기화한다
5. @Autowired를 이용해 필요한 빈을 찾아 의존성을 주입한다.
지금까지 간단히 스프링 프레임워크, 스프링 부트에 대해서 소개를 해보았습니다.
이제 저희가 알아야할 IOC, DI.
이 둘은 스프링 프레임 워크의 주요 특징들 이었습니다.
이 둘 이해하면 이제 스프링 프레임 워크부터 스프링 컨테이너까지 모두 이해할 수 있을 것입니다.
다음 포스팅에서는 IOC에 대해 알아보도록 하겠습니다.
'Spring' 카테고리의 다른 글
| [ Spring ] HttpMessageConverter 파헤치기 - 개발 지식 (0) | 2025.04.18 |
|---|---|
| [ Spring ] HandlerMethodArgumentResolver이란? - 개발 지식 (0) | 2025.04.15 |
| [HTTP API 설계] Spring HTTP API란? - 개발 지식 (0) | 2025.04.14 |
| [IOC] 제어 역전의 모든 것 - Spring 지식 (0) | 2025.04.02 |
| [Spring] 시작, Spring이란? - 개발 지식 (1) | 2024.10.02 |