[Spring] Spring과 Spring Boot 차이점

Donghoon Jeong·2024년 1월 21일
0

Spring

목록 보기
15/15
post-thumbnail

Spring

Spring은 자바 기반의 웹 어플리케이션을 만들 수 있는 프레임워크입니다.

  • DI(Dependency Injection)

DI란, Spring에서 객체 간의 의존성을 객체 내부에서 개발자가 직접 호출하는 대신 Spring 컨테이너에서 객체를 생성해서 넣어주는 방식입니다.

  • IoC(Inversion of Control)

IoC는 컨트롤의 제어권이 개발자에게 있는 것이 아닌 Spring 컨테이너가 대신해서 해주는 것을 말합니다.

간단하게 기존에 자바 코드를 작성할 때는 객체의 생성, 의존관계 설정 등을 개발자가 직접 해줘야 했지만, Spring을 사용할 경우 Spring 컨테이너가 대신해준다는 의미입니다.

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

  • AOP(Aspect Oriented Programming)

AOP는 핵심 기능과는 별도로 부가적인 기능들을 프레임워크가 제공하는 프로그래밍 접근 방식입니다. 이것은 주로 코드의 공통된 관심사 즉 로깅, 트랜잭션 관리, 보안, 성능 측정에 대한 처리를 단순화하고 모듈화하는 데 사용됩니다.


Spring Boot

Spring Boot는 Spring의 문제점을 해결해 주기 위해 개발된 Spring의 프레임워크로 개발자들이 더 쉽고 빠르게 Spring 애플리케이션을 개발하도록 도와주기 위해 개발되었습니다.

  • 내장 서버

Spring Boot는 내장된 서버(내장 Tomcat, Jetty, Undertow)를 제공하여 별도의 서버 설정 없이 애플리케이션을 실행할 수 있습니다.

  • 라이브러리 관리 자동화

기존의 Spring 프로젝트에서는 해당 파일에 필요한 라이브러리의 버전 및 종속성을 수동으로 추가해야 했습니다.

하지만 Spring Boot는 Spring 기반의 프로젝트에서 특정 기능에 필요한 라이브러리 의존성을 간편하게 처리하기 위해 Starter라는 메커니즘을 제공합니다. Starter는 특정 기능 또는 역할을 하는 라이브러리들의 그룹이며, 이를 사용하면 필요한 라이브러리들을 자동으로 추가할 수 있습니다.

  • 라이브러리 버전 자동 관리

Spring 기반 프로젝트에서는 필요한 라이브러리의 버전을 수동으로 지정해야 했습니다. 또한, 프로젝트에 사용되는 다양한 라이브러리들 간의 버전 충돌을 방지하기 위해 개발자가 주의를 기울여야 했습니다.

Spring Boot는 Spring Boot 버전에 따라서 호환되는 라이브러리의 버전도 자동으로 관리합니다. 이로써 라이브러리 버전이 달라서 발생하는 호환성 문제를 줄이고, 개발자는 프로젝트 설정 파일에서 라이브러리 버전에 대한 명시적인 관리를 줄일 수 있습니다.

💡 Spring Boot가 Spring의 문제점을 어떤식으로 해결했는지 Spring과 Spring Boot의 차이점을 보면서 살펴보도록 하겠습니다.


Spring과 Spring Boot의 차이점

1. Dependency

plugins {
    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'
}

Spring의 경우 dependency를 설정해줄 때, 해당 파일에 필요한 라이브러리의 버전 및 종속성을 수동으로 추가해야 했습니다.

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

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

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

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

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

하지만 Spring Boot의 경우 위 코드와 같이 dependency를 Spring보다 쉽게 설정해 줄 뿐만 아니라, 버전 관리도 자동으로 해줍니다.

implementation 'org.springframework.boot:spring-boot-starter-web'

빌드 툴을 Gradle을 사용하는 경우 위와 같이 build.gradle파일에 다음과 같은 dependency를 추가해주면 Spring Boot로 웹 개발을 할 때 필요한 모든 dependency를 자동으로 추가하고 관리해줍니다.

id 'io.spring.dependency-management' version '1.1.4'

위 플러그인 코드가 dependency의 버전관리를 자동으로 해줍니다. 버전이 서로 호환되지 않을 경우 오류가 많이 발생하는데 Spring Boot를 사용할 경우 라이브러리 버전이 달라서 발생하는 호환성 문제를 줄이고 개발자는 프로젝트 설정 파일에서 라이브러리 버전에 대한 명시적인 관리를 줄일 수 있습니다.


2. Configuration

Spring의 경우 configuration설정을 할 때도 매우 길고, 모든 어노테이션 및 빈 등록 등을 설정 해줘야 하는 반면 Spring Boot에서는 application.yml파일이나 application.properties파일에 설정하면 됩니다.

@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;
    }
}

예를 들어 Spring에서 데이터베이스 연결을 하려면 다음과 같은 코드를 작성해야 합니다

# 데이터베이스 설정
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: rootpassword

# JPA 설정
spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

하지만 Spring Boot에서는 데이터베이스를 연결할 때, application.yml 또는 application.properties 파일을 사용하여 애플리케이션의 설정을 관리합니다.

3. 배포

Spring으로 개발한 애플리케이션의 경우, 다음과 같은 과정을 통해 배포를 하였습니다.

  1. WAS 설치

  2. 개발한 애플리케이션 코드를 WAR로 빌드

  3. 빌드한 WAR 파일을 WAS 하위 폴더에 넣음

  4. WAS를 실행

하지만 Spring Boot의 경우, Tomcat과 같은 내장 WAS를 가지고 있기 때문에 build 후에 jar 파일로 다음과 같은 명령어를 활용하여 간편하게 배포할 수 있습니다.

java -jar <파일명>.jar

정리

Spring Boot는 Spring을 기반으로 좀더 확장된 모듈로써, Spring의 DI, IoC, AOP와 같은 기능을 포함하고 있고, Spring의 단점이라고도 할 수 있는 복잡한 환경설정을 자동으로 해주고 내장 WAS를 가지고 있어 배포 또한 간편하게 해주기 때문에 개발자가 좀 더 개발에만 집중할수 있다는 장점이 있습니다.

profile
정신 🍒 !

0개의 댓글