스프링부트(Spring Boot)란? 스프링과의 차이점

GarionNachal·2025년 5월 2일
0

JAVA, Springboot

목록 보기
1/6
post-thumbnail

1. 스프링(Spring)이란?

스프링은 자바 기반의 웹 애플리케이션 개발을 위한 오픈소스 프레임워크입니다. 2004년에 처음 등장한 스프링은 엔터프라이즈급 애플리케이션 개발을 편리하게 해주는 경량급 프레임워크로, 다음과 같은 핵심 기능을 제공합니다:

스프링의 핵심 기능

DI(Dependency Injection, 의존성 주입)

DI는 Spring에서 객체 간의 의존성을 객체 내부에서 개발자가 직접 호출하는 대신 Spring 컨테이너에서 객체를 생성해서 넣어주는 방식입니다. 이를 통해 코드의 결합도를 낮추고 유연성을 높입니다.

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

IoC는 컨트롤의 제어권이 개발자가 아닌 Spring 컨테이너가 대신해주는 것을 의미합니다. 기존 자바 코드에서는 객체의 생성과 의존관계 설정을 개발자가 직접 해야 했지만, Spring에서는 이를 컨테이너가 대신 수행합니다.

IoC는 객체의 제어권을 역전시키는 개념이고, DI는 해당 개념을 구현하기 위해 사용하는 디자인 패턴입니다.

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

AOP는 핵심 기능과는 별도로 부가적인 기능(로깅, 트랜잭션, 보안 등)을 프레임워크가 제공하는 프로그래밍 방식입니다. 이를 통해 코드의 중복을 줄이고 비즈니스 로직에 집중할 수 있게 해줍니다.

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

스프링부트는 스프링의 장점은 유지하면서 복잡한 설정은 간소화한 프레임워크입니다. 2014년 첫 등장한 스프링부트는 스프링의 문제점을 해결해 주기 위해 개발되었으며, 개발자들이 더 쉽고 빠르게 Spring 애플리케이션을 개발할 수 있도록 돕습니다.

스프링부트는 기본적으로 스프링 프레임워크를 기반으로 하지만, 프로젝트 설정과 빌드 프로세스를 크게 간소화했습니다. 즉, 스프링 부트는 스프링으로 애플리케이션을 만들 때 필요한 설정을 간편하게 처리해주는 별도의 프레임워크입니다.

3. 스프링과 스프링부트의 주요 차이점

1. 의존성 관리(Dependency)

스프링:

Copyplugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework:spring-web:5.3.5'
    implementation 'org.springframework:spring-webmvc:5.3.5'
    implementation 'javax.servlet:javax.servlet-api:4.0.1'
}

스프링에서는 각 라이브러리의 버전을 일일이 명시해야 하며, 호환성을 고려해 관리해야 합니다.

스프링부트:

Copyplugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.2'
    id 'io.spring.dependency-management' version '1.1.4'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

스프링부트는 의존성을 스타터(Starter) 패키지로 제공하여 간편하게 설정할 수 있으며, 버전 관리도 자동으로 수행합니다.

2. 설정(Configuration)

스프링: 스프링은 XML 또는 Java 기반의 복잡한 설정이 필요합니다. 데이터베이스 연결과 같은 간단한 기능도 많은 설정 코드가 필요합니다.

Copy@Configuration
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("root");
        dataSource.setPassword("rootpassword");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.domain")
                .persistenceUnit("mydb")
                .build();
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}

스프링부트: 스프링부트는 자동 설정(Auto Configuration)을 지원하여 최소한의 설정만으로 애플리케이션을 구성할 수 있습니다.

Copy# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: rootpassword
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

3. 내장 서버

스프링: 스프링은 별도의 웹 서버(Tomcat, Jetty 등)를 설치하고 WAR 파일을 배포해야 합니다.

스프링부트: 스프링부트는 내장 서버(Tomcat, Jetty, Undertow)를 제공하여 JAR 파일만으로 손쉽게 배포가 가능합니다.

java -jar myapp.jar

4. 스프링부트의 특징

1. 자동 설정(Auto Configuration)

스프링부트는 개발자의 의도를 파악하여 필요한 설정을 자동으로 구성합니다. 예를 들어 spring-boot-starter-web을 추가하면 웹 개발에 필요한 모든 구성이 자동으로 설정됩니다.

2. 내장 서버

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

3. 스타터 의존성

다양한 목적에 맞는 의존성 패키지를 스타터(Starter)라는 이름으로 제공하여 쉽게 필요한 라이브러리를 추가할 수 있습니다.

spring-boot-starter-web: 웹 개발
spring-boot-starter-data-jpa: JPA 사용
spring-boot-starter-security: 보안 기능
spring-boot-starter-test: 테스트 환경

4. Actuator

애플리케이션의 상태를 모니터링하고 관리할 수 있는 기능을 제공합니다.

5. 설정의 외부화

애플리케이션 설정을 프로퍼티 파일, YAML 파일, 환경 변수 등으로 쉽게 관리할 수 있습니다.

5. 스프링부트의 구조

스프링부트는 다음과 같은 계층 구조로 이루어져 있습니다:

프레젠테이션 계층 (Presentation Layer)

  • HTTP 요청을 받고 비즈니스 계층으로 전달하는 역할
  • Controller 클래스가 이 계층에 해당
  • 클라이언트의 요청을 받아 적절한 서비스로 전달

비즈니스 계층 (Business Layer)

  • 모든 비즈니스 로직 처리
  • Service 클래스가 이 계층에 해당
  • 데이터 검증, 계산, 트랜잭션 처리 등을 담당

퍼시스턴스 계층 (Persistence Layer)

  • 데이터베이스 관련 로직 처리
  • Repository 클래스가 이 계층에 해당
  • 데이터 접근 및 조작 담당

데이터베이스 계층 (Database Layer)

  • 실제 데이터가 저장되는 계층
  • MySQL, Oracle, MongoDB 등의 데이터베이스가 이 계층에 해당

스프링부트 프로젝트의 일반적인 디렉토리 구조는 다음과 같습니다:

src
├── main
│   ├── java
│   │   └── com.example.demo
│   │       ├── DemoApplication.java (메인 애플리케이션 클래스)
│   │       ├── controller (컨트롤러 클래스)
│   │       ├── service (서비스 클래스)
│   │       ├── repository (레포지토리 클래스)
│   │       └── model (엔티티/모델 클래스)
│   └── resources
│       ├── static (정적 파일: CSS, JS, 이미지)
│       ├── templates (템플릿 파일: HTML)
│       └── application.yml (또는 application.properties)
└── test (테스트 코드)

6. 결론

스프링부트는 스프링의 장점을 유지하면서도 설정의 복잡성을 크게 줄였습니다. 이를 통해 개발자는 애플리케이션의 비즈니스 로직에 더 집중할 수 있게 되었습니다. 요약하자면:

  • 스프링: 유연하고 강력한 프레임워크이지만 복잡한 설정이 필요
  • 스프링부트: 스프링의 기능을 기반으로 하되, 간편한 설정과 빠른 개발이 가능한 프레임워크

초보 개발자부터 대규모 시스템을 구축하는 기업까지, 스프링부트는 그 간편함과 효율성으로 현재 자바 웹 개발의 표준으로 자리 잡았습니다. 스프링을 처음 배우는 분이라면 스프링부트로 시작하는 것이 학습 곡선을 완화시키는 좋은 방법이 될 수 있습니다.


참고 자료

profile
AI를 꿈꾸는 BackEnd개발자

0개의 댓글