우아한테크코스 테코톡
오잉의 Spring vs Spring Boot
카테고리 : 우아한테크코스 테코톡
https://youtu.be/TSCHTPZ3PSQ?si=oMVsMJPoBldXddMZ
오잉의 Spring vs Spring Boot
Spring 생태계
- 스프링이란 하나의 기술이 아니고 여러 가지 스프링 프로젝트들의 모음 이다
- 스프링 홈페이지에 들어가 보면 다양한 스프링 프로젝트들을 확인할 수 있다 이 모든 스프링 프로젝트 들은 스프링 프레임워크를 기반으로 동작한다
- 스프링 생태계가 점점 커져 가고 스프링 프레임워크가 제공하는 기능들이 많아지면서 이런 기능들을 잘 사용하는데 어려움이 생기게 되었다 그래서 등장한 서브 프로젝트가 바로 스프링부트이단
Spring Framework
- 스프링 공식 홈페이지에 들어가 보면 이런 식으로 스프링 프레임워크를 설명하고 있다
- 자바 기반의 어플리케이션을 만들 수 있다
- 개발자들은 비즈니스 로직에 집중할 수 있다
- 스프링 이전에 EJB라는 프레임워크가 있었다 EJB는 2000년대 초반에 등장한 프레임워크로 사실상 스프링 같은 기능을 제공하는 프레임워크라고 생각하면 된다
- EJB의 목적은 편리한 어플리케이션 개발 이었는데 여기서 편리한 어플리케이션 개발이란 개발자들이 복잡하고 어려운 로우 레벨 기술에 신경을 쓰기 보다는 정말 중요한 애플리케이션의 핵심인 비즈니스로직을 좀 더 빠르고 효과적으로 개발할 수 있도록 돕는 것을 뜻한다 하지만 실제로 사용하기에 너무 비쌌고 비즈니스 로직 보다 EJB를 사용하기 위해서 따로 구현하거나 상속해야 되는 코드들이 너무 많았다 그래서 EJB에 너무 의존적이고 종속적인 개발을 할 수 밖에 없어서 기존 자바의 최대 장점이었던 객체 지향을 살릴 수 없게 된다
- EJB의 복잡하므로 많은 개발자들이 갖고 있던 와중에 등장한 프레임워크가 바로 스프링이다 스프링이 이름이 스프링 즉, 봄인 이유도 추운 겨울이었던 EJB를 지나 맞이한 봄이라는 뜻을 갖는다
- 스프링은 초기 설정만 잘 해두면 EJB와 거의 동일한 기능을 제공하면서 EJB의 목적이었던 비즈니스 로직과 어플리케이션 기술의 분리라는 목적도 성공적으로 달성 할 뿐 아니라 자바의 최대 장점인 객체 지향을 최대한 살려서 개발할 수 있다는 점에서 굉장히 메리트가 있는 프레임워크이다
- 하지만 스프링에도 문제가 있었는데 스프링 생태계가 점점 커져가고 스프링 프레임워크의 기능이 많아지면서 많아질 뿐만이 아니고 오픈소스가 등장하면서 스프링 프로젝트 안에서 외부 라이브러리들을 끌고 와서 같이 해야 되는일이 되게 많아졌다 스프링 프레임워크는 초기 설정만 잘 해주면 굉장히 좋은 프레임워크다 라고 했는데 스프링으로 개발을 시작할 때 직접 해야 하는 설정이 너무 많아 지고 복잡해져서 개발자들이 개발을 한다기보다는 초반 설정을 하느라 대부분의 시간을 쓰게 된다 그래서 등장한 것이 스프링 부트 이다
- 스프링 부트를 사용하면 스프링 기반의 어플리케이션을 쉽게 만들 수 있다 스프링을 이용한 개발에 필요한 복잡한 설정 과정을 다 스프링 부트가 해줌으로써 개발자들은 복잡한 설정 과정 필요 없이 즉시 어플리케이션 개발을 시작할 수 있게 된다
- 스프링 부트도 스프링 생태계에 포함되어 있는 스프링 프로젝트 중에 하나이기 때문에 단독으로 사용할 수 없고 스프링 프레임워크와 항상 같이 사용해야 한다
Spring Boot
내장 서버
- 스프링 부트가 없던 시절에 웹 어플리케이션을 한번 만들어서 배포를 하려면 먼저 WAS를 설치를 하고 내가 만든 어플리케이션 코드를 WAR로 빌드를 하고 WAR 파일을 WAS에 넣고 WAS를 실행했어야 했다
- 스프링 부트는 톰캣을 라이브러리로 포함하는 내장 톰캣 기능을 제공한다 이제 개발자들은 별도로 WAS를 설치 할 필요 없이 메인 메소드를 한번 실행 하면은 웹 서버와 자기가 만든 스프링을 바로 띄울 수 있게 된다
편리한 의존성 & 권장 버전 관리
- 스프링 부트가 없던 시절에 스프링으로 개발을 한 번 시작하려면 구구절절 많은 것들을 써줘야 했다 어떤 라이브러리들을 사용할지 골랐어야 했는데 만약에 웹 어플리케이션을 만든다고 한다면은 웹이니까 스프링 WEB MVC가 필요하고 내장 톰캣도 넣고 굉장히 귀찮다 라이브러리 버전 끼리 서로 호환이 되지 않는 경우들이 좀 있다 그래서 개발자들이 겨우겨우 골라 놔도 라이브러리 버전이 안 맞으면은 얘랑 얘랑 안 맞네 그럼 얘를 바꿔볼까 바꿔볼까 하면서 최대한 호환이 잘되는 라이브러리들을 다 하나하나 찾아주게 된 것이다
- 스프링 부트는 이를 도와주기 위해 라이브러리를 관리하는 편리한 툴들을 제공 한다 먼저 스프링 부트는 라이브러리의 버전 관리를 돕는데 spring.dependency-management라는 플러그인을 추가를 하면 버전을 생략할 수 있게 된다 그다음으로 스프링은 기본 라이브러리의 묶음을 제공하는데 라이브러리들을 한 줄로 모두 다 당겨올 수 있게 된다 스프링 부트는 스프링 부트 스타터라는 패키지들을 제공을 하는데 얘를 하나 딱 넣어 주면 관련한 라이브러리를 스프링 부트 가 알아서 다 당겨오게 된다
자동 설정
- 스프링 부트는 자동 구성이라는 기능을 제공하는데 자동 구성이란 일반적으로 자주 사용하는 수 많은 빈들을 스프링 부트가 자동으로 등록해주는 기능이다 JdbcTemplate 뿐만이 아니고 DataSource나 TransactionManager 등 다양한 빈들을 스프링부트가 알아서 등록해주게 된다
- 스프링 부트가 등록해주는 빈들을 라이브러리 안에서 확인할 수 있는데 spring-boot-autoconfigure 라는 애를 열어 보면 수많은 폴더들이 있다 전부 스프링 부트가 등록해주는 자동 빈들이다
- 스프링 부트 어플리케이션이라는 어노테이션에 @EnableAutoConfiguration 이라는 애가 스프링 부트의 자동 구성을 활성화 시켜 주는 어노테이션이다 들어가 보면은 AutoConfigurationImportSelector 라는 애를 임포트 해주고 있는데 여기서 importSelector 라는 거는 설정 정보 대상을 동적으로 선택하는 애 인데 얘가 무조건 들고 오는 게 아니고 내부 로직을 통해서 때에 따라서 얘는 뭐 import 했다가 얘는 안 했다가 이런 식으로 동적으로 해주는 기능이다
- 그 중에 AutoConfigurationImportSelector 라는 건 자동 설정에 대한 동적 import를 실행합니다 얘는 모든 라이브러리들을 얘가 알아서 확인을 해서 설정 정보를 세팅 해 주는 역할을 한다
- 이렇게 해당 파일의 설정 정보가 스프링 컨테이너에 자동으로 등록되면서 빈들이 자동으로 올라가게 된다