1일1복습

[스프링] Spring 과 Spring Boot 의 차이

nayeonee__ 2024. 5. 16. 22:07

Spring

출처 :  Spring.io

 

  • Java 기반 애플리케이션 개발을 지원하는 오픈소스 애플리케이션 프레임워크

: 스프링이 사용되기 이전에는 초기 기업에서 EJB(Enterprise Java Bean) 방식의 기술을 이용해서 Web Application 을 서비스했다. EJB 는 데이터베이스 처리 및 트랜잭션 처리 등 기업용 애플리케이션 개발에 필요한 기술을 제공했다.

: 특정 회사의 EJB 컨테이너가 없이는 기술이 구현이 어렵고 프로그래밍 모델이 복잡하며, 자동화된 테스트가 거의 불가능하다는 치명적 단점을 가지고 있다.

  • 이러한 EJB 의 단점을 해결하여, 순수 자바 객체(POJO)만을 사용하여 복잡성을 제거하고, 단순하고 가벼운 코드로 기업용 애플리케이션을 개발하기 위한 목적으로 개발된 프레임워크이다.

: POJO(Plain Old Java Object)

  • 특정한 규약이나 프레임워크에 종속되지 않는 간단하고 순수한 자바 객체를 의미한다.
  • POJO 는 객체지향 개발의 원칙에 충실한 객체를 말하고, 특정한 제약이나 요구사항에 종속되지 않고 유연하고 확장 가능한 코드를 작성할 수 있도록 도와준다.

 

Spring 특징 4가지

제어의 역전 - Inversion Of Control

  • 스프링은 객체의 생명 주기 및 의존성 관리를 담당하는 IoC 컨테이너를 제공한다.
  • 개발자는 객체의 생성과 관계 설정을 스프링에 위임할 수 있고, 스프링 컨테이너가 객체의 생명 주기를 관리하고 필요한 의존성을 주입한다.

 

의존성 주입 - Dependency Injection

  • 스프링은 의존성 주입을 통해 객체 간의 관계를 설정함

 

AOP 지원 (관점 지향 프로그래밍)

  • 스프링은 AOP 를 지원하여 애플리케이션의 핵심 비즈니스 로직과 부가적인 기능(로깅, 트랜잭션 관리 등)을 분리하여 모듈화할 수 있다.
    • 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것

 

웹 개발 지원

  • 스프링은 웹 애플리케이션 개발을 위한 다양한 기능과 웹 프레젠테이션 계층을 제공한다.
  • 스프링 MVC 는 유연하고 확장 가능한 웹 애플리케이션을 개발할 수 있는 MVC 아키텍처를 지원한다.

 

이런 특징들은 스프링을 사용하여 애플리케이션을 더 유연하고 모듈화된 구조로 개발하고 관리할 수 있도록 돕지만, 몇 가지 문제점을 가지고 있다.

 

 

Spring Boot

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

  • 스프링 부트는 단독적이고, 상용화 수준의, 스프링 기반 애플리케이션을 단지 실행할 수 있을 정도로 쉽게 만들 수 있다고 공식문서에 나와있다.
  • 개발자가 설정 파일을 작성할 필요 없이, 프로젝트의 설정과 라이브러리 의존성을 자동으로 처리해주는 기능을 제공한다.
  • 또한 실행 가능한 JAR 파일을 만들 수 있다.
  • Spring 에서 제공하는 여러 기능들을 자동으로 설정하여 개발자가 보다 쉽게 사용할 수 있도록 해준다.
    • 예를 들어 Spring Boot 는 Spring MVC, Spring Data JPA, Spring Security 등의 기능을 자동으로 설정하며, 개발자가 별도로 설정 파일을 작성하지 않아도 사용할 수 있다.
  • Actuator 라는 모니터링과 관리를 위한 기능을 제공하여, 애플리케이션의 상태를 모니터링하고, 필요한 조치를 취할 수 있도록 해준다.

 

SpringSpring Boot 의 차이점

1. Dependency

  • Spring Framework 의 경우 dependency 를 설정해 줄 때 설정 파일이 매우 길다.
  • 모든 dependency 에 대해 버전 관리도 하나하나 해줘야 한다.
    • 다음은 Spring Framework 에서 web 에 대한 dependency 를 추가하는 코드이다.
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>5.3.5</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.3.5</version>
      </dependency>

 

  • Spring Boot Framework 의 경우 dependency 를 Spring Framework 보다 쉽게 설정해줄 수 있다.
  • 버전 관리도 자동으로 해준다.
    • 다음은 Spring Boot Framework 에서 web 에 대한 dependency 를 추가하는 코드이다.
  • implementation 'org.springframework.boot:spring-boot-starter-web'

 

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

 

