다들 스프링 프레임워크를 잘 사용하고 있는 와중 동작 원리에 대해 고민해본적이 있는가? 우리가 흔히 사용하고 많은 도움을 주는 프레임워크의 동작 원리 정도는 알아두자.
Spring Framework란?
자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 엔터프라이즈급 어플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다.
엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 뜻이다. 일반적인 프레임워크의 경우 과도한 엔지니어링 기술을 탑재하여 무겁고 고가의 WAS를 갖추어야만 동작했지만 스프링 프레임워크는 엔터프라이즈 개발에서 필요로 하는 기술을 포함하고 있지만 가볍고 단순히 환경에서 사용할 수 있다.
Spring Framework 특징
아래에는 Spring Framework의 여러가지 특징을 대략적으로 소개했다. 각 특징의 자세한 내용은 추가적인 포스팅을 통해 집중적으로 다룰 계획이다.
IoC ( Inversion of Control ) : 제어의 역행
IOC는 "제어의 역전"이라는 뜻으로, 소프트웨어 컴포넌트 간의 의존성 관리를 개선하는 디자인 패턴이다. 기존에는 개발자가 코드 내에서 객체를 생성하고 관리하는 제어를 가지고 있었다.
하지만 IOC 패턴에서는 객체의 생성과 관리를 개발자가 아닌 프레임워크 또는 컨테이너가 담당한다. 객체의 의존성 주입(Dependency Injection)을 통해 컴포넌트들 간의 결합도를 낮추고 유연한 애플리케이션을 만들 수 있다.
DI ( Dependency Injection ) : 의존성 주입
의존성 객체를 개발자가 생성하지 않고 클래스를 Bean으로 등록해놓으면 Bean으로 등록된 객체를 프레임워크가 찾아서 알아서 주입해주는 기술이다. 이를 통해 모듈간의 결합도를 낮출 수 있다.
AOP ( Aspect Oriented Programming ) : 관점 지향 프로그래밍
AOP는 "관점 지향 프로그래밍"이라는 뜻으로, 프로그램의 핵심 로직 외에 부가적인 횡단 관심사(Cross-cutting Concerns)를 모듈화하는 개념이다.
예를 들어 로깅, 트랜잭션 관리, 보안 등은 여러 개의 클래스나 메소드에 중복적으로 적용되는데, AOP는 이러한 횡단 관심사를 분리된 모듈로 구현하여 중복 코드를 줄이고 코드의 가독성과 유지보수성을 향상시킨다.
PSA ( Portable Service Abstraction ) : 추상화를 통해 코드가 간결해진다.
PSA는 "이식 가능한 서비스 추상화"라는 뜻으로, 서로 다른 기술 스택을 사용하는 여러 환경에서 공통된 API를 사용하여 개발을 간소화하는 개념이다.
예를 들어 데이터베이스, 메시징, 원격 호출 등 다양한 기술에 대해 추상화된 API를 제공하여 개발자가 서로 다른 환경에서 일관된 방식으로 개발을 할 수 있도록 도와준다.
POJO : Plane Old Java Object (순수 자바 객체)
POJO는 "평범한 옛날 자바 객체"라는 뜻으로, 간단하고 가벼운 자바 객체를 말한다. POJO는 특정한 인터페이스나 프레임워크에 종속되지 않고, 자바의 기본적인 객체 지향 프로그래밍 원칙을 따르는 객체를 의미한다.
MVC 디자인 패턴
MVC는 Model, View, Controller의 약자로, 클라이언트와 상호작용하는 소프트웨어를 설계함에 있어 세가지 요소로 나누어 설계하는 것을 말한다.
Model
Model은 애플리케이션의 정보, 데이터의 가공을 책임지며 데이터베이스와 상호작용하여 비즈니스 로직을 처리하는 모듈. 즉, 컴포넌트를 말한다.
Model은 아래와 같은 규칙을 가지고 있다.
- 사용자가 이용하려는 모든 데이터를 가지고 있어야 한다.
- View(뷰) 또는 Controller(컨트롤러)에 대해 어떤 정보도 알 수 없어야 한다.
- 변경이 일어났을 때 처리 방법을 구현해야 한다.
- 모델은 재사용이 가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다.
View
View는 클라이언트 단에서 보여지는 결과화면을 반환하는 모듈. 즉, 사용자 인터페이스 요소를 말하며 아래와 같은 규칙들을 가지고 있다.
- Model(모델)이 가지고 있는 데이터를 저장하면 안된다.
- Model(모델)이나 Controller(컨트롤러)에 대한 정보를 알면 안된다. - 데이터를 받아 단순히 화면에 표시해주는 역할만 가진다.
- 재사용이 가능하게끔 설계를 해야 하며 다른 정보들을 표현할 때 쉽게 설계해야 한다.
Controller
Controller는 client로부터 request가 들어왔을 때 그 입력을 처리하고 어떤 로직을 실행시킬 것인지 Model(모델)과 View(뷰)를 연결해주며 제어하는 모듈을 말한다. Controller는 아래와 같은 규칙들을 가지고 있다.
- Model(모델) 또는 View(뷰)에 대한 정보를 알아야 한다.
- Model(모델) 또는 View(뷰)의 변경을 인지하여 대처를 해야한다.
- 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성 요소에게 통지를 해야 한다.
- 애플리케이션의 메인 로직을 담당한다.
Spring MVC 동작 구조
우선 애플리케이션으로 들어오는 Request를 받는 역할을 Dispatcher Servlet이라는 컴포넌트가 처리한다. 이름 그대로 Dispatcher(분배)라는 뜻을 지니고 있기 때문에 요청을 각 컨트롤러에 분배하는 역할로 생각하면 좋다.
이 다음은 Controller 차례다. 회원가입 요청을 받은 UserController는 그에 맞는 처리를 하고 결과를 돌려준다. Dispatcher Servlet에 바로 돌려주는 것이 아닌 ModelAndView라는 객체에 결과를 준다.
그리고 ViewResolver라는 컴포넌트가 ModelAndView 컴포넌트에서 반환한 View를 가지고 클라이언트에 응답으로 보낸다. 그리고 마지막으로 View 컴포넌트가 실제 결과를 화면에 보여준다.
'Spring Framework' 카테고리의 다른 글
[Spring] 필터(Filter)와 인터셉터(Interceptor) 역할과 차이 (0) | 2023.06.16 |
---|---|
[Spring] CustomException이 아닌 Exception 적절하게 처리하기 (4) | 2023.05.09 |
[Spring] 스프링 프레임워크 의존성 주입 방식 (0) | 2023.04.24 |
[Spring Boot, Database] Spring Boot + Redis 제대로 활용하기(2) (1) | 2023.01.18 |
[Spring] 트랜잭션과 @Transactional 정리 (0) | 2023.01.14 |