
이번 3주차에서는 스프링의 핵심 개념인 IoC와 DI를 시작으로,
객체 생성부터 HTTP 요청 처리까지의 전체 흐름을 학습했습니다.
특히 부록 1~4를 통해 Bean 생성 → Filter → DispatcherServlet → 응답 처리까지
실제 실행 흐름을 따라가며 스프링의 내부 구조를 이해하는 데 집중했습니다.
Spring은
자바 애플리케이션을 쉽게 만들도록 도와주는 프레임워크
핵심은 “뼈대 제공”
자주 쓰는 기능 구조를 미리 만들어둠
개발자는 그 안에 코드만 채움
★ 라이브러리 : 내가 필요할 때 호출
제어권 → 개발자
★ 프레임워크 : 내가 코드를 넣으면 알아서 실행
제어권 → 프레임워크
프레임워크를 쓰면 발생하는 핵심 개념 제어의 역전 (IoC)
객체 생성 / 실행 흐름 / 생명주기
→ 개발자가 아니라 프레임워크가 관리
즉, “내가 실행하는 구조” → “프레임워크가 실행하는 구조”
IoC만으로는 추상적이기 때문에 이를 구현하는 방법이 필요한데, 그게 DI
객체가 필요한 의존성을 직접 생성 ❌
외부에서 주입받음 ⭕
문서에서 핵심 예시: 커피 머신




결과
★ “컨테이너” 개념 ★
Spring 컨테이너
Bean
동작 흐름
DI를 실제 코드로 적용하는 방법
서블릿
HTTP 요청을 처리하는 자바 프로그램
흐름
1. 요청 → Servlet Container
2. Servlet 실행
3. 응답 반환
Spring은 서블릿을 더 발전시킴
핵심: DispatcherServlet
모든 요청을 받는 중앙 컨트롤러
요청 → Controller로 전달 → 응답 생성
Spring (프레임워크)
→ 제어권이 프레임워크로 이동 (IoC)
→ 의존성도 외부에서 관리 (DI)
→ 이를 컨테이너 + Bean으로 구현
→ 웹에서는 Servlet으로 요청 처리
→ Spring은 DispatcherServlet으로 통합 관리

이 포스팅을 시작하며 첨부한 이번주 워크북 자료 사진인데,
이번주는 부록도 있어서 부록에 해당하는 내용까지 정리해보겠습니다.
Application 실행
→ ComponentScan
→ Bean 정의 수집
→ Bean 생성 (싱글톤)
→ 의존성 분석
→ DI 수행
→ ApplicationContext에 저장
ApplicationContext
Bean 생성 과정
DI (의존성 주입)
AbstractAutowireCapableBeanFactory
: Bean 생성 + DI 수행 핵심 엔진
BeanPostProcessor
: Bean 생성 후 개입하는 후처리 단계
AutowiredAnnotationBeanPostProcessor
: @Autowired 찾아서 실제 주입 수행
★ Spring은 실행 시점에 객체를 모두 생성하고, 의존성까지 연결해 둔다
Filter → DispatcherServlet → Interceptor → Controller → 응답
3. HandlerMapping
4. HandlerAdapter
5.Interceptor
6. Controller Controller
1) HTML (SSR)
: ViewResolver → View 렌더링
2) JSON (REST)
: HttpMessageConverter → JSON 변환
부록2 핵심 정리★★★
DispatcherServlet이 중심이 되어 요청을 적절한 Controller로 전달하고 응답을 생성한다
Filter란? Servlet 전에 요청을 가로채는 객체
ApplicationFilterChain
→ Filter1 → Filter2 → Filter3 ...
*순차적으로 실행
doFilter(request, response, chain)
→ 로직 수행
→ chain.doFilter()
다음 필터 호출
FilterChain
ApplicationFilterChain
주요 메서드
요청 → FilterChain 실행 → 모든 Filter 통과 → Servlet 전달
부록3 핵심 정리 ★★★
Filter는 요청을 가장 먼저 처리하며, 여러 개가 체인 형태로 순차 실행된다
ApplicationFilterChain
→ servlet.service(request, response)
→ 필터를 모두 통과한 요청이 서블릿으로 진입
구조:
HttpServlet → FrameworkServlet → DispatcherServlet
기능
흐름
service()
→ doGet / doPost ...
: HTTP 요청 종류 결정
기능
하는 일
핵심 흐름
HttpServlet.service()
→ FrameworkServlet.service()
→ super.service() (다시 HttpServlet)
→ doGet/doPost 실행
→ processRequest()
: 구조상 “핑퐁” 형태로 실행됨
시작
FrameworkServlet
→ DispatcherServlet.doService()
doService 역할
핵심 진입
doService()
→ doDispatch()
: DispatcherServlet의 핵심 로직
전체 흐름
1. HandlerMapping → Handler 찾기
2. HandlerAdapter → 실행 방법 찾기
3. Interceptor preHandle
4. Handler 실행 (Controller)
5. 응답 처리
6. Interceptor postHandle / afterCompletion
역할 : 요청 → Controller 매핑
내부 동작
@RequestMapping 기반 매칭역할 : 다양한 Controller 실행을 통일
이유
Controller 구현 방식이 다양하기 때문:
@Controller주요 Adapter
: RequestMappingHandlerAdapter (가장 많이 사용)
내부 동작
handle()
→ invokeHandlerMethod()
→ invokeAndHandle()
내부 처리
실행 방식 :리플렉션 + 프록시 (AOP 기반)
JSON 처리 흐름
HandlerMethodReturnValueHandler
→ RequestResponseBodyMethodProcessor
→ HttpMessageConverter
실제 변환
MappingJackson2HttpMessageConverter
→ JSON 직렬화
특징
Interceptor
postHandle
→ afterCompletion
마지막 단계
3주차 워크북과 부록들은 단순히 개념을 외우는 것이 아니라,
Bean 생성부터 요청 처리까지의 흐름을 한 번에 연결해서 이해할 수 있었던 주차였습니다.
앞으로는 코드 작성뿐만 아니라,
내부에서 어떤 일이 일어나는지까지 함께 생각하며 학습해보려고 합니다.