: 또 다른 예시로는 Spring Framework 의 경우 test 프레임워크를 사용하고자 할 때 Spring Test, JUnit, Hamcrest, Mockito 등 모든 라이브러리를 추가해줘야 하지만, Spring Boot 에서는 spring-boot-starter-test 만 추가해주면 된다.

 

 

2. Configuration

  • Spring Framework 의 경우 configuration 설정을 할 때도 매우 길고, 모든 어노테이션 및 빈 등록 등을 설정해 줘야 한다.
    • 예를 들어 Spring Framework 에서 Thymeleaf 템플릿을 사용하려면 다음과 같은 코드를 작성해야한다.
    @Configuration
    @EnableWebMvc
    public class MvcWebConfig implements WebMvcConfigurer {
    
        @Autowired
        private ApplicationContext applicationContext;
    
        @Bean
        public SpringResourceTemplateResolver templateResolver() {
            SpringResourceTemplateResolver templateResolver = 
              new SpringResourceTemplateResolver();
            templateResolver.setApplicationContext(applicationContext);
            templateResolver.setPrefix("/WEB-INF/views/");
            templateResolver.setSuffix(".html");
            return templateResolver;
        }
    
        @Bean
        public SpringTemplateEngine templateEngine() {
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver());
            templateEngine.setEnableSpringELCompiler(true);
            return templateEngine;
        }
    
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            ThymeleafViewResolver resolver = new ThymeleafViewResolver();
            resolver.setTemplateEngine(templateEngine());
            registry.viewResolver(resolver);
        }
    }
  • Spring Boot Frameworkapplication.properties 파일이나 application.yml 파일에 설정하면 된다.
    • Spring Boot Framework 에서 Thymeleaf 를 사용하려면 다음과 같은 코드를 작성해야 한다.
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf

 

 

🌱 Spring Boot 의 강력한 AutoConfiguration

  • Spring 과 달리 Spring Boot 에는 AutoConfiguration 이라는 것이 있다.
  • Spring Boot 로 실행할 수 있는 애플리케이션을 만들기 시작하면 클래스에 @SpringBootApplication 이라는 어노테이션을 확인할 수 있다.
    • 어노테이션
      • 사전적 의미 : 주석
      • 자바에서는 코드 사잉에 주석처럼 쓰이고, 특별한 의미, 기능을 수행하도록 하는 기술이다.
      • 즉, 프로그램에게 추가적인 정보를 제공하는 메타데이터이다.
  • 이 어노테이션을 제거하고 프로그램을 실행하면, 일반적인 자바 프로그램과 동일하게 실행된다.
  • 해당 어노테이션 덕분에 많은 외부 라이브러리, 내장 톰캣 서버 등이 실행될 수 있다.

 

 

3. 편리한 배포

  • Spring 으로 개발한 애플리케이션의 경우, war 파일을 Web Application Server 에 담아 배포했다.
    • 내장된 WAS 가 없기에 따로 설정해줘야 한다.
  • Spring Boot Framework 의 경우, Tomcat 이나 Jetty 같은 내장 WAS 를 가지고 있기 때문에 jar 파일로 간편하게 배포할 수 있다.
  • Spring 으로 WAS 를 정하고, 모든 설정을 마쳐 배포를 하는 것 보다 훨씬 간단한 배포 방법이다.

 

 

마무리

  • 스프링은 프레임워크이며, 스프링 부트는 스프링 프레임워크를 기반으로 한 도구이다.
  • 스프링은 설정 파일을 작성해야 하지만, 스프링 부트는 자동 설정을 제공하여 간편하게 개발할 수 있다.
  • 스프링 부트는 내장 서버를 제공하여 쉽게 웹 애플리케이션을 실행할 수 있다.

❓ 어떠한 용도로 SpringSpring Boot 를 사용해야 할까?

Spring 은 개발자가 직접 설정 파일을 작성하고, 빈 객체를 등록하고, 빈 객체 간의 의존성을 설정하는 것을 요구한다.

반면, Spring Boot 는 개발자가 보다 쉽게 스프링을 사용할 수 있도록 설정과 의존성 처리 등을 자동으로 처리한다.

⇒ 즉, Spring 은 스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에, Spring Boot 는 빠르고 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에 사용된다.

 

 

 

참고 블로그

Spring과 Spring Boot의 차이점을 아시나요? I 이랜서 블로그

[Spring] Spring VS Spring Boot 차이점

[Spring] Spring과 Spring Boot의 차이점, Hibernate, Bean scope, Bean 생명주기

Spring 과 SpringBoot 의 차이점