일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Container
- mysql
- 컨테이너
- spring boot
- spring batch
- ORM
- 백엔드
- 도커
- 웹 서버
- virtualization
- 가상화
- web server
- computer science
- JPA
- spring cloud
- Spring Security
- vm
- 스프링 부트
- CI/CD
- 영속성 컨텍스트
- HTTP
- 배포
- CS
- 자바
- 스프링
- 스프링 배치
- 스프링 시큐리티
- 데이터베이스
- Spring
- Java
- Today
- Total
개발 일기
[Spring Boot] Spring 생태계와 본질 본문
이전 게시글에서 어떻게 Spring이 등장하게 되었는지 알게 됐는데 Spring, Spring Framework, Spring Boot 등 이런 용어들이 각각 어떻게 다른 건지 Spring의 생태계에 대해 먼저 이해할 필요가 있다고 생각했고 그래서 도대체 그놈의 스프링이 어떻게 되어있는지 생태계에 대해 먼저 이해해보고자 한다.
Spring 생태계
우선 결론부터 말하자면 Spring안에 Spring Boot, Spring Framework, Spring Data, Spring Security 등이 포함된 것였다.
스프링 공식 문서에 들어가보면 관련 프로젝트들이 쭉 나열된 것을 볼 수 있다.
즉, Spring은 여러 기술(프로젝트)들의 모음이라고 보면 된다.
여기서 핵심이자 중심은 스프링 프레임워크이고 나머지 저런 다양한 기술들을 편리하게 사용할 수 있도록 도와주는 것이 스프링 부트라고 보면 될 것 같다. 즉, 스프링 부트는 단독으로 쓰이는 것이아니라 스프링 프레임워크를 편리하게 사용할 수 있도록 돕기 위해 같이 사용하는 것이다.
스프링 프레임워크(Spring Framework)
스프링 프레임워크는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션 개발을 위한 다양한 기능을 종합적인 프로그래밍 및 구성 모델을 제공하는 경량화된 솔루션이다.
이때 '엔터프라이즈급'이란 기업을 대상으로 하는 것으로 대규모 데이터 처리와 트랜잭션이 여러 사용자로 부터 행해지는 아주 큰 규모의 환경을 말한다.
스프링 프레임워크 공식 문서에서 스샷해 온건데 저렇게 핵심 기술들, 테스트, 데이터 접근 기술, 웹 기술, 기술 통합 그리고 언어와 관련된 부분 들이 포함되어 있다. 여기서 특히 Core technologies인 핵심 기술의 DI(컨테이너), AOP 등은 아주 중요하기 때문에 앞으로 공부하여 따로 게시글을 쓸것이다.
스프링 부트(Spring Boot)의 등장
점점 커져가는 스프링 생태계, 위의 스프링 프레임워크 기능들이 늘어나고, 다양한 오픈소스의 등장으로 외부라이브러리를 함께 사용할일이 많아졌다.
이렇게 스프링 생태계의 확장으로 인해 스프링으로 개발을 시작할때 직접 해야하는 초반 설정이 너무 많아지고 복잡해졌다.
바로 이것이 스프링 부트(Spring Boot)가 등장한 이유이다.
아래의 문장도 스프링 공식 문서의 스프링 프로젝트들 중 스프링 부트 공식 페이지에서 가장 처음으로 나오는 문장이다.
[Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".]
해석해보면 [스프링 부트가 그냥 실행할 수 있는 단독적이고, 상용화 수준의 스프링 기반의 어플리케이션을 쉽게 만들 수 있도록 해준다.] 라는 뜻이다. 여기서 "그냥 실행할 수 있다"라는 표현은 개발자가 복잡한 설정이나 서버 구성 없이 애플리케이션을 바로 시작할 수 있다는 것을 의미하는 것 같고 내 기준 가장 Spring Boot를 잘 설명할 수 있는 부분이 아닌가 싶다.
스프링 부트(Spring Boot)가 제공하는 기능들
1. Embeded Server
첫번째로는 바로 내장 서버이다.
스프링이 없던 시절에 직접 만든 웹 어플리케이션을 배포하려면 웹 어플리케이션 서버(WAS)를 설치하고 개발한 웹 어플리케이션을 war로 빌드하고 또 이 것을 WAS 폴더 하위에 넣은 뒤 WAS를 실행하는 과정을 거치는 복잡하고 귀찮은 과정을 거쳐야 하다.
그래서 스프링 부트가 WAS인 Tomcat(또는 Jetty)을 라이브러리로 포함하는 내장 톰캣(또는 Jetty)기능을 제공하게 됐다. WAR(Web Application Resource) 파일로 빌드하고, WAS에 배포하는 대신, JAR(Java ARchive) 파일로 패키징하여 직접 실행하면 되는 것이다.
위에 공식 문서에서 스프링 부트를 설명한 문장 중에 'stand-alone' 이라는 맥락에서 스프링 부트가 내장 톰캣을 사용한다는 것은, 별도의 외부 WAS 없이도 독립적으로 실행 가능한 애플리케이션을 만들 수 있다는 의미한다.
2. Dependency
두번째 기능은 바로 권장 버전 관리와 편리한 의존성이다.
이번에도 스프링 부트가 없던 시절을 먼저 얘기해보자면 어떤 라이브러리를 사용할지 먼저 고르고 각 라이브러리의 버전까지 고려해 줘야 했다. 그런데 이때 이렇게 사용할 라이브러리들과 각각의 버전까지 정해줬는데 특정 라이브러리들의 버전끼리 호환이 안되는 경우가 있다. 그래서 일일이 호환이 잘되는 조합을 찾아야 했다.
아래의 라이브러리 버전 관리 코드를 plugin에 추가해주게 되면 dependencies를 보면 각 라이브러리들의 버전을 일일이 지정해주지 않아도 되게 됐다.
id 'io.spring.dependency-management' version 'x.x.x'
또한 dependencies에서 아래와 같이 해준다면 기본적인 관련 라이브러리 묶음들을 제공해 준다.
dependencies {
// Spring MVC, Tomcat, Jackson 등
implementation 'org.springframework.boot:spring-boot-starter-web'
// JDBC, HikariCP 커넥션 풀 등
implementation 'org.springframework.boot:spring-boot-starter-jbdc'
// Spring Test, JUnit, Hamcrest, Mockito 등
implementation 'org.springframework.boot:spring-boot-starter-jbdc'
}
3. Configuration
세번째 기능은 바로 Configuration에 있다. 바로 자동 구성.
스프링 부트는 일반적으로 사용하는 수 많은 빈들을 자동으로 등록해준다.
'org.springframework.boot:spring-boot-autoconfigure:x.x.x'라는 모듈을 통해 자동 구성을 지원한다.
ex) JdbcTemplate, DataSource, TransactionManager 등
이 자동 구성에 대해서는 따로 정리해봐야할 것 같다.
그래서 스프링이라는 단어는?
김영한 강사의 말을 추가적으로 덧붙혀보면 스프링이란 단어는애매하다. 즉, 문맥에 따라 다르게 사용된다.
- 스프링 DI 컨테이너 기술
- 스프링 프레임워크
- 스프링 프레임워크 + 스프링 부트 + 기타 프로젝트들을 포함한 스프링 생태계
스프링의 본질 - 이 기술을 왜 만들었을까?
스프링에서 웹 서버를 자동으로 띄워주고 웹 어플리케이션을 만들때 사용하며 DB 접근을 편리하게 돕는 등은 핵심이 아니라고 한다.
진짜 핵심은 바로
- 자바 언어 기반의 프레임워크
- 따라서 자바 언어의 가장 큰 특징인 객체 지향 언어
- 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 좋은 객체 지향 어플리케이션을 개발할 수 있게 도와주는 프레임워크
라고 한다. 기존의 EJB는 EJB의 인터페이스 클레스에 의존적으로 개발하여 객체 지향적인 개발을 할 수 없었지만 이제는 가능하게 됐다.
이렇게 정리해보면서 앞으로 프레임워크에서 지원하는 다양한 핵심 기술, 웹 어플리케이션 서버(WAS), AutoConfiguration, 객체 지향에 대한 공부가 필요하다는 것을 느꼈다. 차근차근 처리해 나가야겠다.
'Back-End > Spring' 카테고리의 다른 글
[Spring Boot] Spring MVC - 구조 이해 (0) | 2024.05.02 |
---|---|
[Spring Boot] Spring 3대 특징(Spring 삼각형) 3 - 관점 지향 프로그래밍(AOP) (0) | 2024.03.13 |
[Spring Boot] Spring 3대 특징(Spring 삼각형) 2 - 의존성 주입(DI)과 제어의 역전(IoC) (1) | 2024.03.13 |
[Spring Boot] Spring 3대 특징(Spring 삼각형) 1 - POJO(Plain Old Java Object) (0) | 2024.03.09 |
[Spring Boot] Spring의 등장 배경 (0) | 2024.03.07 |