1. Spring Framework란?
💡 자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로서 엔터프라이즈급 어플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션이다.
엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 뜻이다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 환경을 뜻한다.
2. Spring Framework의 특징
- IoC ( Inversion of Control ) : 제어의 역행 제어의 주체가 개발자가 아닌 프레임워크라는 뜻으로 때에 따라 프레임워크가 작성된 코드를 호출하는 기술. 객체의 생명주기의 관리까지 모든 객체에 대한 제어권을 프레임워크가 가진다.
- DI ( Dependency Injection ) : 의존성 주입 의존성 객체를 개발자가 생성하지 않고 클래스를 Bean으로 등록해놓으면 Bean으로 등록된 객체를 프레임워크가 찾아서 알아서 주입해주는 기술이다. 이를 통해 모듈간의 결합도를 낮출 수 있다.
- AOP ( Aspect Oriented Programming ) : 관점 지향 프로그래밍 각 코드마다 공통된 관심사를 분리하여 모듈화하는 프로그래밍 기법. 객체지향적으로 프로그래밍을 했음에도 로그, 트랜잭션, 성능확인 등 공통적인 관심사가 중복되는 문제점을 해결하기 위해 프록시 패턴을 사용하여 코드를 분리하여 관리하는 기술이다.
- PSA ( Portable Service Abstraction ) : 추상화를 통해 코드가 간결해진다. POJO 프로그래밍을 지원하기 위해 다양하게 구현되어있는 인터페이스를 같은 방식으로 사용하도록 중간에 인터페이스 어댑터 역할을 해주는 레이어를 추가하는 방법이다. 실제로 일일이 구현을 해줘야 되는 것들을 스프링이 다 구현해놓고 어노테이션으로 만들어 놓아 어노테이션만 선언하면 내부적으로 다 동작이 되도록 추상화 한 것이다.
- POJO : Plane Old Java Object (순수 자바 객체) EJB 등에서 사용되는 Java Bean이 아닌 멤버 변수와 Getter와 Setter로 구성된 가장 순수한 형태의 기본 클래스이다. "POJO는 getter 와 setter를 가진 단순한 자바 오브젝트"가 아니라 "getter와 setter를 가진 가장 단순한 자바 오브젝트는 POJO"다.
3. MVC 디자인 패턴
MVC는 Model, View, Controller의 약자로, 클라이언트와 상호작용하는 소프트웨어를 설계함에 있어 세가지 요소로 나누어 설계하는 것을 말한다.
3.1 Model
Model은 애플리케이션의 정보, 데이터의 가공을 책임지며 데이터베이스와 상호작용하여 비즈니스 로직을 처리하는 모듈. 즉, 컴포넌트를 말한다.
Model은 아래와 같은 규칙을 가지고 있다.
- 사용자가 이용하려는 모든 데이터를 가지고 있어야 한다.
- View(뷰) 또는 Controller(컨트롤러)에 대해 어떤 정보도 알 수 없어야 한다.
- 변경이 일어났을 때 처리 방법을 구현해야 한다.
- 모델은 재사용이 가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다.
3.2 View
View는 클라이언트 단에서 보여지는 결과화면을 반환하는 모듈. 즉, 사용자 인터페이스 요소를 말하며 아래와 같은 규칙들을 가지고 있다.
- Model(모델)이 가지고 있는 데이터를 저장하면 안된다.Model(모델)이나 Controller(컨트롤러)에 대한 정보를 알면 안된다.
- 데이터를 받아 단순히 화면에 표시해주는 역할만 가진다.
- 재사용이 가능하게끔 설계를 해야 하며 다른 정보들을 표현할 때 쉽게 설계해야 한다.
3.3 Controller
Controller는 client로부터 request가 들어왔을 때 그 입력을 처리하고 어떤 로직을 실행시킬 것인지 Model(모델)과 View(뷰)를 연결해주며 제어하는 모듈을 말한다. Controller는 아래와 같은 규칙들을 가지고 있다.
- Model(모델) 또는 View(뷰)에 대한 정보를 알아야 한다.
- Model(모델) 또는 View(뷰)의 변경을 인지하여 대처를 해야한다.
- 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성 요소에게 통지를 해야 한다.
- 애플리케이션의 메인 로직을 담당한다.
3.4 MVC Pattern
MVC는 크게 MVC1, MVC2 두 가지로 나눌 수 있는데 둘의 가장 큰 차이는 클라이언트의 요청 사항을 모듈화되지 않은 하나의 파일로 처리할 것이냐, 아니면 각각의 기능을 담당하는 모듈들이 역할을 분담해서 처리할 것이냐로 결정된다.
MVC1 Pattern

MVC1 구조는 위 그림과 같이 클라이언트의 요청 사항을 하나의 모듈이 담당한다. JSP가 Controller와 View의 기능을 동시에 맡아서 하며 JSP 페이지에 비지니스 로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여주기 위한 출력 관리 코드가 뒤섞여 있는 구조이다.
MVC2 Pattern

