스프링 프레임워크란
스프링 프레임워크는 자바 기반의 오픈소스 프레임워크이다. 20개 이상의 서로 다른 모듈로 구성되며, 프로젝트 규모와 필요 기능에 따라 스프링 프레임워크를 기본으로 여러 모듈을 조합하여 사용한다.
스프링 프레임워크의 주요 특징
- 경량 컨테이너 : 객체 생성, 소멸과 같은 생명 주기를 관리하여 스프링 컨테이너로부터 필요한 객체를 얻어올 수 있다.
- 제어의 역행 지원(IOC) : 메서드나 객체의 호출 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
- 의존성 주입 지원(DI) : 각각의 계층이나 서비스 간에 의존성이 존재할 경우 프레임워크가 서로 연결해준다.
- 관점 지향 프로그래밍 지원(AOP) : 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
스프링의 주요 프로젝트
- 스프링 부트 : 간편하게 스프링 프로젝트를 시작할 수 있도록 도와준다. 마이크로서비스 개발 및 웹 애플리케이션 개발에 적합
- 스프링 데이터 : 데이터베이스 연동을 위한 보다 편리한 개발을 지원한다. 전통적인 JDBC에서부터 JPA까지 모두 지원하며, Redis, MongoDB와 같은 NoSQL을 위한 전용 모듈도 제공한다. 또한 Spring Data Rest는 데이터베이스와 연동되는 REST API 개발의 대부분을 자동화해준다.
- 스프링 배치 : 대량의 데이터를 일괄 처리하기 위한 솔루션으로 대형 시스템에서 주로 사용한다. 편리한 설정과 데이터 작업 시 발생하는 문제에 대한 대응 및 관리 기능이 뛰어나다.
- 스프링 시큐리티 : 보안과 관련된 여러 기능을 통합 제공한다. 모든 웹 애플리케이션이나 서비스 개발에 필요한 사용자 인증과 권한 부여를 위한 기본 인프라를 제공하여 OAuth2를 통한 인증도 지원한다.
스프링 부트
스프링 프레임워크는 방대한 구성요소를 가지고 있으며 프로젝트를 시작하기 위해 여러 설정과 필요한 구성요소를 개발자가 직접 정의해주어야 하기 때문에 시작 단계에서부터 많은 어려움을 겪을 수 있다.
스프링 부트는 스프링에 대한 전문적인 지식이 없어도 특정 목적의 개발환경과 프로젝트 구조를 자동으로 생성하고 바로 사용할 수 있도록 도와준다. 톰캣, 제티와 같은 WAS도 내장하고 있으며, 별도의 웹 서버 설치나 실행 없이 스프링 부트 애플리케이션을 실행하는 것으로 웹 애플리케이션 구동이 가능하다.
스프링 부트는 최근 유행하고 있는 MSA(Micro Service Architecture)기반의 서비스 개발에도 유용하며 크게 리액티브 스택과 서블릿 스택으로 구분하고 있다.
리액티브 스택
새로운 비동기 논블로킹 I/O 구조를 사용하며 멀티코어 시스템의 장점을 살리고 대규모 사용자 접속을 처리하는 데 유용한 구조로 설계되어 있다. 또한 네티, 언더토우 및 서블릿 3.1 이상의 컨테이너를 사용하며 Spring WebFlux라고 하는 새로운 프레임워크를 사용해 개발된다. 물론 아파치 톰캣 8.5 이상도 사용할 수 있다. 기본적으로 NoSQL 데이터베이스와의 연동을 지원한다.
서블릿 스택
기존과 같이 서블릿 API에 기반한 동기 방식의 블로킹 I/O 구조를 사용하며 하나의 요청은 하나의 스레드로 처리된다. 아파치 톰캣과 같은 서블릿 컨테이너를 사용하며, 전통적인 Spring MVC 기반의 서버 프로그램 개발과 JPA, JDBC, NoSQl 데이터베이스 지원을 포함한다.
기존 스프링 부트와 동일한 방식의 개발 모델과 API 구조로 이해하면 된다.
결론 : 최신의 스프링 프레임워크를 무조건 사용할 필요는 없다. 프로젝트 성격에 따라 모델을 선택해 사용하는데 리액티브 스택은 다음과 같은 구현에 적합하다.
- 비동기 - 논블로킹 리액티브 개발
- 효율적으로 동작하는 고성능 웹 애플리케이션
- 서비스 간 호출이 많은 마이크로 서비스 아키텍처 구현
리액티브 프로그래밍
리액티브 프로그래밍이란 변화에 반응하는 프로그램 모델을 말하며 기본적으로 비동기 I/O기반으로 데이터 흐름과 변화 전파에 중점을 둔 프로그래밍 패러다임을 말한다. React, RxJava와 같이 최근 유행하고 있는 각종 프레임워크와 라이브러리의 기본 철학으로, 기존의 프로그램이 작성된 순서에 따라 진행되는 것에 비해 리액티브 프로그래밍은 데이터의 흐름을 먼저 정의 하고 데이터가 변경되었을 때 연관된 함수나 수식이 업데이트되는 방식으로 이해할 수 있다.
리액티브 프로그래밍 기법은 개발의 효율을 높여주며, 적은 스레드 개수로 더 많은 부하를 처리할 수 있게 해준다.
IOC
기존의 프로그램은 프로그램이 시작되는 곳에서 필요한 객체를 생성하고, 생성된 객체의 메서드를 호출하는 방식이다. IOC는 작업을 수행하는 쪽에서 객체를 생성하는 일반적인 개념을 뒤집어 프로그램 제어를 자신이 아닌 다른 곳에 위임하는 것을 말한다. 스프링에서는 컨테이너에 객체 생성과 공급을 위임하는 형태이다.
특징
- IOC에서는 객체가 자신이 사용할 객체를 생성하거나 선택하지 않는다.
- 객체는 자신이 어떻게 생성되고 어떻게 사용되는지 알 수 없다.
- 모든 객체는 제어 권한을 위임받은 특별한 객체(컨테이너)에 의해 만들어지고 사용된다.
스프링의 경우 스프링 컨테이너에서 객체를 생성하고 공급하는 역할을 담당한다. 또한 스프링 빈은 스프링 컨테이너에 의해 관리되는 스프링 객체를 말하며, 기본적으로 XML 기반의 설정 파일을 통해 객체와 관계를 정의하지만 지금은 주로 어노테이션을 통해 설정을 한다.
DI
IOC를 시스템적으로 구현하는 방법으로 DI(Dependency Injection)와 DL(Dependency Lookup)이 있다. DI는 클래스 간의 의존관계를 Bean 설정에 기반해 컨테이너가 자동으로 연결해주는 방식이다. 반면 DL은 저장소에 저장되어 있는 Bean에 접근하기 위해 개발자가 컨테이너에서 제공하는 API를 이용해 Bean을 찾는 방식이다.
DL은 컨테이너에 대한 의존성(Dependency)이 커지고 불필요한 코드 사용이 증가하므로 DI 방식이 더 좋은 방식이다. 그렇기에 스프링 프레임워크에서는 기본적으로 DI 방식을 사용한다.
AOP
AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍이라고도 한다. 관점 지향 프로그래밍은 횡단 관심사(Cross-cutting-concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적이다. 따라서 코드 자체를 수정하지 않는 대신 기존 코드에 추가 동작인 어드바이스(Advise)를 정의하여 추가된 기능이 실행된다. 어느 코드가 포인트컷(Pointcut)을 통해 수정되는지를 별도로 지정하는 구조를 가지고 있다.
횡단 관심사 : 여러 프로그램에 흩어져서 존재하는 공통 기능. 꼭 필요한 기능인데 해당 기능을 사용하기 위해 동일하거나 비슷한 코드가 기계적으로 특정 위치에 들어가는 것이 해당함. ex) 인증, 로그인
'Spring' 카테고리의 다른 글
| [Error] - the annotation @value is disallowed for this location. the attribute value is undefined for the annotation. (0) | 2024.04.01 |
|---|---|
| [Error] - java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for (0) | 2024.03.29 |
| [Spring] - 직렬화를 하는 이유(implements Serializable) (0) | 2024.03.13 |
| [Spring] 스프링 빈 (0) | 2024.02.22 |
| [Spring] DI(Dependency Injection) (0) | 2024.02.21 |