Spring Framework (스프링, 스프링부트 차이에 대해)
제로코딩
·2022. 6. 29. 11:25
✋ Spring Framework (스프링, 스프링부트 차이에 대해)
이 글에서는 스프링과 스프링 부트의 차이점에 대해 설명하고자 합니다. 많이들 어떤 경우에 스프링을 쓰고 어떤 경우에 스프링 부트를 쓰는 것인지 헷갈려하는 경우가 있습니다.
⚡️ Spring Framework란
가장 대중적인 응용 프로그램 개발 프레임워크입니다. 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다.
엔터프라이즈급 개발이란 기업을 대상으로 하는 개발입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 의미합니다.
의존성주입(DI), 제어의 역전(Ioc), 관점 지향 프로그래밍(AOP)가 주요 특징입니다. 이를 통해 SW의 결합도를 낮추는 방향으로 프로그램을 개발할 수 있습니다. 또한 이로인해 단위테스트가 용이해집니다.
모든 기능을 종합제공하는 경량화 솔루션입니다. 대규모 데이터 처리 및 트랜젝션이 동시에 여러 사용자에게 행해지는 큰 규모의 환경을 개발할 때 적합합니다.
경량 컨테이너로 자바 객체(Bean)을 직접 담고 관리합니다. 객체 생성, 소멸 등의 라이프사이클을 직접 관리하며 Spring 컨테이너로부터 필요한 객체를 가져와 사용합니다. 이를 IOC 기반이라고 통칭합니다.
📌 IOC (제어의 역전)
IOC = Inversion Of Control
일반적인 프로그램은
객체 생성 -> 의존성 객체 생성 -> 객체 내 메소드 호출 작업을 반복합니다.
이를 통해 객체들이 프로그램 흐름을 결정하고 객체 구성에 직접 참여합니다. 즉 사용자가 프로그램을 제어합니다.
하지만 Ioc의 경우 역입니다. 자기가 사용할 객체를 선택하지 않을 뿐더러 자신이 어디서 만들어지고 사용되는지 모르게 됩니다. 권한을 다른 대상에 위임함으로 제어권한은 특별 객체에 의해 만들어집니다.
IOC란, 기존 사용자가 모든 작업 제어를 특별한 객체에 위임하여 객체이 생성부터 소멸주기까지 라이프사이클 등 객체의 제어권 모든 것이 넘어 간 것을 의미합니다.
📌 DI (의존성 주입)
의존성 주입이란 객체가 서로 의존하는 관계가 되도록 하는 것입니다.
객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미합니다.
IOC에서의 의존성 주입이란 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것입니다.
DI 없는 경우
@RestController
public class MyController {
private MyService service = new MyService();
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
DI 존재하는 경우
@Component
public class MyService {
public String retrieveWelcomeMessage(){
return "Welcome to InnovationM";
}
}
@RestController
public class MyController {
@Autowired
private MyService service;
@RequestMapping("/welcome")
public String welcome() {
return service.retrieveWelcomeMessage();
}
}
📌 POJO (평범한 자바 오브젝트)
Plain Old Java Object로 POJO는 gettet/setter를 가진 단순 자바 오브젝트로 정의를 하고 있습니다.
이러한 단순 오브젝트는 의존성이 없고 추후 테스트 및 유지보수가 편리한 유연성의 장점을 가집니다.
이러한 장점들로 인해 객체지향적인 다양한 설계와 구현이 가능합니다.
📌 AOP (관점 지향 프로그래밍)
예를 들어, AOP는 기존 프로젝트에 로깅이나 보안을 설정하고 싶을 때, 기존 로직에는 수정을 가하지 않고 AOP를 활용하여 추가가 가능합니다. 호출 직전이나, 메소드 리턴 직후, 예외가 발생할 경우 등 여러 상황에서 사용이 가능합니다.
📌 Spring MVC 패턴
MVC란 (Model View Controller) 구조로 사용자 인터페이스와 비지니스 로직을 분리하여 개발 하는 것 입니다.
Model
Model에서는 데이터처리를 담당하는 부분입니다. Model부분은 Serivce영역과 DAO영역으로 나누어지게 되고 여기서 중요한 것은 Service 부분은 불필요하게 HTTP통신을 하지 않아야하고 request나 response와 같은 객체를 매개변수로 받으면 안됩니다. Model 부분의 Service는 View와 연관이 없어야 합니다.
즉, Model에서는 View와 Controller 어떠한 정보도 가지고 있어서는 안됩니다.
2022.06.23 - [디자인패턴] - (디자인 패턴) MVC 패턴이란
📌 SpringBoot 사용 이유
Spring은 현재 모든 기능을 다 갖추고 있습니다. 엔터프라이즈 급 Spring을 개발하면서 Transaction, DataSource, Entity, Session 등을 설정하는데 많은 어려움이 있고 Spring Mvc를 사용하여 세팅하는데 많은 시간이 걸립니다.
즉, 기능이 많은 만큼 환경설정이 복잡한 편입니다. 이에 어려움을 느낀 사용자를 위하여 SpringBoot가 나온 것입니다.
스프링 부트는 자동 설정 기능을 통해 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 정말 편하게 스프링을 활용할 수 있도록 돕습니다.
스프링 부트 starter dependency만 추가해주면 바로 API를 기능을 정의할 수 있습니다. Starter가 대부분의 dependency를 자동으로 관리해주기 때문에 Spring처럼 각각의 dependency들의 호환되는 버전을 일일이 맞출 필요가 없습니다.
starter란 노드 패키지 관리자 npm처럼 간편한 dependency를 제공해줍니다. 예를 들어, jpa가 필요할 경우, Gradle에 'spring-boot-starter-data-jpa'한줄만 추가해주면 스프링부트가 자동으로 그에 필요한 라이브러리를 받아옵니다.
따로 웹서버를 설치할 필요없이 내장된 Tomcat 웹서버나 Jetty로 웹 애플리케이션 서버를 실행할 수 있습니다. 즉, 매번 버전 관리를 해줄 필요가 사라집니다.
Spring 사이트에 나와있는 Initializer를 사용하면 바로 실행 가능한 코드를 만들어준다. 실행환경이나 의존성 관리 등의 인프라 관련 등은 신경쓸 필요 없이 바로 실행이 가능합니다.
Spring에서 해주었던 XML설정이 필요없습니다.
Jar 파일만을 사용해 손쉽게 배포가 가능합니다.
스프링과 스프링 부트의 의존성 관리 차이를 코드로 보여드리겠습니다.
스프링의 의존성 관리
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
스프링 부트의 의존성 관리
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
스프링 부트는 위와 같이 단순한 의존성 추가를 통해 여러 패키지들을 자동으로 수집합니다. dependency 버전 관리, 호환성에 대해 신경을 쓰지 않아도 됩니다.
'Web > Java' 카테고리의 다른 글
JDK 설치 및 Java 환경변수 설정 (0) | 2022.07.05 |
---|---|
Intellij IDEA (인텔리제이) 단축키 모음 (0) | 2022.06.29 |
스프링 POJO(Plain Old Java Object) (0) | 2022.06.29 |
(Java) 서블릿(Servlet)이란 (0) | 2022.06.29 |