🔎 스프링 프레임워크의 특징과 서블릿과의 공통점
📌 1. 스프링 프레임워크 요청 처리
- DispatcherServlet:
- 스프링 프레임워크에서는 모든 요청이 DispatcherServlet으로 전달됩니다.
DispatcherServlet은 HttpServlet을 상속받아 동작하며, Front Controller 역할을 수행합니다.
- 요청(Request)와 응답(Response)을 주입받아 처리합니다.
📌 2. 스프링의 객체 관리
-
스프링의 역할:
- 자원 관리와 객체 라이프사이클(생성, 소멸)을 스프링 컨테이너가 대신 수행합니다.
- 개발자가 직접 객체를 생성하거나 소멸시킬 필요가 없습니다.
-
객체 생성 금지:
- 스프링에서는 개발자가 new 키워드를 사용하여 객체를 생성하지 않습니다.
- 대신, 의존성 주입(Dependency Injection, DI)을 통해 필요한 객체를 스프링 컨테이너에서 받아옵니다.
📌 3. 싱글톤 패턴과 공통점
싱글톤 패턴이란?
- 정의:
- 객체를 애플리케이션에서 단 한 번만 생성하고, 그 객체를 공유하여 재사용하는 디자인 패턴.
- 장점:
- 메모리 절약.
- 객체 관리 용이.
- 동일한 상태를 유지하는 데 적합.
서블릿과 스프링의 공통점
- 싱글톤 패턴 기반:
- 서블릿과 스프링 모두 기본적으로 싱글톤 패턴으로 동작.
- 요청마다 새로운 객체를 생성하지 않고, 생성된 객체를 재사용.
-
스프링 프레임워크:
- 모든 요청은
DispatcherServlet이 처리.
- 객체 생성과 소멸은 스프링 컨테이너가 담당.
- 개발자는 직접
new 키워드를 사용하지 않으며, 의존성 주입(DI)을 통해 객체를 주입받음.
-
공통점:
- 서블릿과 스프링 모두 싱글톤 패턴으로 작동하여 메모리를 효율적으로 사용.
🔎 스프링과 서블릿의 차이점
📌 1. 초기화 방식의 차이
서블릿 (Servlet)
- 게으른 초기화 (Lazy Initialization)
- 요청이 들어올 때
Servlet 객체를 생성합니다.
- 필요할 때 객체를 생성하여 메모리에 로드하는 방식.
스프링 (Spring)
- 이른 초기화 (Eager Initialization)
- 애플리케이션 시작 시
ApplicationContext를 통해 빈(Bean)을 미리 생성하고 초기화합니다.
- 빈을 메모리에 미리 로드하여 요청 시 빠르게 사용할 수 있습니다.
BeanFactory
ApplicationContext - 이른 초기화
| 항목 | 서블릿 | 스프링 |
|---|
| 초기화 시점 | 요청 시 (Lazy Initialization) | 애플리케이션 시작 시 (Eager Initialization) |
| 메모리 사용 방식 | 필요할 때 객체 생성 | 객체를 미리 생성 및 메모리에 로드 |
📌 2. 요청/응답 의존성의 차이
서블릿 (Servlet)
HttpServletRequest와 HttpServletResponse에 강하게 의존
- 요청(Request)과 응답(Response)을 처리하기 위해 직접적으로 사용.
- 서블릿은 요청-응답 주기에 밀접하게 연결.
스프링 (Spring)
- 의존성 없음
- 요청이나 응답 객체 없이도 동작 가능.
@RequestParam, @RequestBody, @PathVariable 등 어노테이션을 통해 요청 데이터를 간접적으로 전달받음.
차이점 요약
| 항목 | 서블릿 | 스프링 |
|---|
| 요청/응답 의존성 | HttpServletRequest, HttpServletResponse 필수 | 요청/응답 객체 없이도 동작 가능 |
| 데이터 전달 방식 | 요청/응답 객체를 통해 직접 전달 | 어노테이션(@RequestParam 등)으로 추상화 |
📌 3. 개발 생산성과 유지보수성의 차이
서블릿 (Servlet)
- 요청 및 응답 처리를 직접 작성해야 함.
- 상태 관리, 데이터 파싱, 비즈니스 로직 분리가 어려워 코드가 복잡해질 수 있음.
스프링 (Spring)
- DI(의존성 주입)와 AOP(관점 지향 프로그래밍)를 통해 비즈니스 로직과 요청 처리를 분리.
@Controller, @RestController 등의 어노테이션 기반 개발로 간결한 요청 처리 가능.
Dao -> Data transfer object에서 mybatis를 사용하여 데이터베이스에 접근하는 클래스이다.
@Autowired
private SqlSessionTemplate sqlSessionTemplate; -> mybatis 사용