반응형
목표
- Spring에서 Bean을 사용하는 이유 이해하기
- Spring이 동시 요청을 처리하는 방법 이해하기
QnA. Spring에서 Bean을 사용하는 이유
1. 객체의 효율적인 관리 (메모리 절약 & 중복 생성 방지)
- 동일한 역할을 수행하는 객체를 하나만 만들어서 관리할 수 있다.
- JVM의 Heap 메모리에 객체를 효율적으로 관리한다.
만약, Spring Bean 객체를 사용하지 않는다면, 각각의 클래스마다 동일한 객체를 new 연산으로 생성해서 사용해야 한다. → 이는 비효율적인 메모리 낭비로 이어진다.
2. 편리한 의존성 주입 (Dependency Injection, DI)
- 간편하게 의존성을 주입할 수 있다.
- 등록된 객체는 Spring Framework가 자동으로 관리해 주며, 생성자 주입, 필드 주입 등의 방법으로 주입한다.
QnA. Spring Controller가 어떻게 수백만 개의 요청을 처리하는가?
Spring은 멀티스레드 환경에서 동작하며, 각 클라이언트의 요청을 개별 스레드가 처리한다.
Spring에서 Request별로 Thread가 생성되고, 이에 따라 Servlet이 생성된다.
Spring Container에 등록된 각 Controller 빈들은 Stateless 하게 설계되어, 동시 요청을 처리할 수 있다.
✅ 하나의 Controller 객체 정보는 Heap 영역에 저장된다.
✅ 해당 클래스의 정보와 메서드 호출에 관한 정보는 Method Area에 저장되어 요청을 처리한다.
Method Area와 Heap은 모든 Thread가 접근 가능한 공유 자원이기에 객체의 Binary Code 정보를 공유하여 사용할 수 있다.
Spring Controller의 요청 처리 방식
- DispatcherServlet 요청 수신
- 사용자가 요청을 받으면 Servlet이 생성되고, 이를 Spring의 DispatcherServlet이 가로채어 적절한 Controller로 전달합니다.
- Thread 생성 및 요청 처리
- 미리 생성해둔 Thread Pool에서 요청이 들어오면 WAS가 요청을 처리할 새로운 Thread를 생성합니다.
- 생성된 스레드는 Singleton으로 생성된 Controller 객체의 메서드를 호출하여 요청을 처리합니다.
- 응답 반환
- Controller가 처리한 결과를 DispathcerSerlvet이 받아 Client에게 응답합니다.
Spring Controller의 메모리 관리
Spring의 Controller는 기본적으로 Singleton으로 생성되어, Heap 메모리에 관리됩니다.
- Heap : 클래스 객체(Controller)가 저장됨
- Method Area : Controller 클래스의 코드 정보(메서드, 변수 선언)가 저장됨
- Stack : 각 스레드가 요청을 처리할 때, 메서드 호출과 지역 변수가 저장됨
모든 요청이 싱글톤 Controller 객체를 공유하며, 각 요청별로 별도의 스레드(Stack)가 생성되어 메서드 호출이 이루어집니다.
Singleton Controller에서 동기화 문제는 발생하지 않는지?
Spring의 Controller는 Stateless 하게 설계되어 있다. 즉, Controller 내부에서 공유되는 인스턴스 변수를 사용하지 않으므로,
동기화 문제가 발생하지 않는다.
각 요청을 처리할 때 메서드 내부의 지역 변수(Stack)을 사용하므로, 각 요청이 개별적으로 처리됩니다.
만약 Controller가 상태를 가진다면?
@RestController
@RequestMapping("/user")
public class UserController {
private String userId; // 상태를 가지는 필드 (문제 발생 가능)
@GetMapping("/set")
public void setUserId(@RequestParam String id) {
this.userId = id;
}
@GetMapping("/get")
public String getUserId() {
return userId;
}
}
한 사용자의 요청이 다른 사용자의 요청에 영향을 줄 수 있다.
용어 정리
JVM Heap Memory
- Heap은 프로그램을 실행하면서 생성된 모든 객체를 Heap에 저장한다.
- JVM이 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당되는 영역이다.
- new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 Reference Type을 관리한다.
반응형
'Spring Framework > Spring' 카테고리의 다른 글
Spring DI 방식 비교: 생성자 주입과 필드 주입의 차이점 정리 (0) | 2025.03.14 |
---|---|
Spring ServletContainer와 SpringContainer의 차이 이해하기 (0) | 2025.03.04 |
Spring cloud Eureka 등록된 애플리케이션 조회하기 - open feign 통신 (0) | 2025.01.08 |
Spring MySQL 최적의 DBCP 설정 방법 - hikariCP, MySQL Connection 옵션 이해하기 (1) | 2024.12.21 |
Spring h2 인메모리 DatabaseCleaner 적용 방법 - 테스트 데이터 초기화를 통한 독립적인 테스트 환경 구축 (1) | 2024.12.20 |