여러 회사에서 사용하고 있는 스프링 프레임워크에 대해 항상 공부를 해보고 싶단 생각만 하고 있었는데 우연한 기회로 스터디를 시작하게 되어 스프링에 대해서 공부한 내용을 정리해보려고 한다.

스프링 프레임워크는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링이라고 한다. 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 있다.
'스프링' 이란 이름의 유래는 이전에 Java EE의 스펙을 구현한 EJB가 기술의 복잡도가 증가해서 성능이 느렸던 그 시절을 '겨울'으로 표현하고 그 시절을 탈피하여 '봄'으로 다시 시작한다는 것을 의미한다 하여 스프링이 되었다고 한다.
한국 전자정부표준프레임워크의 기반 기술이며 공공기관의 웹 서비스 제공 시 스프링을 권장하고 있다.
스프링은 Plain Old Java Object 방식의 프레임워크이다. 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
EJB 등에서 사용되는 Java Bean이 아닌 멤버 변수와 Getter와 Setter로 구성된 가장 순수한 형태의 기본 클래스이다.
스프링은 관점지향 프로그래밍을 지원한다. 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다. AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다. 분리 관리한다는 개념이 처음에 이해하기가 어려운데, 추상/부모/클래스나 인터페이스로 관리된다는 게 아니라 모듈을 관리해 주는 모듈을 상하/인터페이스 관계없이 따로 마련한다는 개념에 가깝다.
프로그래밍에서 구성 요소 간의 의존 관계가 소스 코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스 코드를 다양한 곳에 사용할 수 있으며 모듈 간의 결합도도 낮출수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜 준다.
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
스프링 프레임워크는 Bean이라는 이름으로 프레임워크에서 사용되는 Java객체(혹은 Component)의 생성, 소멸을 직접 관리한다. 우선순위 설정, Configutaion을 통해 코드로 작성해 두고, 필요한 객체만을 사용할 수도 있다.
스프링 프레임워크는 총 6개의 모듈로 구성되어 있다.

제어 역전(IoC)과 의존성 주입(DI) 기능을 제공한다.
제어역전은 전체적인 프로세스의 흐름이 개발자가 아니라 프레임워크에 의해 결정된다는 뜻이다. 개발자는 프레임워크가 정한틀에 따라 적절한 코드를 작성해 넣기만 하면 되기 때문이다.
의존성 주입은 객체 생성에 관한 뜻이다. 클래스 A와 B가 있다고 할 때, A 클래스의 메소드 내에서 B 클래스의 객체를 생성하여 비즈니스 로직에 사용하면 A는 B에 '의존'하는 관계가 된다. 그리고 A,B 클래스가 아닌 외부에서 A클래스의 메소드를 호츌하고, 파라미터 값으로 B클래스의 객체를 전달한다면 이것은 '주입'이 된다. 그렇다면 의존성 주입은 이 두 상황을 합치면 된다. 파라미터값으로 전달받은 B객체를 A클래스의 메소드 내에서 비즈니스 로직에 사용하는 것을 의미한다. 즉 A와 B의 '의존'관계가 외부에서의 '주입'을 통해 이루어 진 것이다.
제어역전(IoC) 컨테이너는 스프링의 가장 중요하고 핵심적인 기능으로서 자바의 반영(reflection)을 이용해서 객체의 생명주기를 관리하고 의존성 주입(Dependency Injection)을 통해 각 계층이나 서비스들간의 의존성을 맞춰준다. 이러한 기능들은 주로 환경설정을 담당하는 XML파일에 의해 설정되고 수행되었으나 현재는 Auto Configuration을 사용한 YML, YAML 으로 구성하기도 한다.
JDBC 추상 계층을 제공한다. JDBC는 자바의 데이터베이스 커넥터이다. 데이터가 담겨있는 VO(Value Object) 클래스를 이용해 사용한다.
JPA, Hibernate와 같은 ORM이나 MyBatis 같은 데이터베이스 API 등과 통합할 수 있는 기능을 제공한다
스프링은 로깅이나 보안, 트랜잭션 등 핵심적인 비즈니스 로직과 관련이 없으나 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 개발하고 실행 시에 서로 조합할 수 있는 관점 지향 프로그래밍(AOP)을 지원한다. 기존에 널리 사용되고 있는 강력한 관점지향 프레임워크인 AspectJ도 내부적으로 사용할 수 있으며, 스프링 자체적으로 지원하는 실행시(Runtime)에 조합하는 방식도 지원한다. 공통 로직을 한군데서 관리해서 공동으로 사용한다는 개념자체는 어렵지 않으나, 데이터와 변수가 어디서 어디로 오고 가는지를 따지면 복잡하다. 스프링 공부 중 최악의 난이도 실질적으로는 로그 찍기용이 대부분이라고 ,,
Spring Web MVC, Struts, WebWork 등 웹 애플리케이션 구현에 도움되는 기능을 제공한다.
EJB, JMX 등의 엔터프라이즈 J2EE 스펙에 관한 기능을 제공한다.

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