Spring은 웹사이트 개발을 위한 백엔드 Framework이다.
JAVA 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 Spring이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다.
백엔드 프로세스를 구축하는데 있어 기본적인 뼈대를 제공해주어 높은 품질의 프로그램을 빠르게 개발할 수 있게된다.
- Framework : 프로그램 설계에 있어 미리 구축되어있는 뼈대
Whatever happened next, the framework needed a name. In the book it was referred to as the “Interface21 framework” (at that point it used com.interface21 package names), but that was not a name to inspire a community. Fortunately Yann stepped up with a suggestion: “Spring”. His reasoning was association with nature (having noticed that I'd trekked to Everest Base Camp in 2000); and the fact that Spring represented a fresh start after the “winter” of traditional J2EE. We recognized the simplicity and elegance of this name, and quickly agreed on it.
DI란 개발자가 Spring 프레임워크에 의존성을 주입하면서 객체 간 결합을 느슨하게 하는 것이다. 객체 간 결합이 느슨하면 코드의 재사용성이 증가하고, 단위 테스트가 용이.
IoC는 컨트롤의 제어권이 개발자에게 있는 것이 아닌 프레임워크가 대신해서 해주는 것. Servlet이나 Bean 같은 코드를 개발자가 직접 작성하지 않고, 프레임워크가 대신 수행.
제어의 역전은 기존에는 자바 코드를 작성할 때 객체의 생성, 의존관계 설정 등을 개발자가 해줘야 했지만, 프레임워크가 대신해준다는 의미.
AOP는 핵심기능을 제외한 부수적인 기능을 프레임워크가 제공하는 특징.
예시로 Spring 프로젝트에 security를 적용하거나, logging 등을 추가하고 싶을 때 기존 비즈니스 로직을 건들지 않고 AOP로 추가할 수 있다.
예를 들어 JDBC 같은 템플릿을 사용할 때 중복되는 코드도 많고 복잡하다. 이를 모두 제거.
JUnit, Mockito와 같은 유닛 테스트 프레임워크와 통합이 간단. 이를 통해 개발하는 프로그램의 품질이 향상.
Java Spring Framework는 Java Virtual Machine(JVM)에서 실행되는 프로덕션급 독립형 애플리케이션을 만들기 위한 인기 있는 엔터프라이즈급 오픈소스 프레임워크이다.
Java Spring Boot는 세 가지 핵심 기능을 통해 Spring Framework를 사용하여 더 빠르고 쉽게 웹 애플리케이션과 마이크로서비스를 개발하도록 돕는 툴이다.
우리가 사용하는 도구들에는 기본적으로 버전이 존재한다. 그리고 여러 도구들의 버전을 올바르게 조합해주지 않으면 예상치 못한 오류가 발생할 수 있다. 스프링 부트 개발자들은 이러한 문제점을 인지하고, 직접 라이브러리 버전들을 관리해준다. 그래서 maven이나 gradle 등과 같은 빌드 도구에 버전을 명시하지 않아도 적합한 라이브러리 버전을 찾아서 가져와준다.
개발을 진행하다보면 json 메세지 변환, 프로프티 설정 등 다양한 공통적인 설정들이 필요하다. 스프링 부트는 개발을 위해 필요한 공통적인 부분들을 자동으로 구성해준다. 그래서 우리는 기본적으로 스프링 부트 프로젝트를 만들면 별도의 설정 없이 서버를 바로 띄울 수 있다.
그 뿐만 아니라 스프링부트는 ElasticSearch, Redis, Gson 등과 같은 자주 사용되는 외부 라이브러리들 역시도 자동 설정을 제공하고 있다. 해당 의존성을 추가하면 클래스 패스 기준으로 의존성이 존재하는지 파악하여 자동으로 설정을 해준다.
과거의 스프링 프레임워크는 서버를 배포하기 위해 톰캣과 같은 별도의 외장 웹서버를 설치하고, war 파일을 생성하여 배포해주어야 했다. 이러한 방식은 상당히 번거롭고 처리 속도도 느렸는데, 스프링 부트는 내장 웹서버(톰캣 or 리액터 네티)을 가지고 있어서 별도의 작업 없이 빠르게 서버를 실행할 수 있도록 도와준다.
위에서 설명하였듯 스프링 프로젝트를 배포하기 위해서는 war파일을 만들어 외장 웹서버에 배포해야 했다. 하지만 스프링 부트는 순수 자바 애플리케이션 프로그램을 실행하는 것처럼 스프링부터 역시 jar로 실행 가능하도록 하였다. 그리고 이러한 부분은 애플리케이션 실행에 상당한 편리성을 제공해주고 있다.
SpringBoot 장점 출처 : https://mangkyu.tistory.com/208
다음은 Spring Boot 공식문서의 인용문이다.
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
해석
스프링 부트는 단독적이고, 상용화 수준의, 스프링 기반 애플리케이션을 단지 실행할 수 있을 정도로 쉽게 만들 수 있다.
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>
출처 : https://www.baeldung.com/spring-vs-spring-boot
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 만 추가해주면 된다.
Spring Framework의 경우 configuration설정을 할 때도 매우 길고, 모든 어노테이션 및 빈 등록 등을 설정해 줘야 한다. Spring Boot Framework는 application.properties파일이나 application.yml파일에 설정하면 된다.
예를 들어 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);
}
}
출처: https://www.baeldung.com/spring-vs-spring-boot
Spring Boot Framework에서 Thymeleaft을 사용하려면 다음과 같은 코드를 작성해야 한다.
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf
결론 적으로 Spring Framework는 기존에 EJB를 대신해 자바 애플리케이션을 더 쉽게 만들 수 있게 해 주고, Spring Boot Framework는 Spring Framework보다 개발자가 더더욱 개발에만 집중할 수 있도록 도와주는 프레임워크이다.