안녕하세요 취준어쩌구저쩌구 우기입니다. 원래 다루지 않을려고햇던 Spring의 기본구조인데, 빨리 Spring의 기본구조부터 심화과정 전까지 빠르게 쓱 훑고 넘어가겠습니다. (왜냐면 저도 시간이 없거덩요....)
Spring 프로젝트를 계속 진행하게된다면 사이드 프로젝트나 개인공부를 통해서 적어보겠습니다 (심화과정 쪼아~~~)
스프링 프레임워크란 ?
동적 웹사이트 개발을 위한 자바 플랫폼의 오픈 소스 애플리케이션 프레임워크라고 할 수 있습니다.
[사담]
EJB를 사용할 때 사용해야만 했던 불편한 점들을 스프링 프레임워크에서 극복했다는점을 우리는 알 수 있습니다. EJB란 엔터프라이즈급 어플리케이션 개발을 단순화 하기 위해 만들어진 스펙입니다. 개발했을때 많은 객체들이 만들어지는데, 이러한 비즈니스 객체들을 관리하기위해서 컨테이너를 만들어 필요할때마다 컨테이너에서 객체를 꺼내와 관리하여 효율성을 띄게끔 만들어지는것이 목적이였습니다. 그러나 왜 배보다 배꼽이 더 크다했을까요? 실제 비즈니스 로직보다 구현해야하고 관리해야하는 EJB 컨테이너가 더 많아지게 된것입니다. 그리하여 만들어지게 된것이 '자바 엔터프라이즈급 개발을 편하게 해주는 오픈소스 경량급 어플리케이션 프레임워크'입니다!
스프링 프레임워크의 특징이란?
한마디로 말씀드리자면 스프링은 "IoC와 AOP를 지원하는 경량의 컨테이너 프레임워크" 입니다.
너무나도 경량적인 Spring과 이제는 몰라선 안되는 IoC
스프링은 여러개의 모듈식으로 구성되어있는 모듈식 프레임워크죠 ? 이게 무슨 소리일까요? [Spring Core, Spring Security, Spring Context] 등 이 모듈들이 모여 만들어진것이라고 보면됩니다. 이 모듈들은 하나 이상의 JAR파일로 구성되어 있어 개발자는 쉬운 개발과 실행이 가능합니다. 또한 POJO 형태로 객체를 관리해서 단순하고 가볍습니다.

스프링은 IoC를 통해서 애플리케이션을 구성하는 객체 간의 낮은 결합도를 유지합니다. IoC는 말 그대로 개발자가 직접 생성하거나 제어하는 것이 아닌 스프링의 Spring Bean 모듈에서 객체를 생성하고 관리하는 특징을 잘 설명해줍니다. (Bean 인스턴스를 생성해주는 곳은 Bean Factory)
// 기존 Java
public class TV {
private Speaker speaker;
public TV(Speaker speaker) {
this.speaker = speaker;
}
}
// Spring
@Component
public class TV {
@Autowired
private Speaker speaker;
}
기존 Java 코드를 상세히 봅시다. 내가 직접 Speaker를 new 해서 넣거나, 생성자로 받아야 합니다. 또한 DI(의존성 주입)은 되어있지만 IoC는 전혀 되고 있지않습니다(직접 개발자가 객체를 다뤄야하기 때문). 다른 방면에서는 Speaker로 바꾸려고해도 개발자가 직접 바꿔야하는 귀찮음도 있습니다.(밑에서 추가 내용있음) TV는 무조건 Speaker를 사용해야하는 위치에 서있고 코드 수정에도 어려움을 겪을 수 있습니다. 무언가 힘들어보이죠?
하지만 Spring코드에서 바라본다면 @Autowired가 붙으면 스프링이 알아서 Speaker 객체를 찾아서 넣어줍니다. 또한 TV는 이제 Speaker가 어떻게 만들어졌는지 몰라도 됩니다. 즉 결합도가 느슨해졌다고 볼 수 있습니다. 구체적으로 말씀드리자면
public TV(Speaker speaker) {
this.speaker = speaker;
}
이 부분에서 사실 TV객체는 지금 Speaker가 어떤 Speaker인지 모르죠 비슷한 약결합 구조이지만 만약 new SamsungSpeaker()가 들어온다면 TV는 SamsungSpeaker라는 객체를 알아야만하고 바꾸려면 개발자가 알아서 바꿔야한다는 귀찮음이 존재합니다. (DI는 되어있음)
근데 사실 저렇게 필드 주입해서 @Autowired하는건 좋지않습니다. 예시를 보여드린거니 너무 집중하지말아주세요.
AOP도 포함이다 !
AOP도 신입 개발자들이 많이 관심가져야하는 부분이라고 생각합니다. JAVA에서 객체 지향 프로그래밍이 있다고 하면 관점 지향 프로그래밍또한 존재하는 편입니다. AOP란 관점 지향 프로그래밍이라고도 많이 이야기합니다. 객체 지향 프로그래밍에서 중요한점은 아마 캡슐화, 다양성, 상속을 중요시 여기는 편이라면 관점 지향 프로그래밍은 핵심 기능과는 별개로, 공통적으로 제공해야하는 기능들을 이야기합니다. (로깅, 보안, 트랜잭션 처리) 이를 관점(aspect)로 분리하여 모듈화 하는 방법입니다. 나중에 더 자세하게 이야기드리겠지만 일단 이 정도로 스프링이 하는 역할이 있다 라고 알아두시면 좋을것 같습니다.
[AOP는 공통 관심사를 분리하고, 핵심 비즈니스 로직을 깔끔하게 유지할 수 있게 해주는 강력한 도구]
[Spring AOP는 이를 통해 코드의 중복을 제거하고 효율적인 관리] 를 해주는 친구 !
Spring Framwork의 기본 구조

