Spring 과 Spring Boot는 왜 등장했을까?

HeoSeungYeon·2022년 2월 3일
1

Spring Study

목록 보기
7/7
post-thumbnail

Spring과 Spring Boot는 무슨 차이가 있을까?

💡 Spring Framework를 배우기 시작하면서 Spring과 Spring Boot의 차이점에 대해서 항상 궁금했습니다. Spring의 복잡한 환경설정을 최소화하여 개발자의 서버 개발을 용이하게 하기 위해 나온 프레임워크가 Spring Boot라는 것만 안 채, Spring Boot를 다뤄왔던 것 같습니다.
시간이 있을 때, Spring Framework에 대해서 알아보고 Spring Boot는 어떤 차이점이 있는지 공부해보는 시간을 가져보겠습니다. 🖐️

A. Spring Framework의 등장


이전엔 Java 데이터베이스 연결을 위한 JDBC, Java Server Pages(JSP), Java Servlet과 같은 기존 Java 프레임워크 및 API 를 활용하여 웹 애플리케이션을 개발하는데에 있어 여러 단점이 존재했습니다.

  • 애플리케이션이 무겁다.
  • 개발자가 공통적으로 설정해야 되는 부분이 많다.
  • 중복된 코드 작성이 많다.
  • 객체 간 결합도가 높다.

이전에 Java 언어를 사용하여 기업에서 사용되는 대표적인 프레임워크는 EJB 이었는데요, 이 EJB도 위에 언급된 단점들을 모조리 갖고 있었습니다.

그래서 탄생된게 Spring Framework 입니다. 당연히 기존에 존재했던 단점들을 해결해주는 강력한 특징들이 존재하는데요.

  • POJO 기반 경량 컨테이너
  • IoC(Invertion of Control) : 제어의 역전
  • DI(Dependency Injection) : 의존성 주입)
  • AOP(Aspect-Oriented Programming) : 관점지향 프로그래밍

💡 POJO 란?
Plain Old Java Object
의 약자이며 직역하면 오래된 방식의 간단한 자바 오브젝트라는 의미입니다.
JAVA EE 등의 중량 프레임워크를 사용하게 되면서 해당 프레임워크에 종속된 무거운 객체를 만드는 것을 반발하여 탄생된 용어입니다.
1. Java 언어와 타 라이브러리의 의존성을 없애자.
2. Java 언어와 타 기술간의 종속성을 없애자.
위 2가지를 지향하자는 말로 해석할 수 있는데요.
토비의 스프링에서는 진정한 POJO를 다음과 같이 정의하였습니다.
진정한 POJO객체지향적인 원리에 충실 하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계 된 오브젝트!

1️⃣ IoC : 제어의 역전


제어의 역전 패턴은 프로그램의 생명주기에 대한 제어권이 웹 애플리케이션 컨테이너에 있는 것을 의미합니다. 사용자가 직접 인스턴스를 생성하고 메서드를 호출하는 모든 생명주기에 대한 작업들은 스프링 컨테이너에 위임할 수 있습니다.

IoC를 함으로써 클래스 간, 모듈 간의 결합도를 낮출 수 있는데요,

Spring에서 DI(의존성 주입)라는 기능을 통해 IoC를 선보이고 있습니다.

2️⃣ DI : 의존성 주입


먼저 DI, 의존성 주입이 없는 코드에선 우리는 어떻게 코드를 짰을까요?

ExService.class 는 ExRepository.class 인스턴스를 사용한다.

위와 같은 요구사항이 있을 경우, 우리는 다음과 같이 클래스를 작성할 수 있습니다.

ExRepository.class


public class ExRepository {
	,,,
}

ExService.class


public class ExService {
	
	private ExRepository exRepository = new ExRepository();

	public void doSomething() {
		exRepository.doSomethingToo();
	}

}

Service에서 직접 Repository 인스턴스를 생성하여 관리하기에 이것은 객체간 의존성이 높다고 볼 수 있습니다.

그렇다면 Spring 의 DI를 사용하면 어떻게 코드를 작성할 수 있을까요?

ExRepository.class


@Component
public class ExRepository {
	,,,
}

ExService.class


public class ExService {
	
	@Autowired
	private ExRepository exRepository;

	public void doSomething() {
		exRepository.doSomethingToo();
	}

}

