일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- DFS
- codingtest
- Algorithm
- 분할정복
- issue
- cos pro 1급
- Flutter
- 코드품앗이
- cos pro
- 동적계획법과최단거리역추적
- BAEKJOON
- 파이썬
- C++
- Vue
- 동적계획법
- 안드로이드스튜디오
- vuejs
- DFS와BFS
- 개발
- 안드로이드
- Python
- django
- DART
- AndroidStudio
- cos
- 코테
- android
- 백준
- 코딩테스트
- Today
- Total
Development Artist
[Spring] 서블릿 컨테이너/스프링 컨테이너 용어 정리 본문
토비의 스프링을 공부하면서 용어 정리를 조금 하고자 글을 작성한다. 자세한 내용은 해당 책을 참고하면 좋을 것 같다.
서블릿 컨테이너
정의
웹 애플리케이션을 실행하고 관리하는 환경. 서블릿 컨테이너는 서블릿 스펙에 따라 작성된 웹 애플리케이션의 실행을 담당하며, 클라이언트로부터의 HTTP 요청을 받아서 해당 요청에 대한 처리를 수행하고 그 결과를 반환한다.
종류
Tomcat, Jetty, Undertow, ...
기능
- 애플리케이션 관리: 서블릿 컨테이너는 웹 애플리케이션의 생명주기를 관리. 애플리케이션의 시작, 종료, 로딩, 언로딩 등의 단계를 처리한다.
- HTTP 요청 처리: 클라이언트로부터의 HTTP 요청을 받아서 해당 요청을 처리하는 서블릿을 실행하고, 그 결과를 클라이언트에게 반환.
- 스레드 관리: 다수의 클라이언트 요청을 동시에 처리하기 위해 스레드 관리를 수행. 각 요청마다 별도의 스레드를 할당하여 동시에 여러 요청을 처리할 수 있도록 한다.
- 세션 관리: 사용자의 상태를 유지하기 위해 세션 관리를 수행. 사용자 세션을 생성, 유지, 종료하며, 세션 데이터를 관리한다.
- 보안: 보안 기능을 제공하여 클라이언트 요청의 검증, 인증, 권한 부여 등을 처리한다.
구현 코드
public static void main(String[] args){
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer();
webServer.start();
}
서블릿
정의
서블릿 컨테이너 내 위치하는 실제로 기능을 하는 웹 컴포넌트.
구현코드
public static void main(String[] args){
WebServer webServer = serverFactory.getWebServer(serverContext -> {
serverContext.addServlet("hello", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(200);
resp.setContentType("text/plain");
resp.getWriter().println("Hello Servlet");
}
});
});
}
프론트 컨트롤러
정의
웹 애플리케이션의 클라이언트 요청을 중앙에서 처리하는 핵심 컴포넌트.
클라이언트로부터의 모든 요청을 받아들이고, 해당 요청을 적절한 핸들러(컨트롤러)로 전달하며, 이에 대한 처리와 응답의 흐름을 관리.
대표 클래스
DispatcherServlet
기능
- 요청 분배: 클라이언트 요청이 들어오면 DispatcherServlet이 이를 받아들이고, 요청의 내용을 분석하여 적절한 핸들러(컨트롤러)에게 전달.
- 핸들러 실행: DispatcherServlet이 받은 요청을 처리할 실제 핸들러(컨트롤러)를 실행. 이 때, 요청의 내용과 매핑된 핸들러를 실행하며, 해당 핸들러가 비즈니스 로직을 수행한다.
- 뷰 렌더링: 핸들러가 비즈니스 로직을 실행한 결과를 토대로 화면을 생성하기 위해 뷰를 선택하고 렌더링한다. 이를 통해 클라이언트에게 최종적인 응답을 제공.
- 인터셉터 처리: DispatcherServlet은 요청 전후에 인터셉터(Interceptor)를 활용하여 추가적인 작업을 수행. 인터셉터는 요청 처리의 전, 후 단계에서 수행되며 보안 체크, 로깅, 로그인 상태 확인 등을 처리한다.
구현 코드
public static void main(String[] args){
GenericWebApplicationContext applicationContext = new GenericWebApplicationContext();
applicationContext.registerBean(HellobootApplication2.class);
applicationContext.registerBean(SimpleHelloService2.class);
applicationContext.refresh();
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer(serverContext -> {
serverContext.addServlet("dispatcherServlet", new DispatcherServlet(this)
).addMapping("/*");
});
webServer.start();
}
스프링 컨테이너
정의
Spring 프레임워크에서 객체의 생성, 관리, 의존성 주입(Dependency Injection) 등을 담당하는 핵심 컴포넌트.
Assembler 라고도 한다.
대표 인터페이스
ApplicationContext
타입
- BeanFactory: 스프링 컨테이너의 가장 기본적인 인터페이스로서, 객체의 생성과 조회, 의존성 관리 등을 담당. 게으른(lazy) 초기화를 지원하며, 실제로 객체가 필요한 시점에 생성. 이 때 객체의 실제 생성 및 설정은 XML 또는 Java Config와 같은 설정 메타데이터를 통해 이루어진다.
- ApplicationContext: BeanFactory 인터페이스를 확장한 인터페이스로, BeanFactory의 모든 기능을 포함하면서 추가적인 기능을 제공. ApplicationContext는 미리 객체를 초기화하고 미리 의존성을 주입하여 애플리케이션의 시작 시점에 객체들을 준비해 놓는다. 또한 다국어 처리, 이벤트 발행 및 리스닝, 환경 설정 등의 기능도 제공.
구현 코드
public static void main(String[] args){
// 아래 4줄
GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBean(HellobootApplication2.class);
applicationContext.registerBean(SimpleHelloService2.class);
applicationContext.refresh();
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
WebServer webServer = serverFactory.getWebServer(serverContext -> {
}
webServer.start();
}
빈
정의
스프링 컨테이너가 관리하는 객체.
객체 지향 프로그래밍에서 클래스의 인스턴스를 객체라고 부르듯이, 스프링에서는 클래스의 인스턴스를 빈이라고 부른다.
빈은 스프링에서 개발자가 정의한 클래스를 기반으로 생성된다.
특징
- 생성 및 관리: 스프링 컨테이너가 빈의 생명주기를 관리하므로, 개발자는 빈의 생성 및 소멸과 같은 라이프사이클 관리에 신경 쓸 필요가 없다.
- 의존성 주입: 빈은 의존성 주입을 통해 다른 빈들과 협력하도록 구성된다. 이를 통해 빈 간의 결합도를 낮추고 유연성과 테스트 용이성을 높일 수 있다.
- 스코프: 빈은 싱글톤, 프로토타입 등 다양한 스코프로 생성될 수 있다. 스코프는 빈의 인스턴스가 생성되는 범위와 생명주기를 결정.
- 메타데이터: 빈은 XML, 애노테이션, JavaConfig와 같은 메타데이터를 통해 설정된다. 이를 통해 어떤 클래스를 빈으로 등록하고 어떻게 생성하고 의존성을 주입할지 등을 정의할 수 있다.
팩토리 메소드
정의
빈(Bean) 객체를 생성하고 초기화하는 메소드.
팩토리 메소드 패턴을 활용하여 객체 생성과 관련된 복잡한 로직을 캡슐화하고, 빈의 생성과 초기화 과정을 유연하게 관리할 수 있다.
스프링 컨테이너는 빈(Bean) 객체를 생성하고 관리하는 주체로서, 빈 팩토리 메소드를 호출하여 객체를 생성하고 초기화한다.
스프링 컨테이너는 설정 파일 (XML, JavaConfig)에 정의된 빈 팩토리 메소드를 읽고, 필요한 시점에 해당 메소드를 호출하여 객체를 생성.
'Research > Spring' 카테고리의 다른 글
[Spring, IntelliJ] Spring Initialize 시 Dependencies 확인 방법 (0) | 2023.08.23 |
---|---|
[Summary] Spring vs Django (0) | 2023.08.22 |