BACKEND/SPRING

01. 스프링 부트란? - 스프링 프레임워크 vs. 스프링 부트

우진하다 2023. 7. 22. 12:09

스프링 부트 공식문서를 보면 다음과 같은 내용이 안내되어 있습니다.

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.

스프링 부트를 이용하면 단독으로 실행 가능한 상용 수준의 스프링 기반 애플리케이션을 쉽게 만들 수 있습니다.

우리는 스프링 플랫폼과 타사 라이브러리에 대해 의견이 담긴 관점을 취하여 최소한의 노력으로 시작할 수 있도록 합니다. 대부분의 스프링 부트 애플리케이션은 최소한의 스프링 구성만으로도 실행이 가능합니다.

즉, 별도의 복잡한 설정이 없더라도 스프링 부트를 사용하면 개발이 쉬워진다는 의미입니다.

예로 스프링 프레임워크는 AppConfig 클래스를 사용하여 빈을 설정하고, AnnotationConfigApplicationContext를 통해 빈을 가져옵니다. 반면에 스프링 부트는 @SpringBootApplication 어노테이션 하나만으로 애플리케이션을 실행시키며, 설정 파일이나 빈을 정의하는 과정이 없습니다.

 


의존성 관리

스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정해야 합니다.
호환되는 버전을 명시해야 정상 동작하며 애플리케이션에서 사용하는 스프링 프레임워크나 라이브러리의 버전 또한 고려해야 합니다.

스프링 부투에서는 이 같은 불편함을 해소하기 위해 'spring-boot-starter'라는 의존성을 제공해
각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공합니다.

빌드 도구로는 Maven이나 Gradle을 사용할 수 있으며, 의존성 관리를 자동으로 처리해줍니다.
아래는 build.gradle 파일 예시 입니다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // redis client
    implementation 'org.redisson:redisson:3.17.1'
    // embedded redis
    implementation('it.ozimov:embedded-redis:0.7.3') {
        exclude group: "org.slf4j", module: "slf4j-simple"
    }
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

이처럼 스프링 부트의 편리함은 다양한 스프링 부트 스타터(starter)들을 활용하여 필요한 라이브러리를 쉽게 추가할 수 있다는 점에 있습니다. 
이러한 스타터들은 특정 기능 또는 라이브러리를 적절하게 설정하여 프로젝트에 필요한 의존성을 자동으로 관리해 줍니다. 
아래는 자주 사용되는 몇 가지 스프링 부트 스타터들의 예시입니다

spring-boot-starter-web
RESTful 애플리케 애플리케이션을 만들기 위한 의존성 으로, 내장된 웹 서버(Tomcat, Jetty, Undertow)와 Spring MVC를 지원합니다.

spring-boot-starter-data-jpa
JPA(Java Persistence API)를 사용하여 데이터베이스에 접근할 때 필요한 스타터로, Hibernate와 같은 JPA 구현체와의 통합을 제공합니다.

spring-boot-starter-thymeleaf
Thymeleaf 템플릿 엔진을 사용하여 뷰를 생성할 때 필요한 스타터입니다. HTML 템플릿과의 통합을 지원합니다.

spring-boot-starter-security
스프링 시큐리티를 사용하여 보안 기능을 추가할 때 필요한 스타터입니다. 사용자 인증, 권한 부여, 보안 설정 등을 지원합니다.

spring-boot-starter-test
테스트를 위한 스타터로, JUnit, Mockito, Spring Test 등의 테스트 프레임워크와 함께 테스트 환경을 구성합니다.

spring-boot-starter-actuator
애플리케이션의 상태를 모니터링하고 관리할 수 있는 기능을 제공하는 스타터로, 애플리케이션의 상태 정보, 메트릭, 로그 등을 노출합니다.

spring-boot-starter-mail
이메일 발송을 위한 스타터로, JavaMail을 사용하여 이메일을 전송할 수 있도록 설정합니다.

spring-boot-starter-data-redis
Redis를 사용하여 데이터를 캐싱하고 관리할 때 필요한 스타터입니다.

spring-boot-starter-data-jdbc
스프링 부트에서 JDBC(Java Database Connectivity)를 사용하여 데이터베이스와 상호 작용하는데 필요한 의존성들을 관리해주는 스타터

spring-boot-starter-data-cache
spring-boot-starter-data-cache는 스프링 부트에서 캐싱을 사용하는데 필요한 의존성들을 관리해주는 스타터입니다.

 


자동 설정

스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원합니다.
자동 설정은 애플리케이션에 추가된 라이버르러리를 실행하는데 필요한 환경 설정을 알아서 찾아주며
필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해 줍니다.

스프링 프로젝트를 만들면 프로젝트명 + Application 파일을 확인할 수 있습니다.

package com.example.accountdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccountDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AccountDemoApplication.class, args);
    }

}

@SpringBootApplication 어노테이션은 여러 어노테이션들을 합쳐놓은 어노테이션이며 크게 다음과 같은 어노테이션을 합쳐놓은 구성입니다.

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

스프링 부트 애플리케이션이 실행되면 먼저 @ComponentScan 어노테이션이 @Component 시리즈 어노테이션이 붙은 클래스를 발견해 빈(bean)으로 등록하고 이후 @EnableAutoConfiguration 어노테이션을 통해 자동 설정이 일부 조건을 거쳐 적용됩니다.

@Component 시리즈는 스프링 프레임워크와 스프링 부트에서 주로 사용되는 어노테이션들로,
빈(Bean)을 정의하고 스프링 컨테이너에서 해당 빈을 관리할 때 사용됩니다.

