Spring 과 톰캣

 

출처 https://taes-k.github.io/2020/02/16/servlet-container-spring-container/

스프링 컨테이너가 동작하는 컨텍스트

컨텍스트? 애플리케이션 실행 환경이나 특정 동작과 관련된 상태 정보

 

 

 

 

톰캣과 스프링 컨테이너가 동작하는 방법

 

Apache Tomcat (톰캣)

1. 개념

Apache Tomcat(톰캣)은 Java 기반의 **웹 애플리케이션 서버(Web Application Server, WAS)**로, Java 애플리케이션을 실행하고 HTTP 프로토콜을 통해 클라이언트 요청을 처리합니다. 스프링 프레임워크(Spring Framework)를 사용하여 개발된 애플리케이션은 톰캣과 같은 WAS 위에서 실행되므로, 톰캣은 스프링 애플리케이션을 이해하기 위한 중요한 기반 기술입니다.


2. 톰캣의 주요 역할

  1. HTTP 요청 처리:
    • 클라이언트(웹 브라우저 등)에서 오는 HTTP 요청을 받아 서버 애플리케이션으로 전달.
    • 애플리케이션이 처리한 결과를 HTTP 응답 형태로 클라이언트에게 반환.
  2. 애플리케이션 실행 환경 제공:
    • Java 애플리케이션(WAR 파일) 실행 환경.
    • 스프링 애플리케이션도 톰캣을 통해 실행됨.
  3. 경량화된 WAS:
    • 톰캣은 JEE 표준에서 서블릿, JSP 등의 일부 기능만 제공하며, 대규모 WAS(WebLogic, WebSphere)보다 가볍고 단순.

3. 톰캣의 구성 요소

  1. Catalina
    • 톰캣의 핵심 컴포넌트. 요청을 처리하고 애플리케이션을 실행.
  2. Coyote
    • HTTP/1.1 프로토콜 커넥터. 클라이언트의 요청을 처리하고 응답.
  3. Jasper
    • JSP 파일을 서블릿(Java) 코드로 변환하고 실행.
  4. Host
    • 여러 개의 애플리케이션을 한 서버에서 관리할 수 있는 환경 제공.

4. 스프링 애플리케이션과 톰캣의 관계

  • 톰캣은 실행 환경, 스프링은 프레임워크:
    • 톰캣은 스프링 애플리케이션이 동작하는 서버 환경을 제공.
    • 스프링은 비즈니스 로직, 데이터 처리, 사용자 요청을 관리하는 애플리케이션 프레임워크.
  • 톰캣에 스프링 애플리케이션 배포:
    • 스프링 애플리케이션은 일반적으로 WAR 파일 형태로 패키징되어 톰캣에 배포됨.
    • 요청 처리는 톰캣이 HTTP 프로토콜을 통해 받고, 애플리케이션 내부의 로직은 스프링이 처리.

 

 

 

 

 

서블릿 관점에서 보는 구조로 정리하면 다음처럼 이해할 수 있다.

 

 

 

서블릿?

서블릿(Servlet)

1. 개념

서블릿(Servlet)은 **자바(Java)**로 작성된 서버 측 프로그램으로, 웹 요청을 처리하고 동적인 콘텐츠를 생성하기 위해 사용됩니다. 서블릿은 Java EE (Enterprise Edition)의 핵심 기술 중 하나로, HTTP 요청과 응답을 처리하는 데 특화되어 있습니다.


2. 서블릿의 주요 특징

  • 서버 측 동작: 클라이언트(웹 브라우저)로부터 들어온 요청을 처리하고 결과를 반환.
  • 플랫폼 독립성: 자바 기반이므로 다양한 플랫폼에서 실행 가능.
  • 확장 가능성: 웹 애플리케이션에서 동적인 콘텐츠(HTML, JSON, XML 등)를 생성하기 위해 사용.
  • HTTP 프로토콜 지원: HTTP 요청(GET, POST, PUT 등)을 쉽게 처리할 수 있음.

3. 서블릿의 동작 원리

  1. 클라이언트 요청: 사용자가 브라우저에서 URL을 입력하거나 폼 데이터를 제출.
  2. 서블릿 컨테이너(Web Server): 요청을 받아 해당 서블릿으로 전달.
  3. 서블릿 처리: 요청 데이터를 처리하고, 필요한 경우 데이터베이스나 다른 리소스에 접근.
  4. 응답 생성: 처리 결과를 HTML, JSON 등의 형식으로 클라이언트에 반환.

4. 서블릿의 주요 구성 요소

  1. HttpServlet 클래스: 모든 서블릿 클래스는 이 클래스를 확장하여 구현.
    • 주요 메서드:
      • doGet(HttpServletRequest req, HttpServletResponse res): GET 요청 처리.
      • doPost(HttpServletRequest req, HttpServletResponse res): POST 요청 처리.
  2. HttpServletRequest 객체: 클라이언트의 요청 정보를 담고 있음.
  3. HttpServletResponse 객체: 클라이언트로 응답 데이터를 보냄.

5. 서블릿의 생명주기(Lifecycle)

  1. 초기화(init): 서블릿 객체가 생성된 후 초기화 작업을 수행.
  2. 요청 처리(service): 클라이언트의 요청을 처리하며, 요청에 따라 doGet 또는 doPost 메서드 호출.
  3. 종료(destroy): 서블릿이 제거되기 전에 호출되며, 자원 정리 작업 수행.

6. 서블릿의 장점

  1. 빠른 실행 속도: 요청과 응답을 효율적으로 처리.
  2. 플랫폼 독립적: 다양한 운영체제와 서버에서 실행 가능.
  3. 재사용성: 코드의 모듈화와 유지보수성 증가.
  4. 확장 가능: 다양한 자바 기술(JSP, Spring 등)과 통합하여 사용 가능.

7. 서블릿과 JSP(Java Server Pages)의 관계

  • 서블릿: 주로 비즈니스 로직과 요청 처리를 담당.
  • JSP: 주로 HTML 기반의 뷰(View)를 생성하는 데 사용.
  • 사용 방식:
    • 서블릿에서 요청을 처리하고 데이터를 JSP에 전달.
    • JSP는 데이터를 출력하여 클라이언트에게 보냄.

8. 서블릿 컨테이너

서블릿은 **서블릿 컨테이너(Servlet Container)**에서 실행됩니다. 이는 서블릿을 실행하고 HTTP 요청/응답을 관리하는 환경을 제공합니다.

  • 주요 서블릿 컨테이너:
    • Apache Tomcat
    • Jetty
    • WildFly

그러면 서블릿은 최근에 안쓰냐?

실제로는 고수준 프레임워크 아래 단 예로 스프링프레임워크안에서

자동으로 사용하고 있다고 보면 된다.

없어진게 아니라 개발자가 관여하지 않아도 되게 된 것이다.

이해를 돕기위한 간단한 서블릿 코드

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello") // URL 매핑
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<h1>Hello, Servlet!</h1>");
    }
}

'Spring - Spring Boot' 카테고리의 다른 글

@PrePersist에 대하여  (0) 2025.01.07
Spring - Spring Boot - Swagger 설정하기  (0) 2024.12.12
Spring Security - 2 - Bean 등록  (1) 2024.12.04
Spring Security - 1 - 설정  (2) 2024.12.04