목차
01. 스프링 부트란?
ㄴ1.1 스프링 프레임워크
ㄴ 1.1.1. 제어 역전(IoC)
ㄴ 1.1.2. 의존성 주입(DI)
ㄴ 1.1.3. 관점 지향 프로그래밍(AOP)
ㄴ 1.1.4. 스프링 프레임워크의 다양한 모듈
ㄴ1.2 스프링 프레임워크 vs 스프링 부트
ㄴ 1.2.1. 의존성 관리
ㄴ 1.2.2. 자동 설정
ㄴ 1.2.3. 내장 WAS
ㄴ 1.2.4. 모니터링
1-1 스프링 프레임워크
스프링 프레임워크(이하 스프링)란 자바 기반의 애플리케이션 프레임 워크이며, 엔터프라이즈급 애플리케이션을 개발하기 위한 다양한 기능을 제공하는 것이다. 이 스프링은 다양한 프로젝트를 제공하는데 그중 하나가 Spring Boot이다. (우선, 스프링과 스프링 부트는 별개로 나눠서 생각해보자.)
스프링은 쉽게 말해서 자바로 애플리케이션을 개발하는 데 필요한 기능을 제공하고 쉽게 사용하도록 돕는 도구이다.
스프링의 핵심 가치 = "애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비지니스 로직 구현에만 집중할 수 있게끔 하는 것"
스프링은 총 3가지의 특징과 구조를 갖고 있다.
- 제어 역전(IoC :Inversion of Control)
- 의존성 주입(DI : Dependecy Injection)
- 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)
제어 역전(IoC)
일반적인 자바 개발의 경우 객체를 사용하기 위해 외부 클래스로 생성한다. 이것은 해당 객체의 의존성을 생성한 후 객체(외부 클래스)에서 제공하는 기능을 사용하는 것이며, 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이다.
그러나 IoC를 특징으로하는 스프링은 기존 자바 개발 방식과 다르게 동작한다. 사용할 객체를 직접 생성하지 않고 객체의 생성 주기 관리를 외부(스프링 컨테이너 or IoC 컨테이너)에 위임함.
제어 역전을 통해 DI,AOP가 가능해지고, 객체의 제어권을 컨테이너로 넘기기 때문에 개발자는 비지니스 로직을 작성하는데 더 집중 가능함.
의존성 주입(DI)
의존성 주입(DI)란 제어 역전의 방법 중 하나이고, 사용할 객체를 직접 생성하는 것이 아니라 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미한다.
스프링에서 의존성을 주입해주는 방법은 세 가지가 있다.
- 생성자를 통한 DI
@Autowired라는 어노테이션을 통해 의존성을 주입할 수 있음(스프링 4.3 이후 버전은 생성자를 통한 DI에서는 @Autowired 어노테이션 생략 가능)
- 필드 객체 선언을 통한 DI
- setter 메서드를 통한 DI
관점 지향 프로그래밍(AOP)
AOP란? 여러 비지니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식.
-> 아직 완전한 이해 안됨 추후 수정 예정
스프링 프레임워크의 다양한 모듈
책에는 없지만 잘 정리해주신 분의 글을 스크랩해오자면 다음과 같다 (출처 : https://maenco.tistory.com/entry/Spring-Spring-Framework-Module-%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%AA%A8%EB%93%88 )
Core Container
스프링 프레임워크의 핵심인 빈의 생명주기와 설정 그리고 처리 방법을 관리하는 스프링 컨테이너이다
모든 스프링 모듈은 코어 컨테이너 기반으로 구축된다
1. Beans
Beans는 스프링 DI기능의 핵심인 빈 팩토리와 DI 기능을 제공하는 모듈이다
빈 메타 정보, 빈 리더, 빈 팩토리의 구현과 프로퍼티 에디터가 포함되어 있다고 한다
2. Core
Core모듈을 단어의 뜻처럼 거의 대부분의 다른 스프링 모듈에서 필요로 하는 공통 기능을 갖는 핵심 모듈이다
스프링에서 사용하는 주요 어노테이션과 컨버터, 상수 그리고 유틸리티 클래스 등을 제공한다
3. Context
애플리케이션의 Context 기능을 제공하는 모듈이다
콘텍스트를 만드는데 필요한 대부분의 기능과 빈 스캐너, 자바 코드 설정 기능 , 표현식 , 스크립트 언어 지원 등의 주요한 기능을 담고 있다
단순한 빈 팩토리가 아닌 엔터프라이즈 애플리케이션 프레임워크로 사용하기 위하여는 반드시 필요한 모듈이라고 한다
4. SpEL
스프링 표현 언어 기능을 제공한다
AOP & Aspect & Instrumentation
1. AOP
스프링은 AOP 모듈을 통해 관점 지향 프로그래밍을 지원한다
2. Aspects
스프링이 제공하는 AspectJ AOP를 사용할 때 필요한 모듈이다
3.Instrument
특정 애플리케이션 서버에서 사용할 클래스 계측 지원 및 클래스 로더 구현을 제공한다
Messaging
Message, MesageChannel, MessageHandler 등의 스프링 통합 프로젝트를 포함하고 있으며
메시지 기반 애플리케이션의 구축하는데 역할을 한다 (Spring MVC의 어노테이션 기반 모델과 비슷한)
Data Access/Integration (데이터 액세스/통합)
스프링은 JDBC , ORM , Transaction 등의 서비스 추상화를 통하여 쉽게 데이터에 접근하는 방법을 제공한다
1. JDBC
Java JDBC 프로그래밍을 비교적 쉽게 할 수 있도록 제공하는 모듈이다
2. ORM
JPA , JDO 및 Hibernate를 포함한 널리 사용되는 관계형 매핑 API에 대한 통합 계층을 제공한다
orm을 통하여 간단한 선언적 트랜잭션 관리 기능을 비롯한 Spring이 제공하는 다른 모든 기능을 O/R 매핑 프레임워크로 사용할 수 있게 한다
3. OXM
JAXB , XMLBeans 등과 같은 객체/XML 매핑의 추상화 계층을 제공한다
4. JMS
spring-jms 모듈은 Java Messaging Service의 약자로서 메시지 생성 및 사용을 위한 기능을 제공한다
(이는 Spring Freamwork 4.1부터 spring-messging 모듈과 통합 제공한다)
5. Transaction
spring-tx 모듈은 특수 인터페이스를 구현하는 클래스와 모든 POJO에 대하여 선언적 트랜잭션 관리를 지원한다
Web
스프링은 다양한 MVC 프레임워크를 사용할 수 있지만 스프링 자체적으로 제공하는 Spring MVC 모듈들이 있다
또한 스프링의 리모팅 기술로 RMI, Hessian, HTTP 호출자 , REST API 모듈 등을 제공한다
1. WebSocket
웹소켓을 지원한다
2. Servlet
스프링 MVC 기능을 제공하는 모듈이다 전통적인 MVC와 @MVC의 기능이 모두 포함되어 있다
3. Web
웹 애플리케이션 이용에 편리한 기능을 제공한다
Multipart-File Upload 기능 및 서블리 리스너 , IoC 컨테이너 초기화 같은
기본적인 웹 지향 통합 기능을 제공한다
4. Portlet
포틀릿 환경 미러 서블릿 기반의 기능에 사용될 MVC 구현을 제공한다
Test
스프링은 테스트에 전념할 수 있도록 Test 모듈을 제공한다
JUit , TensNg를 이용하여 테스트 컨텍스트 프레임워크나 Mock 오브젝트 등을 이용하여 테스트할 때 사용한다
스프링 프레임워크는 기존 개발 방식의 문제와 한계를 극복하기 위해 다양한 기능을 제공함.
그러나 이 다양한 기능이 스프링 프레임워크의 설정을 복잡하게함.
-> 스프링 부트 출현을 야기시킴
1-2 스프링 프레임워크 vs 스프링 부트
스프링 부트는 스프링 프레임워크에 비해 복잡한 설정을 하지 않아도 개발을 쉽게 할 수 있게 도와준다.
이를 위해 스프링 프레임워크에는 없지만 스프링 부트에는 갖고있는 특성은 총 4가지가 있다.
- 의존성 관리
- 스프링 프레임 워크에서는 개발에 필요한 모듈의 의존성(dependency)를 직접 설정해야 했으나 스프링 부트에서는 spring-boot-starter라는 의존성을 제공해 의존성 관리를 해줌.
- 간략한 spring-boot-starter 라이브러리 소개
spring-boot-starter-web : 스프링 MVC를 사용하는 RESTful 애플리케이션을 만들기 위한 의존성. 기본적으로 내장 톰캣이 포함되어 있어 jar 형식으로 실행 가능
spring-boot-starter-test: JUnit, Jupiter, Mockito 등의 테스트용 라이브러리를 포함
spring-boot-starter-jdbc: HikariCP 커넥션 풀을 활용한 JDBC 기능을 제공
spring-boot-starter-security: 스프링 싴리티(인증, 권한, 인가 등) 기능을 제공
spring-boot-starter-data-jpa: Hibernate(하이버네이트)를 활용한 JPA 기능을 제공
spring-boot-starter-cache: 스프링 프레임워크의 캐시 기능을 지원
- 자동 설정
- 스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정(Auto Configuration)을 지원해줌
- 자동 설정이란 = 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아주는 것
- 그림에서 보이는 @SpringBootApplication annotation(어노테이션)이 스프링 부트가 패키지 및 클래스에 필요한 파일 및 bean을 등록해 자동 설정이 적용됨
- @SpirngBootApplication = ( @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan) 이 세 가지 어노테이션들으로 구성되있음.
- 자동 설정 과정 >
스프링 부트 애플리케이션 실행 -> @ComponentScan 어노테이션이 우선적으로 @Component 시리즈 어노테이션들이 붙은 클래스를 발견해 빈(bean)으로 등록함 -> 이후에 @EnableAutoConfiguration 어노테이션을 통해 'spring-boot-autoconfigure' 패키지 안에 spring.factories 파일을 추가해 다양한 자동 설정이 일부 조건(=각 파일에 설정된 @Conditional의 조건을 충족할 경우)을 거쳐 적용됨. - 해당 챕터에서는 @Component 시리즈 어노테이션 언급됨
- @Component 시리즈 어노테이션의 대표적인 예 > @Controller, @RestController, @Service, @Repository, @Configuration
- 내장 WAS
- 스프링 부트의 각 웹 애플리케이션에는 WAS(Web Application Server)가 존재함.
- 의존성 관리에서 본 것처럼 start모듈에 있는 'spring-boot-starter-web'에는 tomcat(톰캣)이 내장되어있음
- 모니터링
- 개발이 끝나고 서비스를 운영하는 시기에는 해당 시스템이 사용하는 스레드, 메모리, 세션 등 주요 요소들을 모니터링 해야함.
- 스프링 부트에는 엑츄에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있음
- 11장에서 자세히 다룸.
'BookStudy > 스프링 부트 핵심 가이드' 카테고리의 다른 글
[스프링 부트 핵심가이드] 06. 데이터베이스 연동 (0) | 2023.09.08 |
---|---|
[스프링 부트 핵심 가이드] 05. API를 작성하는 다양한 방법 (0) | 2023.08.31 |
[스프링 부트 핵심 가이드] 04. 스프링 부트 애플리케이션 개발하기 (0) | 2023.08.30 |
[스프링 부트 핵심 가이드] 03. 개발 환경 구성 (0) | 2023.08.24 |
[스프링 부트 핵심 가이드] 02. 개발에 앞서 알면 좋은 기초 지식 (0) | 2023.08.24 |