각각의 어노테이션들은 특정 상황에 맞추어 빈을 등록하는데 사용됩니다.
아래는 @Component 시리즈에 속하는 주요 어노테이션들과 간단한 설명입니다.


@Component
가장 기본적인 빈 등록 어노테이션으로 사용됩니다. 일반적인 빈으로 등록하고자 할 때 사용합니다.

@Controller: 웹 애플리케이션에서 사용되는 컨트롤러(Controller) 빈으로 등록할 때 사용합니다.
@Controller 어노테이션을 사용하면 스프링이 해당 빈을 웹 애플리케이션의 컨트롤러로 인식하게 됩니다.

@Service: 비즈니스 로직을 처리하는 서비스(Service) 빈으로 등록할 때 사용합니다.
@Service 어노테이션을 사용하면 스프링이 해당 빈을 서비스 레이어의 구성요소로 인식하게 됩니다.

@Repository: 데이터 액세스 계층의 빈으로 등록할 때 사용합니다.
@Repository 어노테이션을 사용하면 스프링이 해당 빈을 데이터베이스 액세스를 처리하는 레포지토리(Repository) 레이어의 구성요소로 인식하게 됩니다.

@Configuration: 스프링의 JavaConfig 방식 설정 클래스를 정의할 때 사용합니다.
@Configuration 어노테이션이 부착된 클래스 내에서 @Bean 어노테이션을 사용하여 빈을 정의할 수 있습니다.
// @Component 어노테이션 예시
@Component
public class MyComponent {
    // 빈으로 등록될 클래스
}

// @Controller 어노테이션 예시
@Controller
public class MyController {
    // 웹 애플리케이션의 컨트롤러로 동작할 클래스
}

// @Service 어노테이션 예시
@Service
public class MyService {
    // 비즈니스 로직을 처리하는 서비스 클래스
}

// @Repository 어노테이션 예시
@Repository
public class MyRepository {
    // 데이터 액세스 계층의 레포지토리 클래스
}

// @Configuration 어노테이션 예시
@Configuration
public class MyConfig {
    // 스프링의 JavaConfig 방식 설정 클래스
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

내장 WAS

스프링 부트는 웹 애플리케이션을 개발할 때 내장된 웹 애플리케이션 서버(Embedded Web Application Server)를 제공하는데, 이를 내장 WAS라고 합니다. 
스프링 부트의 내장 WAS를 사용하면 별도의 외부 WAS 서버를 설치하거나 설정할 필요 없이 간단하게 웹 애플리케이션을 실행할 수 있습니다.

스프링 부트는 기본적으로 내장 WAS로서 Tomcat, Jetty, Undertow 중 하나를 선택하여 사용합니다. 
이 중 기본적으로는 Tomcat이 사용되며, 필요에 따라 다른 내장 WAS로 변경할 수 있습니다. 
내장 WAS를 사용하기 위해서는 단지 spring-boot-starter-web 스타터를 프로젝트에 추가하면 됩니다.

내장 WAS를 사용하는 장점은 다음과 같습니다.
간단한 배포: 외부 WAS가 필요하지 않기 때문에 애플리케이션을 간단하게 패키징하여 배포할 수 있습니다.
독립성: 특정 WAS에 종속되지 않고, 내장 WAS를 사용하여 여러 종류의 WAS에서 동일한 애플리케이션을 실행할 수 있습니다.
개발 편의성: 애플리케이션 코드를 변경할 때마다 WAS를 재시작할 필요 없이, 자동으로 재시작하여 개발 속도를 향상시킵니다.

스프링 부트 애플리케이션을 실행할 때는 일반적으로 main 메서드가 있는 클래스를 실행하거나, Maven이나 Gradle의 spring-boot:run 명령을 통해 내장 WAS를 시작합니다. 
예를 들면, 다음과 같이 SpringBootApplication 어노테이션이 부착된 클래스를 실행할 수 있습니다.

@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

 


모니터링

스프링 부트는 모니터링 및 관리를 위해 Actuator 모듈을 제공합니다. 
Actuator는 스프링 부트 애플리케이션의 실행 상태와 다양한 메트릭 정보를 노출하는 역할을 수행하여 애플리케이션을 쉽게 모니터링하고 관리할 수 있게 해줍니다. Actuator를 사용하면 애플리케이션의 상태를 실시간으로 확인하고, 문제가 발생할 경우 빠르게 대응할 수 있습니다.

Actuator는 스프링 부트에 기본적으로 포함되어 있으며, spring-boot-starter-actuator 스타터를 추가하면 사용할 수 있습니다.

/actuator/health: 애플리케이션의 상태를 확인하는 엔드포인트로, 애플리케이션이 정상 동작 중인지 여부를 알려줍니다.
/actuator/info: 애플리케이션 정보를 확인하는 엔드포인트로, 커스텀한 애플리케이션 정보를 추가하여 노출할 수 있습니다.
/actuator/metrics: 다양한 메트릭 정보를 확인하는 엔드포인트로, CPU 사용량, 메모리 사용량, HTTP 요청 수 등을 확인할 수 있습니다.
/actuator/loggers: 로그 레벨을 설정하는 엔드포인트로, 런타임에 로그 레벨을 동적으로 변경할 수 있습니다.
/actuator/env: 애플리케이션의 환경 변수 정보를 확인하는 엔드포인트로, 애플리케이션 설정과 환경 정보를 확인할 수 있습니다.

Actuator 엔드포인트들은 기본적으로 보안을 위해 인증을 요구합니다. 
기본적으로 /actuator 경로는 모두 보호되어 있으며, 특정 엔드포인트만 노출하도록 구성할 수 있습니다.