MVC2는 MVC1의 단점을 보완하기 위해 나온 디자인 패턴이다. 위 그림과 같이 기존에 뷰와 컨트롤러의 역할을 모두 수행하던 JSP는 뷰의 역할만 하게 하고, 대신 컨트롤러 역할을 Servlet이 수행한다. MVC1에서는 JSP가 클라이언트의 요청을 받아줬는데 MVC2에서는 컨트롤러 역할을 수행하는 Servlet이 클라이언트의 요청을 받아준다. Servlet이 비즈니스 로직을 수행하며 모델을 호출하여 데이터를 요청하며, 최종적으로 뷰 역할인 JSP 페이지로 포워딩하여 화면에 출력한다.
4. Spring Framework 동작 원리

DispatcherServlet
애플리케이션으로 들어오는 모든 Request를 받는 부분. Request를 실제로 처리할 Controller에게 전달하고 그 결과값을 받아서 View에 전달하여 적절한 응답을 생성할 수 있도록 흐름을 제어한다.
HandlerMapping
Request URL에 따라 각각 어떤 Controller가 실제로 처리할 것인지 찾아주는 역할을 한다.
Controller
Request를 직접 처리한 후 그 결과를 다시 DispatcherServelt에 돌려준다.
ModelAndView
Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체이다.
ViewResolver
View 관련 정보를 갖고 클라이언트에게 포워딩할 실제 View 파일을 찾아주는 역할을 한다.
View
Controller가 처리한 결과값을 보여줄 View를 생성한다.
5. Spring Framework 아키텍처(architecture)

- Test : 유닛테스트등 지원
- Core Container : 스프링 구동의 핵심 모듈
- AOP / Aspects / Instrumentation / Messaging : 유틸성 모듈
- Web : client쪽 처리에 가까운 모듈
- Data Access/Integration : 데이터 처리 관련 모듈
Test
테스트 모듈은 JUnit 또는 TestNG 프레임워크로 스프링 구성 요소 테스트를 지원한다.
Core Container
- Bean : 팩토리 패턴을 정교하게 구현한 빈팩토리를 제공한다. Bean이란 argument(매개변수)가 없는 생성자, Serializable, getter/setter 메소드 제공 조건을 만족하는 자바 클래스를 의미한다.
- Core : IoC 및 의존성 주입 기능을 포함하여 프레임워크의 기본 부분을 제공한다.
- Context : Core 및 Beans 모듈이 제공하는 솔리드 베이스에 구축되며 정의되고 구성된 모든 객체에 엑세스하는 메체이다.
- SpEL(Spring Expression Languge) : 런타임에 객체를 쿼리하고 조작하기 위한 강력한 표현언어 보통 properties에 정의한 내용을 주입한다.
유틸성 모듈 : AOP / Aspects / Instrumentation / Messaging
- AOP : Aspect Oriented Programming 구현을 제공하여 메소드 인터셉터와 포인트컷을 정의하여 분리해야 하는 기능을 구현하는 코드를 깨끗하게 분리할 수 있다.
- Aspects : AspectJ와의 통합을 제공하며, 이는 다시 강력하고 성숙한 AOP 프레임워크이다.
- Instrumentation : 특정 애플리케이션 서버에서 사용될 클래스 계축 지원 및 클래스 로더 구현을 제공한다.
- Messaging : 응용 프로그램에서 사용할 웹 소캣 하위 프로토콜로 STOMP를 지원한다. 또한 웹 소켓 클라이언트의 STOMP 메시지를 라우팅하고 처리하기 위한 애노테이션 프로그래밍 모델을 지원한다.
Data Access / Integration
- JDBC : JDBC 관련 코딩의 필요성을 제거하는 JDBC-추상 계층을 제공한다.
- ORM : JPA, JDO, Hibernate, myBatis를 포함한 객체 관계 매핑 API를 위한 통합 계층 제공한다.
- OXM : AXB, 캐스터, XMLBeans, JiBX 및 XStream에 대한 객체/XML 매핑 구현을 지원하는 추상화 계층을 제공한다.
- JMS(Java message service) : 메시지를 생성하고 소비하기 위한 기능이 포함된다.
- Transaction : 모듈은 특수 인터페이스를 구현하는 클래스와 모든 POJO에 대해 프로그램적 및 선언적 트랜잭션 관리를 지원한다.
@Transactional이라는 애노테이션을 사용하여 트랜잭션을 적용할 수 있다.
Web
- Web : 서블릿을 통한 멀티파트 파일 업로드 기능, IoC 컨테이너 초기화 등 웹 중심의 기본 통합 기능과 웹 중심의 애플리케이션 컨텍스트를 제공한다.
- WebSocket : 웹 애플리케이션에서 클라이언트와 서버 간의 웹소캣 기반 양방향 통신을 지원한다.
- Servlet : 웹 애플리케이션을 위한 스프링의 MVC 구현을 포함한다.
- Portlet : View의 모듈화를 위한 portlet을 지원하기 위한 모듈이다.