Spring, Spring Framwork, Spring boot는 어떤 차이가 있을까?
Spring Framework
--
스프링 프레임워크는
자바 플랫폼에서 엔터프라이즈급 애플리케이션 개발을 지원하는 오픈소스 애플리케이션 프레임워크로,
다양한 모듈과 도구를 제공하며, 경량화와 유연성을 바탕으로 설계한 프레임워크다.
엔터프라이즈는 간단하게 대규모 환경이라고 생각하면 된다.
즉, spring Framework는 복잡하고 번거로운 로우(low) 레벨의 기술들을 어느 정도 알아서 제공해 주기 때문에
개발자가 로우 레벨 기술에 직접 실경 쓰는 시간을 줄이고,
보다 중요한 애플리케이션의 비즈니스 로직에 대해 더 집중하여 조금 더 빠르고 효과적으로 개발할 수 있도록 도와준다.
Spring Framework가 개발자를 돕는 방식 (일부)
1. 로우 레벨 기술의 추상화
다양한 엔터프라이즈 기술과 통합을 단순화 시켜준다.
- 데이터베이스 작업 :
JDBC(자바 데이터베이스 연결)와 같은 복잡한 데이터 접근 코드를 간소화할 수 있다.
Spring JDBC Template, Spring Data 등을 사용하면 데이터 처리 로직에만 집중할 수 있다. - 트랜잭션 관리 :
선언적 장식으로 트랜잭션을 정의하여 코드를 단순화할 수 있다.
@Transactional로 복잡한 트랜잭션 처리를 자동화할 수 있다. - 웹 요청 처리 :
서블릿을 작성하는 대신에 어노테이션을 기반의 컨트롤러를 통해 HTTP 요청을 처리할 수 있다.
(@Controller, @RequestMapping 등)
2. 의존성 관리와 객체 생성
DI(Dependency Injectioin)을 통해 객체를 직접 생성하고 연결하지 않고,
Spring 컨테이너가 필요한 객체를 자동으로 주입해 준다.
이를 통해 객체 간의 결합도를 낮춰주고 테스트 가능성을 높여준다.
그리고 개발자는 비즈니스 로직에 더욱 집중하고, 객체 관리에 대한 부담을 줄일 수 있다.
3. 관심사 분리 (AOP)
로깅, 보안, 트랜잭션 관리 같은 "공통 관심사(Cross-Cutting Concerns)"를 AOP로 분리하여
비즈니스 로직에만 신경 쓰도록 코드를 단순화한다.
4. 유연한 설정
XML 설정, 어노테이션, Java Config 등 다양한 방식으로 원하는 설정을 간편하게 할 수 있으므로,
기존에 초기 설정하는 것에 대한 복잡한 단점을 보완하여 개발 속도를 높일 수 있게 된다.
5. 내장된 기능
트랜잭션 관리, 보안, 데이터 접근 계층, 메시징 등의 기능을 제공하여 이를 직접 구현할 필요가 없다.
6. 다양한 통합 지원
Hibernate, JPA, Kafka 등 다양한 라이브러리 및 기술 스택과 쉽게 통합이 가능하여
원하는 기술들을 손쉽게 연결하여 사용할 수 있다.
만약 Spring Framework를 사용하지 않는다면?
1. 객체를 생성하고 의존성을 관리하는 코드를 직접 작성해야 함
2. 로깅, 트랜잭션, 보안 같은 기능을 별도로 구현하거나, 외부 라이브러리를 직접 통합해야 함
3. DB 작업 시 JDBC 코드와 연결 관리를 모두 수작업으로 처리해야 함
4. 애플리케이션 구성과 설정이 분산되어 복잡해짐
Spring Framework의 주요 특징 정리
IoC (Invesion of Control)
제어의 역전이라고 부르며, 컨트롤의 제어권을 개발자가 아닌 프레임워크가 대신해 주는 것으로,
Servlet, Bean 같은 코드를 개발자가 직접 작성하지 않고, 프레임워크가 대신 제공해 준다.
DI (Dependency Injectioni)
의존성 주입이라고 부르며, Spring Framework에 의존성을 주입하여 객체 간의 의존성을 코드가 아닌 외부에서 설정하여,
객체 간 결합도를 낮추게 해 준다.
AOP (Aspect Oriented Programming)
관점 지향 프로그래밍이라고 부르며, 부가적인 기능을 기존 코드에서 분리(모듈화)하여 구현할 수 있는 것으로
로깅, 트랜잭션 관리, 보안과 같은 기능을 추가하고 싶을 때 기존 비즈니스 로직을 건드리지 않고 추가할 수 있으며,
이를 통해 코드의 중복을 줄이고 유지보수를 쉽게 할 수 있게 된다.
--
Spring
--
일반적으로 Spring이라고 하면, Spring Framework를 의미하지만,
이를 정확하게 구분하자면 Spring 프로젝트들의 모음 또는 생태계 자체라고 할 수 있다.
모든 프로젝트들은 "Spring Framework"를 기반으로 동작된다.
즉, Spring과 Spring Framework를 굳이 따지자면 다르지만
일반적으로 Spring으로 통합해서 부르기 때문에 크게 신경 쓰지 않아도 된다.
--
Spring Boot
--
Spring에서 제공하는 기능들이 많아지고,
더 다양한 오픈소스들이 생겨서 외부 라이브러리를 같이 사용하는 경우가 많아지면서
개발을 시작할 때 직접 설정해야 하는 것들이 많아지고 복잡해지기 시작했다.
이를 편리하게 해주는 것이 Spring Boot다.
즉, Spring을 통해 개발할 때 복잡한 설정은 Spring Boot가 알아서 해주므로
기존에 Spring 기반의 애플리케이션을 보다 쉽게 만들 수 있게 해주는 것이다.
Spring Boot는 "Convention over Configuration(관례에 따른 설정)" 철학을 기반으로 동작한다.
Spring Boot의 주요 특징
1. 내장 서버 (Embedded Server)
톰캣(Tomcat), 제티(Jetty) 등의 서버를 내장하여
별도의 서버 설치 없이 바로 애플리케이션 실행 가능하도록 한다.
이를 통해 WAS를 설치하고, WAR로 빌드하고 실행하는 과정을 생략하고
바로 jar파일로 패키징을 하여 main 메서드를 바로 실행할 수 있도록 구성했다.
2. 더욱 편리해진 의존성(스타터 의존성) & 버전 관리
기존 Spring에서 의존성을 추가할 때에는 개발하고자 하는 목적에 알맞은 모든 라이브러리를 추가해야 했으며,
각 라이브러리의 버전까지도 직접 명시해줘야 했다.
여기서 단점은 각 라이브러리 버전마다 호환이 안 되는 버전들도 있기 때문에 다른 라이브러리와 호환이 잘 되는 버전들을 찾아서 명시해야 하는 단점이 존재했다.
이러한 단점을 Spring Boot에서는 라이브러리의 버전들을 관리하는 플러그인을 제공하여
의존성을 추가할 때 버전을 명시하지 않아도 Spring Boot가 각 라이브러리에서 서로 호환이 잘되는 버전을 알아서 적용해 준다.
그리고 기본 라이브러리들 중에서 목적마다 필요한 필수 라이브러리들을 하나의 라이브러리로 묶어서 간편하게 사용하는 기능도 제공한다.
예시로 웹 개발을 할 때 필요한 라이브러리는
MVC, 톰캣, JSON, LOG 등 라이브러리를 하나하나 추가해줘야 했지만
이를 하나의 라이브러리 묶음으로 만들어 Web라이브러리 한 줄만 작성하면 위 라이브러리들을 모두 추가한 것과 같은 환경이 된다.
버전 관리
'io.spring.dependency-management'를 통해 각 라이브러리의 호환성이 좋은 버전들로 자동 설정해 준다.
묶음 라이브러리 (spring-boot-starter 라이브러리)
'org.springframework.boot:spring-boot-starter-web' 라이브러리를 추가하면
웹 개발에 필요한 기본적인 라이브러리가 자동으로 적용된다.
(test, websocket 등 각 역할마다 필요한 묶음 라이브러리를 제공하여 입맛에 맞게 가져다 사용할 수 있다.)
3. 프로덕션 준비 기능
설정 파일(application.properties 또는 application.yml)로 환경별 설정을 관리할 수 있으며
다양한 빌드 도구(Maven, Gradle)와 통합하여 사용할 수 있다.
4. 자동 설정 (Auto Configuration)
애플리케이션에 포함된 라이브러리와 설정들을 자동으로 감지해서 기본값으로 설정해 준다.
이를 통해 개발자는 복잡한 XML이나 java Config 파일을 작성할 필요 없이 간단한 어노테이션만으로 설정이 가능해진다.
--
'Spring Boot' 카테고리의 다른 글
[STOMP] 회원기능(인증, 인가)없이 convertAndSendToUser()로 응답하기 (Principal 커스텀 (0) | 2025.01.13 |
---|---|
Spring boot에서 STOMP 사용하기 [ 간단한 채팅 용 ] (0) | 2024.12.03 |
Spring boot에 WebSocket 사용하기 [ 간단한 채팅 용 ] (0) | 2024.11.27 |
[IntelliJ] finished with non-zero exit value 1 에러 해결 방법 (0) | 2024.11.26 |
이메일 발송하기 (Google SMTP Server/ Gmail을 통해 발송하기) (0) | 2024.06.01 |