Spring Boot란
Spring Boot를 알기 전에 우선 Spring Framework가 무엇인지, 왜 Spring Boot가 탄생했는지를 알면 좋습니다. 이번 포스팅은 Spring 프레임워크/Spring Boot가 무엇인지 작성하였습니다.
Spring Framework
스프링 프레임워크는 엔터프라이즈 애플리케이션을 개발하기 위한 경량 프레임워크 입니다.
이게 무슨 뜻인지 하나씩 파헤쳐 보도록 하겠습니다.
우선 엔터프라이즈 애플리케이션은 비즈니스 로직이 복잡한 기능을 가지고 있는 애플리케이션 혹은 여러가지 기능을 통합한 애플리케이션 이라고 할 수 있습니다. 그럼 프레임워크는 무엇일까요??
사실 개발자라면 프레임워크 라는 단어를 수도 없이 들어왔을 것입니다. 프레임워크는 매우 중요하고 기본적인 개념이니 다시 한 번 정의를 정리해 보고 넘어가도록 합시다.
Framework
용도에 맞는 일반적인 기능들을 보편적인 방식으로 제공하는 일종의 틀(Frame) 입니다. 즉, 소프트웨어를 개발할 때 일반적으로 재사용이 가능한 코드들이 있을텐데, 그런 코드들을 모아 만든 클래스와 라이브러리의 모임입니다.
응용 프로그램의 기본 코드 구조가 명백한 경우가 많기 때문에, 프레임워크를 사용하면 개발자는 비즈니스 로직에 더 집중하여 개발할 수 있고, 일반적인 기능들은 프레임워크가 처리하도록 할 수 있습니다. (스프링을 비롯해 대부분의 프레임워크가 추구하는 목적 중 하나가 이것입니다.)
즉, 개발된 애플리케이션을 실행하면 프레임워크의 코드가 개발자가 개발한 비즈니스 로직을 실행하는 형태입니다.
프레임워크와 라이브러리의 차이에 대한 좋은 비유를 찾아서 적어봤습니다.
프레임워크가 개발자가 작성한 코드를 제어하고 대신 실행한다면 그것은 프레임워크가 맞습니다.
반면에 개발자가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리입니다.
개발하기 전에 어떤 프레임워크를 사용할지 결정해야 하는데, 한 번 프레임워크를 선정하면 개발 과정에서 프레임크에 의존성이 생기므로 (lock-in, 락인) 개발 초기 단계에서 프레임워크를 선정하는 일은 매우 중요합니다. 그리고 프레임워크를 사용하는 개발자는 프레임워크가 제공하는 기능과 개발 방법을 잘 알아야겠죠?
다시 돌아와서, 스프링 프레임워크를 정의해보면, 복잡한 기능을 가지는 프로그램을 개발을 할 때 스프링이 제공하는 구조에 맞추어 코드를 작성할 수 있는 가벼운 프레임워크 라고 할 수 있겠습니다.
스프링은 POJO(Plain Old Object)를 지향합니다. 즉, 순수하데 자바만 이용해 만든 객체를 사용하겠다는 뜻입니다. 이로 인해, 외부 라이브러리의 변화, 특정 기술이나 환경에 종속되지 않게 되어 변화에 대처하기 쉽고, 서비스 확장과 관련된 부담이 적습니다. 코드가 단순해지고 객체지향 설계를 외부 요인의 제한 없이 사용할 수 있다는 점에서 스프링의 강점으로 꼽힙니다.
스프링은 POJO를 지향하기 위해 아래와 같은 기술들을 지원합니다.
- DI(dependency injection)
- IoC(inversion of Control)
- AOP(Aspect-Oriented Programming)
- PSA(Portablr Service Abstraction)
그럼 이제 Spring Boot는 무엇인지 알아보겠습니다. 사실 스프링 부트와 스프링은 같은 개념이라고 할 수 있습니다.
그럼 왜 개발되었냐... 바로 스프링 프레임워크를 사용하기 위해서 개발자들이 초기에 세팅해야 하는 설정들이 많았는데 그런 부분들을 줄이고 편리하게 스프링 기능을 사용하기 위해서 입니다. 즉 아래와 같이 정의될 수 있겠네요.
Spring Boot
스프링 프레임워크를 쉽게 사용할 수 있도록 여러 편의 기능을 제공하는 프레임워크
결국, Spring Framework를 사용할 때 개발자가 설정해야 할 여러가지 설정 과정들을 생략할 수 있도록 편리하게 자동 설정을 제공해, Spring Framework를 편리하게 사용할 수 있도록 하는 프레임워크라고 할 수 있습니다.
앞으로 스프링 부트를 사용하며 개발을 진행하며 스프링 부트에 대해서 공부할 예정이지만 우선 스프링 프레임워크를 사용하면 좋은 점들을 나열해보겠습니다.
- 스프링 부트가 제공하는 자동 설정 기능(xml 설정 필요 없이 사용 가능)은 애플리케이션 개발을 더 쉽게 해줍니다.
- 자동 구성(auto-configuration)과 starter 기능, 애플리케이션의 상태를 제공해 주는 actuator가 있어서 매우 쉽고 빠르게 애플리케이션 서버를 만들 수 있습니다.
- 스프링 부트 스타터 (spring-boot-starter): 어떤 웹 프로젝트를 하나 실행하려면 스프링 웹 MVC, 내장 톰캣, LOG 등등 다양한 라이브러리가 필요하고 사용되는데, 개발자가 하나 하나 다 라이브러리를 추가하는 대신 스프링 부트가 프로젝트를 시작하는 데 필요한 관련 라이브러리를 모아두어서 제공하는 기능으로, 누구나 쉽고 편리하게 프로젝트를 시작할 수 있습니다.
- 자주 사용하는 스프링 부트 스타터
- spring-boot-starter: 핵심 스타터, 자동 구성, 로깅, YAML
- spring-boot-starter-jdbc: JDBC, HikariCP 커넥션 풀
- spring-boot-starter-data-jpa: 스프링 데이터 JPA, 하이버네이트
- spring-boot-starter-data-mongodb: 스프링 데이터 몽고
- spring-boot-starter-data-redis : 스프링 데이터 Redis, Lettuce 클라이언트
- spring-boot-starter-thymeleaf : 타임리프 뷰와 웹 MVC
- spring-boot-starter-web : 웹 구축을 위한 스타터, RESTful, 스프링 MVC, 내장 톰캣
- spring-boot-starter-validation : 자바 빈 검증기(하이버네이트 Validator)
- spring-boot-starter-batch : 스프링 배치를 위한 스타터
- 스프링 부트는 개발자 대신 수 많은 라이브러리 버전을 직접 관리해줍니다. 즉, 개발자가 라이브러리 버전을 생략해도 스프링 부트가 스프링 버전에 맞는 최적화된 라이브러리 버전을 선택해줍니다.
- (관련 기능을 위한 플러그인: io.spring.dependency-management)
- 물론 외부 라이브러리의 버전을 변경하는 것도 가능합니다.
- Web 애플리케이션 이외에도, 비동기 애플리케이션, 배치 애플리케이션 등 수많은 종류의 애플리케이션을 만들 수 있습니다.
- 애플리케이션에 내장된 WAS를 이용하여 Dev, Stage, Prod에서 일관된 실행 환경을 가질 수 있습니다.
이제 차근차근히 스프링 부트를 배워나가도록 합시다!!