Core Container
서블릿의 생명 주기를 관리하는 서블릿 컨테이너와 비슷하게 bean의 생성과 관리를 해주는 container 역할을 합니다. [서블릿의 생명주기도 추후에 다룰 예정입니다.]
Spring Core
Core 모듈은 DI와 Ioc 패턴을 적용할 수 있는 기본적인 스프링 프레임워크 클래스들을 포함하고 있습니다.
어떤 타입의 스프링 애플리케이션을 빌드하든 항상 직간접적으로 이 Spring Core에 대한 종속성을 가집니다.
예시를 들어보자면 ApplicationContext 같은 객체들이 존재한다면 Spring Core Container가 스스로 관리하고 의존성을 주입해줍니다.
Spring Bean
Bean 모듈은 모든 bean 객체들의 생명 주기를 관리한다.
Spring Bean이 갖고 있는 Bean Factory는 bean 인스턴스를 생성하거나 bean의 의존성 문제를 해결하는 역할을 담당하고 있다.
그리고 많이들 헷갈려하시는 부분들이 Container와 Bean입니다.
Container는 Bean을 관리하는 "그릇" 또는 공간을 의미하고, Bean은 실제로 "Container" 내에서 관리되는 객체입니다. Spring Bean Container가 이런 역할을 하고 있다를 생각하시면 될것 같습니다.
Spring Context
Spring Context는 Bean 객체들의 의존성 주입을 담당합니다.
대부분의 경우 Spring 애플리케이션이 실행할 때, Spring Context 모듈은 실행되며 ApplicationContext로 불립니다.
(흔히 ApplicationContext.xml에 bean을 등록하여 의존성 주입해주는 역할을 해주는 모듈이라고 생각하면 편합니다. 너무 어려워지는거 같죠? 그래도 한번 해봅시다.
정확히 말하자면 Core Container는 IoC 컨테이너이며, Context는 ApplicationContext라는 IoC 컨테이너라고 말할 수 있습니다. 어떻게보면 Context는 IoC 컨테이너에서 더 확장된 버젼 즉, Bean을 더 잘관리할수있게끔 만들어지는 애라고 생각하겠습니다.

결론적으론 Spring IoC 컨테이너는 객체를 관리하는 개념이고, ApplicationContext는 Spring IoC 컨테이너를 구현한 구체적인 클래스로, IoC 외에도 추가적인 기능을 제공합니다.
SpEL(Spring Expression Language)
Runtime동안 object graph를 쿼링(querying)하고 실행하는데 도움을 줍니다! 라고 말하면 이해를 잘 못하시겠죠?
@Value("#{2 + 3}") // → 5
private int sum;
@Value("#{myBean.someProperty}")
private String valueFromBean;
@Value("#{systemProperties['os.name']}")
private String osName;
어떠세요~! 어디서 많이 보던 친구들이죠? 이렇게 Runtimeㄷ일 때 쿼리를 진행하면 저희가 쉽게 더 작업을 진행할 수 있습니다.
Data Access/Integration
Spring JDBC
Spring JDBC는 Java JDBC API에 대한 추상화를 제공한다. 이러한 추상화와 함께 JdbcTemplate 또한 제공하여 데이터에 쉽게 접근 가능하도록 한다.
Spring ORM
Spring은 Hibernate, JPA와 같이 유명한 ORM 프레임워크를 제공해줍니다. Mybatis로 인해서 한번 설명해드린거 같은데 다시한번 말씀드리자면
데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)이라고 한다.
Java에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야 하는 번거로움이 있습니다.
ORM은 JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있도록 기능을 제공해주는 Persistence Framework 종류입니다.
Spring Transactions
Spring Transactions Management API는 데이터베이스 뿐만 아니라 객체의 트랜잭션을 균일하게 관리해준다. 뿐만 아니라 프로그래밍 방식과 선언적 트랜잭션 관리를 모두 지원해줍니다.
데이터베이스, XML 또는 Messaging을 포함한 다양한 형태의 데이터에 접근하기 용이하도록 하는 모듈들의 모음입니다.
Web
Spring Webmultipart file을 업로드하거나 IoC 컨테이너를 초기화 하는 등 기초적인 웹(Web)에 대한 부분들을 관리합니다.
Spring Web ServletWeb Servlet 모듈은 웹 애플리케이션 실행을 위한 MVC 구현이 포함되어 있다.
Spring Web Sockets웹 애플리케이션에서 Web Sockets(웹 소켓)이란 클라이언트와 서버를 이어주는 터널이라고 생각하면 되는데 Spring Web Sockets은 이러한 Web Sockets을 구축하는데 도움을 줍니다
Web Application을 빌드할 때 사용하는 컴포넌트입니다
그 밖에도 AOP, Aspects, Instrument, Test 그리고 Messaging 등과 구조로 나누어 볼 수 있는데, 더 자세한건 나중에 한번 진행해보도록 하겠습니다.
Spring Framework의 동작 과정
( 제일 중요 하다고 생각합니다)

