본문 바로가기

Spring

Spring과 Spring Boot의 차이점

반응형

스프링이란?

💡 Spring은 자바 프로그래밍을 모든 사람들에게 더 빠르고, 더 쉽고, 더 안전하게 만들어줍니다. Spring은 속도, 단순성, 그리고 생산성에 집중한 자바를 세계에서 가장 인기 있는 프레임워크로 만들었습니다.

  • 스프링은 여러 프로젝트를 포함한 프레임워크로, 객체지향 어플리케이션을 개발할 수 있도록 도와주는 프레임 워크입니다.
  • 스프링은 DI와 DI Container, AOP, Web MVC등을 지원해 객체지향적인 어플리케이션을 개발하도록 도와줍니다.

DI란?

  • DI는 Dependency Injection의 약자로, 특정 객체의 생명주기를 관리하고 의존성을 주입시켜주는 역할을 합니다.
  • Spring에서는 이러한 DI를 소스코드가 아닌 외부 파일(.xml 등)을 통해 정의해주어야 했습니다.

Spring의 문제점

  • 기존의 스프링 생태계가 커짐에 따라 스프링의 기능이 많아지고, 이에 수많은 라이브러리를 함께 사용해야해 프로젝트를 시작할 때 필요한 설정이 점점 늘어났습니다.
  • 이렇게 라이브러리를 직접 관리해주어야 하는 문제는 라이브러리간 충돌이나 버젼 충돌 문제가 발생했습니다.
  • 또한 라이브러리를 사용하기 위해서 개발자가 직접 빈을 일일히 등록해주어야 하는 문제도 존재했습니다.

Spring Boot란?

  • Spring Boot는 스프링 어플리케이션의 불편한 점을 보완하는 프레임워크로 개발을 위한 복잡한 설정을 해결하고 스프링 어플리케이션을 쉽고 빠르게 시작하기 위해 제공되기 시작했습니다.
  • 스프링 부트에서 제공하는 기능은 다음과 같습니다.
  1. WAS 제공
    • Tomcat, Jetty 등의 웹서버를 내장해서 별도의 웹 서버 프로그램 설치 없이 단순한 실행만으로 웹 서버를 제공합니다.
  2. 라이브러리 관리
    • Starter Dependency를 제공해 특정 프로젝트를 진행하기 위한 라이브러리를 자동으로 관리합니다.
  3. 자동 구성
    • 프로젝트에 기본적으로 필요한 빈을 자동으로 등록해줍니다.
  4. 외부 설정
    • 환경에 따라 달라지는 외부 설정을 공통화하여 환경에 따라 구분해서 제공합니다.
  5. 프로덕션 준비
    • 모니터링을 위한 메트릭, 상태 확인 기능을 제공합니다.

장점 1 : WAS 제공

  • 전통적인 방법은 Java파일을 빌드한 war 파일을 Tomcat과 같은 WAS에 전달해서 배포하는 식으로 동작합니다.
  • 최근에는 Spring Boot에 톰캣을 라이브러리 형태로 제공해서, 개발자는 main() 메서드만 실행해 서버를 실행할 수 있습니다.
public class EmbedTomcatServletMain {
	public static void main(String[] args) throws LifecycleException {
	
		//톰캣 설정
		Tomcat tomcat = new Tomcat();
		Connector connector = new Connector();
		connector.setPort(8080);
		tomcat.setConnector(connector);
		
		
		//서블릿 등록
		Context context = tomcat.addContext("", "/");
		tomcat.addServlet("", "helloServlet", new HelloServlet());
		context.addServletMappingDecoded("/hello-servlet", "helloServlet");
		tomcat.start();
	}
}

 

