티스토리 뷰

Spring을 몇년동안 계속 써왔고 내가 잘한다고 생각되는 부분은 어느 상황에서 어느 library가 필요하고 이건 Spring의 몇 버전과 호환이 되고 설정파일(applicationContext)은 어떻게 구성을 해야 하고 등등 AA가 해야 할 일들이었다. 즉 개발 외적인 부분들에 대해서 많이 익숙한 상태였다. 하지만 Springboot가 나오면서 내가 잘하는 부분이 사라졌다. 왜냐면 이런 고민들을 하지 않게 나온것이 바로 Springboot이기 때문이다. 뭐든 좀 공부해서 잘한다 싶으면 기술이 빠르게 바뀌어 다시 초기화 상태가 되어버리는것 같다. 잡설은 그만하고 주요 차이점들에 대해 살펴보겠다. 


dependency 관리

위에서 언급한대로 예전에 Spring으로 프로젝트 하나 구성을 하려면 필요한 라이브러리들이 뭔지 모두 알아야 하고 이것들을 초반에 세팅을 해 놓아야 했다. 이를테면 batch 프로젝트 하나 구성을 하려면 다음과 같이 dependency 설정이 필요했다. 

Spring

<dependencies>
	<!-- Spring batch -->
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>${org.springframework.batch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-infrastructure</artifactId>
        <version>${org.springframework.batch.version}</version>
    </dependency>
        
    <!-- Logging -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.5</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.14.1</version>
        <scope>compile</scope>
     </dependency>
     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>1.7.32</version>
        <scope>compile</scope>
     </dependency>
... 생략

이건 일부이고 더 많은 dependency가 하나의 프로젝트를 구성을 하는데 있어서 필요하다. 구성을 할 때 각 dependency의 버전 호환성도 알고 있어야 하고 이런 버전에 대한 관리도 직접 해야 한다. 

 

하지만 Springboot에서는 이 모든게 그냥 하나의 dependency 설정으로 끝이 날수도 있다. 바로 Springboot의 핵심인 spring-boot-starter를 이용하면 된다. Spring에서 일일히 하나씩 dependency 설정을 했다면 Springboot에서는 다음과 같이 하면 된다.

 

Springboot

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

가장 간단한 batch 프로젝트 하나를 구성하기 위해서는 위와 같은 dependency만 하나 추가하면 당장 사용이 가능하다. spring-boot-starter-batch 안에 batch 작업을 하기 위해 필요한 dependency가 모두 들어있기 때문에 이렇게 설정이 가능하다. (이 글은 차이점을 설명하기 위한 글이라 starter-parent에 대한 부분은 다루지 않겠다. )

 

spring-boot-starter-batch dependency

실제로 spring-boot-starter-batch의 hierarchy를 살펴보면 아래에 수많은 dependency가 들어가 있음을 확인할 수 있다. Spring이 자유여행 이라면 Springboot는 패키지여행 같은 느낌이다. Spring은 내가 일일히 하나하나 다 추가를 해야 하는 번거로움은 있지만 최적화를 할 때 강점이 있고 Springboot는 편하게 한방에 다 할수 있지만 위에서 보다시피 수많은 dependency가 내재되어 있어 이를 최적화하기 위한 노력이 필요하다. 


설정방법

가장 큰 꼭지중에 하나가 바로 이 설정방법의 차이이다. Spring에서는 하나하나 bean을 생성해야 했고 이에 대한 관리도 직접 했어야 했는데 Springboot에서는 이중 많은 부분을 @SpringBootApplication 라는 Springboot의 선언으로 간편하게 사용할 수 있다. @SpringBootApplication은 @Configuration + @EnableAutoConfiguration + @ComponentScan를 뜻하는데 이렇게 선언하므로서 설정 자동화 및 ComponentScan까지 하겠다는 것이다. 

@EnableAutoConfiguration은 Springboot의 meta 파일을 읽어서, 미리 정의되어 있는 자바 설정 파일(@Configuration)들을 빈으로 등록하는 역할을 수행을 한다. 여기서 meta 파일이란 spring.factories 파일을 뜻하며 이곳에 있다. 

spring.factories

# Logging Systems
org.springframework.boot.logging.LoggingSystemFactory=\
org.springframework.boot.logging.logback.LogbackLoggingSystem.Factory,\
org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.Factory,\
org.springframework.boot.logging.java.JavaLoggingSystem.Factory

# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader

# ConfigData Location Resolvers
org.springframework.boot.context.config.ConfigDataLocationResolver=\
org.springframework.boot.context.config.ConfigTreeConfigDataLocationResolver,\
org.springframework.boot.context.config.StandardConfigDataLocationResolver

# ConfigData Loaders
org.springframework.boot.context.config.ConfigDataLoader=\
org.springframework.boot.context.config.ConfigTreeConfigDataLoader,\
org.springframework.boot.context.config.StandardConfigDataLoader

....

@EnableAutoConfiguration이라는 어노테이션은 Springboot에서 미리정의한 위와 같은 설정(configuration)들을 사용하게되어서 우리는 아무설정없이 SpringBoot를 이용하는 것처럼 보이게 해준다. 

즉 이것도 Spring은 자유여행, Springboot는 패키지여행 과 같은 개념이다. 최적화를 위해서는 @EnableAutoConfiguration는 쓰되 사용하지 않는 설정들에 대해서는 exclude가 필요하다. 


Embedded WAS

세번째 큰 차이점은 바로 내장 WAS이다. Spring으로 구성된 application은 일반적으로 WAS(Tomcat, JEUS, WebLogic..) 위에서 배포되어 동작이 된다. 하지만 Springboot에는 내장 WAS가 있어서 jar (or war)만 가지고서 자체적으로 application을 실행시킬 수 있다. 이런 점은 요즘 유행하는 Container 환경에서 아주 요긴하게 사용될 수 있으므로 시너지가 나서 더욱 대세로 자리잡는듯 하다. 

 

Springboot는 여러가지 종류의 내장 WAS를 가지고 있고 이중 하나를 선택해서 사용할 수도 있으며 선택을 하지 않을수도 있다. 

spring-boot-starter-web includes 

 

  • spring-boot-starter-tomcat
  • spring-boot-starter-jetty
  • spring-boot-starter-undertow

이렇듯 tomcat, jetty, undertow 와 같은 웹서버를 사용할 수 있다. 이것들을 사용하지 않으려면 다음과 같이 설정한다.

spring.main.web-application-type=none

application에 내장되어 있는 WAS이니만큼 WAS의 설정도 모두 application에서 해야 한다. 

이에 대한 설정방법은 spring guide를 참조하도록 하자. 

 

Spring과 Springboot의 주요 차이점에 대해 살펴보았다. 혹시 Spring을 Springboot로 migration 할 계획이 있다면 다음 글을 참조해서 전환하도록 하자. 

 

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (1) - pom.xml

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (2) - web.xml

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (3) - 파일 추가 및 변경

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (4) - logback

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (5) - 빌드 및 실행

spring 프로젝트에서 springboot 프로젝트로 migration 하기 (6) - XML config to JAVA

 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30