클라이언트가 요청을 보내면 DispatcherServlet가 가로챈다.
클라이언트가 보낸 HTTP 요청을 보낼 때 아무 요청이나 가로채는 것은 아니고, web.xml의 에 등록된 내용을 토대로 가로채게 된다.
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
위의 <url-pattern> 안에 있는대로 .do가 붙어야 합니다. 'http://localhost8080/post/view.do'처럼 지정한 패턴이 web.xml에 들어있는 경우, DispatcherServlet은 요청을 가로채게 됩니다. 좀 더 자세히 말씀드리자면 그림으로 보여드리겠습니다.


dispatcherservlet은 요청을 가로채서 web.xml이 설정한 토대로 흘러가게 됩니다. dispatcherservlet이 context와 함께 component-scan으로 설정했다면 com.inzent.ibiz 파일 내에있는 루트로 HandlerMapping이 감지하게 될것입니다.
가로챈 요청을 HandlerMapping에게 보내 해당 요청을 수행할 Controller를 찾는다.
@Controller
class HomeController {
@RequestMapping(value = "/post/view")
public String view() {
return "";
}
}
@Controller 어노테이션을 붙이면 Servlet-Context.xml에서는 이를 인식하여 Controller로 등록합니다. HandlerMapping은 DispatcherServlet으로부터 요청을 전달받고, 해당 요청을 수행할 Controller를 찾습니다. 수행할 Controller를 찾았다면 이번에는 HandlerAdapter가 Controller의 Method(@RequestMapping)를 인식하고 찾아가게 됩니다. Adapter 또한 나중에 자세히 설명해드리겠습니다.
실제 요청 처리
@Controller
public class HomeController {
@RequestMapping(value = "/post/view")
public String view() {
// DB에서 포스팅 정보를 가져왔다는 가정한다.
String title = "DB에서 조회한 포스팅 제목";
String content = "DB에서 조회한 포스팅 내용";
return "home";
}
}
Controller의 해당 Method에선 비즈니스 로직을 처리하게 되고 DB를 연동하는 클래스인 DAO를 따라 DB로부터 값을 가져오게 됩니다.
ViewResolver를 통해 View 화면을 찾는다.
@Controller
public class HomeController {
@RequestMapping(value = "/post/view")
public String view() {
// DB에서 포스팅 정보를 가져왔다는 가정한다.
String title = "DB에서 조회한 포스팅 제목";
String content = "DB에서 조회한 포스팅 내용";
model.addAttribute("title", title);
model.addAttribute("content", content);
return "home";
}
}
Model 객체를 이용하여 addAttribute 함수를 통해 화면에 보여줄 값들을 세팅하고 이를 return해줍니다. 이 때, "home"이라는 문자열은 Servlet-Context.xml에 설정된 prefix와 suffix 정보를 참조하여 /WEB-INF/views/home.jsp 파일을 찾는 정보를 제공합니다.
Controller는 View와 View에 전달할 Model 객체를 DispatcherServlet으로 반환하게됩니다. ViewResolver는 Controller가 보내준 View의 이름을 토대로 View 화면을 찾게 됩니다.
ViewResolver가 찾은 View화면을 View로 보내주면 View는 처리 결과를 DispatcherServlet에 보내고, DispathcerServlet은 클라이언트에게 최종 결과를 보내줍니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
${title}
${content}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<body>
<h1>${title}</h1>
<P>${content}</P>
</body>
</html>
View화면(=home.jsp파일)은 Model 객체를 넘겨받고 그 Model 객체 안의 속성 값들을 ${} 기호에 표현된 부분으로 치환합니다. 클라이언트는 처리가 모두 완료된 동적 웹 페이지를 최종적으로 넘겨 받게 됩니다.