장점 2 : 라이브러리 관리

  • 프로젝트 초기에는 라이브러리를 수동으로 등록해 주어야 했습니다. 이러한 문제는 라이브러리 충돌 및 버젼 관리에 어려움이 있었습니다.
  • 이에 대해 스프링 부트는 Starter Dependency를 제공해 특정 기능에 대해 필요한 라이브러리를 묶어서 관리해 제공해주며, build.gradle에 라이브러리 버젼을 생략하면 스프링 부트가 자동으로 버젼을 관리하는 기능도 제공해줍니다.
  • 자동 버젼 관리를 사용하려면 build.gradle에 아래와 같이 한줄만 추가하면 됩니다. 
  • plugins { id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' }
  • 물론 다해주는 건 아니고, 아래 사이트에 존재하는 거만 제공하고 없는건 직접 적어줘야 합니다. Managed Dependency Coordinates :: Spring Boot
  • Starter Dependecy는 아래와 같이 라이브러리 추가하듯 추가하면 되고, 그러면 안에 해당 기능을 개발할 때 필요한 라이브러리를 알아서 불러옵니다.
    dependencies {
     implementation 'org.springframework.boot:spring-boot-starter-web'
    }

장점 3. 자동 구성

  • Spring Boot는 Auto Configuration이라는 기능을 제공합니다. 이러한 기능은 반복적으로 빈을 설정하고 등록하는 부분을 줄여줍니다.
  • AutoConfiguration은 Spring-Boot-Starter에 spring-boot-autoconfigure 라이브러리가 도와주며, 여기서 XXXAutoConfiguration.class 같은 파일들이 있어서, 사용자가 특정 빈을 등록하지 않은 경우 위 클래스에서 정의한 기본 빈을 주입하게 됩니다.
  • Spring Boot로 생성한 Spring App은 메인 메서드에 @SpringBootApplication 이 존재하는데, 이 어노테이션에는 @ComponentScan과 @EnableAutoConfiguration , @SpringBootConfiguration이 포함되어 있습니다.
  • 이중에 @EnableAutoConfiguration을 통해 스프링에서 자주 사용되는 빈을 등록합니다.
    • ImportSelector는 @EnableAutoConfiguration에 Import되어 사용되며, 스프링에서 동적으로 설정 정보를 등록하도록 제공하는 인터페이스입니다.
    • public class HelloImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"hello.selector.HelloConfig"}; } }
    • 위와같이 문자열로 Import할 Config 클래스를 지정해서 넘겨줄수 있는데, 여기서 resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports의 값을 읽어서 빈으로 등록합니다.
  • 만약 내가 라이브러리를 개발하는 개발자이고, 내가 만든 라이브러리가 스프링 부트의 자동 구성으로 등록되도록 하고 싶으면, 아래와 같이 할 수 있습니다.
@AutoConfiguration
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig {
	@Bean
	public MemoryController memoryController() {
		return new MemoryController(memoryFinder());
	}
	
	@Bean
	public MemoryFinder memoryFinder() {
		return new MemoryFinder();
	}
}
  • @AutoConfiguration을 사용해 어노테이션을 등록하고, 자동 구성 대상 src/main/resources/META-INF/spring/ org.springframework.boot.autoconfigure.AutoConfiguration.imports 에 작성해 주어야 합니다.
package.자동구성하려는Config클래스명

장점 4 : 외부 설정

  • 하나의 어플리케이션에 대해 다른 설정값을 사용해야 하는 경우가 있습니다. 이러한 경우에 설정값에 따라 여러 jar파일을 생성하는 방법도 있지만, Spring Boot에서는 jar파일에 설정값을 두지 않고 실행 시 외부 설정 값을 주입하도록 지원합니다.
  • 외부 설정에는 OS환경변수, JVM 환경 변수(시스템 속성), command line argument, 외부 파일이 있으며 스프링은 이렇게 다양한 설정 값을 하나의 인터페이스에 통합해 관리해줍니다.
  • 스프링에서는 Environment 인터페이스를 제공하며, 이 Enviroment 구현체에는 PropertySource를 연결해 두어 사용합니다. PropertySource는 위에서 말한 4가지 외부 설정 방법에 대해 값을 제공해주는 추상 클래스입니다.
  • Environment말고도 @Value 와 @ConfigurationProperties 로도 읽을 수 있도록 지원합니다.

참고

반응형