Development Artist

[Spring] 서블릿 컨테이너/스프링 컨테이너 용어 정리 본문

Research/Spring

[Spring] 서블릿 컨테이너/스프링 컨테이너 용어 정리

JMcunst 2023. 8. 18. 22:17
728x90
반응형

토비의 스프링을 공부하면서 용어 정리를 조금 하고자 글을 작성한다. 자세한 내용은 해당 책을 참고하면 좋을 것 같다.


서블릿 컨테이너

정의

애플리케이션을 실행하고 관리하는 환경. 서블릿 컨테이너는 서블릿 스펙에 따라 작성된 애플리케이션의 실행을 담당하며, 클라이언트로부터의 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) 정의된 팩토리 메소드를 읽고, 필요한 시점에 해당 메소드를 호출하여 객체를 생성.

728x90
반응형

'Research > Spring' 카테고리의 다른 글

[Spring, IntelliJ] Spring Initialize 시 Dependencies 확인 방법  (0) 2023.08.23
[Summary] Spring vs Django  (0) 2023.08.22
Comments