어떠신가요 이제 Spring과 흐름에 대해서 이해가 정확히 잘되셨을까요? 저 또한 복습 하는 의미로 잘되고있습니다. 이후로부터는 Spring에 대해서 추가적으로 지식들을 진행하며 여러분들과 사이드 프로젝트를 진행해보도록 해보겠습니다. 따라와주셔서 고맙습니다.
출처 :
[Spring] 스프링 프레임워크(Spring Framework)의 특징과 구조
0. 스프링 프레임워크(Spring Framework)란? 동적 웹 사이트 개발을 위한 자바 플랫폼의 오픈 소스 애플리케이션 프레임워크다. EJB를 사용할 때 알아야만 했던 수많은 디자인 패턴을 신경 쓸 필요없다
velog.io
EJB와 스프링 개론
EJB(Enterprise Java Bean) Java bean이란 자바 객체를 재사용 가능하도록 즉, 컴포넌트화시킬 수 있는 코딩 방침을 정의한 것을 의미한다. (bean은 쉽게 component 또는 객체라고 이해하면 좋다.) EJB란 엔터프
hoon93.tistory.com
https://zzang9ha.tistory.com/441
Spring DispatcherServlet(디스패처서블릿) 개념부터 동작 과정까지
🔗 DispatcherServlet 안녕하세요, 이번 포스팅에서는 Spring에서 HTTP 요청 및 응답과 관련하여 가장 핵심 기술인 DispatcherServlet에 대해 살펴보고자 합니다. 평소에 개념에 대해서는 어느 정도 알고 있
zzang9ha.tistory.com
https://greatzzang21.tistory.com/35
spring HandlerMapping - DispatherServlet설정
: @Controller 어노테이션을 감지하여 해당 클래스를 Controller로 등록할 수 있도록 해줌 로 시작하는 기본패키지(base-package)컨트롤러로 연결 따로 board-servlet.xml 을 작성하지 않아도 어노테이션으로 ha
greatzzang21.tistory.com
추후에 정리할 Spring 기본 구조
AOP [관점 지향 프로그래밍]
Servlet
Spring Dispatcher
Interceptor Filter