ExRepository 클래스를 @Component를 통해 Bean으로 등록하고, ExService의 ExRepository 멤버 변수에 @Autowired를 통해 DI (의존성 주입)을 함으로써, Service에서 Repository 인스턴스를 생성하는 행위를 없앤 것을 볼 수 있습니다.

우리는 위 코드를 통해 의존성 주입(DI)으로 객체의 의존성을 낮춘 것으로 볼 수 있습니다.

또한, 스프링의 BeanFactory라는 팩토리 패턴의 구현체에서 bean 이라는 스프링 프레임워크가 관리하는 객체로 관리되게 하는 @Component 와 자동으로 bean을 객체 생성시 주입해주는 @Autowired 사용함으로써 IoC(제어의 역전)을 했다고 할 수 있습니다.

3️⃣ AOP : 관점지향 프로그래밍


AOP는 관점 지향 프로그래밍을 의미하는데요, AOP는 개발자가 공통적으로 구현해야 하는 부분(Security, Logging etc)을 기존 코드를 건들지 않고 개발할 수 있게 도와주는 기능입니다.

이전 시간에 다뤄본 Filter, Interceptor와 비슷하게 웹 애플리케이션 서버를 구현할 때 관점에 따라 코드를 작성하여 코드의 재사용성을 높여주는 기능이라고 할 수 있습니다.

B. Spring Boot 의 등장


Spring Framework가 등장했음에도 불구하고 현업자들은 여러 불편함을 느꼈는데요, 여러 기능이 있는 만큼 환경 설정이 복잡하고 시간이 오래걸린다는 점이었습니다.

Spring Boot는 Spring 을 통해 웹 애플리케이션을 실행시키기 전까지의 많은 환경 설정을 자동화하여 개발자가 편하게 Spring을 사용할 수 있도록 도와주기 위해 등장하였습니다.

Spring Boot가 제공하는 대표적인 기능은 다음과 같습니다.

  • Auto Configuration
  • 쉬운 의존성 관리
  • Embedded Server (내장 서버)
  • 인메모리 데이터베이스 제공 (H2)

1️⃣ Auto Cofiguration


스프링에서 공통적으로 설정이 필요했던 DispatcherServlet과 같은 설정을 어노테이션을 통해 대신할 수 있습니다.

Spring Boot의 Application 클래스의 main 메서드는 @SpringBootApplication 어노테이션을 갖은 것을 확인할 수 있는데, 해당 어노테이션을 통해 Spring Boot는 여러 설정들을 자동으로 수행합니다.

2️⃣ 쉬운 의존성 관리 by starter


starter를 통해 Spring Boot는 dependency를 관리함으로써, 기존의 Spring에서 dependency의 버전의 종속성으로 인한 호환성을 고려하여 수동적으로 관리해야 하는 문제점을 해결하였습니다.

3️⃣ Embedded Server (내장 서버)


Spring Boot는 내부에 Tomcat과 같은 WAS를 내장함으로써 이전 Spring Framework에서 WAS를 설치하고 버전을 관리하는 문제점을 해결하였습니다.

4️⃣ 인메모리 데이터베이스 제공(H2)


Spring framework에서는 인메모리 데이터베이스가 제공되지 않았지만 Spring Boot에선 인메모리 데이터베이스에 대한 기능들을 Default로 제공함으로써 테스트나 애플리케이션 구축을 용이하게 해줍니다.

회고


  • Spring Framework가 등장한 배경
  • Spring Boot가 등장한 배경

위 2가지에 대해 간단하게 조사해보고 공부해보는 시간을 가져보았는데요, 이것뿐만 아니라 스터디를 통해 AOP의 프록시 동작방식도 Spring Framework 와 Spring Boot가 차이가 있다는 것을 알게 된 것 같습니다.

앞으로 웹 애플리케이션 서버를 개발하면서 이런 차이점을 알고 개발을 해야 제대로 Spring이 주는 기능을 능숙하게 사용할 수 있다는 생각을 했습니다.

참고문서


https://velog.io/@gillog/Spring-vs-Spring-Boot

https://server-engineer.tistory.com/739

https://sas-study.tistory.com/274

http://dawoonjeong.com/spring-spring_mvc-vs-spring_boot-vs-spring_mvc/

https://msyu1207.tistory.com/entry/Spring-VS-Spring-Boot-차이점을-알아보자

https://www.baeldung.com/spring-vs-spring-boot

https://siyoon210.tistory.com/120

https://ooeunz.tistory.com/56

profile
안녕하세요~! 백엔드 개발자 허승연 입니다 :)

0개의 댓글