웹 서버(Web Server)
웹 서버는 주로 정적인 콘텐츠(Static Content) 제공과 간단한 HTTP 요청 처리를 담당한다. 주로 Apache HTTP Server, Nginx, IIS (Microsoft)와 같은 서버들이 웹 서버 역할을 수행한다.
웹 서버 (Web Server) 의 주요 역할
✅ 정적 콘텐츠(Static Content) 제공
정적 콘텐츠라는 리소스가 이미 완성된 채로 서버에 존재하여 원본 그대로 응답하는 데이터를 의미한다.
- HTML, CSS, JavaScript, 이미지, 비디오 등의 리소스를 그대로 제공
- HTML 페이지 요청 (ex.
index.html
,about.html
) - 정적인 이미지 파일 제공(.jpg, .png)
- 스타일시트(.css), 자바스크립트(.js) 파일 제공
- HTML 페이지 요청 (ex.
✅ HTTP 요청에 대한 단순한 처리
- GET, POST 등의 HTTP 요청에 따른 단순한 리소스 전송
✅ 리버스 프록시(Reverse Proxy) 역할 수행 가능
- 클라이언트와 애플리케이션 서버(WAS) 사이에서 중계 역할
- 부하 분산(Load Balancing), 캐싱(Caching), 보안 강화 등의 부가 기능 제공 가능
애플리케이션 서버(Application Server, WAS)
애플리케이션 서버는 정적인 콘텐츠뿐 아니라 주로 동적인 콘텐츠(Dynamic Content) 를 생성하기 위한 비즈니스 로직을 수행한다. Java에서는 JSP, Servlet, EJB, Spring과 같은 서버 사이드 기술을 이용하여 비즈니스 로직을 처리한다. 대표적으로 Java에서는 JSP나 Servlet을 동작시키는 서버가 이에 해당한다.
WAS의 주요역할
✅ 동적 콘텐츠(Dynamic Content) 처리
- Servlet/JSP와 같은 Java 코드를 실행하여 동적으로 콘텐츠를 생성하여 제공
- 사용자의 요청마다 다른 응답을 동적으로 구성하여 제공
- 로그인 후 사용자 맞춤형 페이지 제공
- 쇼핑몰 장바구니 기능 구현
- 데이터베이스에서 정보를 읽어 화면에 표시하는 기능 구현
✅ 비즈니스 로직 처리
- 요청을 받아 비즈니스 로직 수행(인증, 계산, 데이터 처리 등)
✅ 트랜잭션 및 데이터베이스 관리
- JDBC를 통한 데이터베이스 접근과 관리
- 트랜잭션 관리(예: 결제 시 거래 일관성 유지)
✅ 애플리케이션 관리 기능
- 배포 관리, 세션 관리, 로깅 등 애플리케이션의 전체적인 실행 환경 관리
WAS 만 사용하게 된다면 !
WAS 가 너무 많은 역할을 담당하여 서버 과부하 발생 가능성이 높아진다. 실행에 가장 중요한 Application 로직이 정적 리소스로 인해 수행되지 않을 수 있다. WAS에 장애가 생기면 아무런 화면도 보여줄 수 없다.
그러나 실제 웹 시스템은 !!
정적 리소스는 Web Server에서 처리하고 Web Server는 Application 로직이 필요한 요청만을 WAS에 전달한다.
Java 웹 애플리케이션 구조 예시는 다음과 같다.
클라이언트 (브라우저)
│ HTTP Request
▼
┌───────────────────┐
│ Web Server (정적 콘텐츠) │
│ - Nginx, Apache │
└───────────┘
│ (동적 요청 전달)
▼
┌───────────────────┐
│ Application Server │
│ - Tomcat, Jetty │
│ - Servlet, JSP, Spring│
└───────────┘
│ (DB 접근, 로직 처리)
▼
┌───────────┐
│ Database │
│ - MySQL, Oracle │
└───────────┘
구분 | 주요 역할 | 사용 예시 |
---|---|---|
Web Server | HTML, CSS, JS, 이미지 같은 정적인 자원 제공 | Apache, Nginx |
Application Server(WAS) | Servlet/JSP 실행, 비즈니스 로직 처리 및 DB 연결 | Apache Tomcat, WildFly, WebLogic, WebSphere |
Web Server와 WAS(Web Application Server)의 차이점
- 실제로는 Web Server도 Application 로직을 포함할 수 있다.
- WAS는 Application 코드를 실행하는 것에 더욱 특화되어 있다.
- Java에서는 Servlet Container 기능을 제공하면 WAS 이다.
결론적으로 좋은 웹 서비스 설계는?
- 정적인 콘텐츠는 웹 서버(Nginx, Apache)가 제공하고,
- 동적인 비즈니스 로직과 애플리케이션은 WAS(예: Tomcat)가 담당하는 구조가 가장 이상적이다.
서블릿 (Servlet)
서블릿(Servlet)은 자바 기반의 웹 서버에서 실행되는 서버 측 자바 프로그램이다. 간단히 말해, 웹 클라이언트 (브라우저)의 요청을 처리하고 응답을 반환하는 역할을 한다.
HTTP 프로토콜 기반 요청(Request) 및 응답(Response)을 처리하는데 사용된다. JAVA에서 Sevlet은 HttpServlet 클래스를 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 기술 중 하나이다. 또한 JSP, Spring MVC와 같은 다양한 웹 기술의 바탕이 되는 개념이다.
Servlet 예시코드
URL (/example
)이 호출되면 service()
메서드가 실행된다.
@WebServlet(name="ExampleServlet", urlPatterns = "/exmaple")
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
@Override
protected void service(
HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
) {
// application logic
}
}
Servlet 동작 순서
- 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청을 한다.
- WAS가 HTTP 요청 메시지를 분석하고 요청을 받은 Servlet 컨테이너는
HttpServletRequest
,HttpServletResponse
객체를 생성한다. - 설정된 정보(URL, HTTP Method)를 갖고 WAS가 서블릿 컨테이너를 통해 어떠한 Servlet에 대한 요청인지 찾는다.
- 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라
doGet()
혹은doPost()
등의 메서드를 호출한다. - 서버에서 응답을 생성한 뒤
HttpServletResponse
객체에 응답을 담아 Client(브라우저)에 반환한다. - 응답이 완료되면 생성한
HttpServletRequest
,HttpServletResponse
객체를 소멸한다.
이해하기 쉬운 예시
- 고객이 메뉴(HTTP 요청)를 주문하면,
- 웨이터(WAS)가 요리사(서블릿)에게 전달하고,
- 요리사(서블릿)가 요리(비즈니스 로직)를 만들고,
- 웨이터(WAS)가 고객에게 요리를 서빙(HTTP 응답)하는 것
여기서 ! 개발자인 우리가 하는 일은 !
- Request 객체에 담겨져 있는 HTTP 요청 정보를 꺼내서 사용한다. 요청 정보 (URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행한다.
- 생산된 Response 객체에 HTTP 응답 정보를 입력한다.
Servlet Container
톰켓처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리하는 역할을 한다.
Servlet Container가 하는 일
서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
동시 요청에 대한 처리를 위해 Multi Thread
를 지원한다.
서블릿 생명주기
객체의 생성에서 종료에 이르는 과정을 Servlet 생명 주기라고 한다. 서블릿 컨테이너는 서블릿 객체를 생성하고 각 단계마다 자동으로 특정 메서드를 호출하여 해당 단계에 필요한 기능을 수행한다.
[클라이언트 요청] → [컨테이너]
├─ 서블릿 클래스 로딩 (최초 요청 시 1회)
├─ 서블릿 인스턴스 생성 (최초 요청 시 1회)
└─ 서블릿 초기화 (init() 메소드 최초 1회 호출)
│
서비스 메소드 호출 (service())
├─ GET 요청 처리(doGet)
└─ POST 요청 처리(doPost)
│
서블릿 종료 (destroy() 메소드 호출)
단계 | 메소드 | 호출 시점 | 호출 횟수 | 수행 작업 예시 |
---|---|---|---|---|
서블릿 초기화 | init() |
최초 요청 시 | 최초 1회만 | DB 연결, 환경설정 로딩 등 |
요청 처리 | service() → doGet() 또는 doPost() |
클라이언트 요청 발생 시 | 요청마다 (다중 호출) | 비즈니스 로직, 응답 생성 |
서블릿 종료 | destroy() |
서버 종료, 서블릿 변경 등 | 1회만 | 자원 해제 및 정리 작업 |
SSR, CSR
✅ SSR(Server Side Rendering)
서버에서 동적으로 HTML을 만들어 클라이언트에게 제공하는 기술로 백엔드 개발자 영역에 속한다. Java에서는 JSP, Thymeleaf가 대표적으로 사용된다.
✅ CSR(Client Side Rendering)
웹 브라우저에서 자바스크립트를 사용해 동적으로 HTML을 생성해서 적용하는 기술로 웹을 모바일 앱 처럼 부분 부분 변경할 수 있게 해준다. 프론트엔드 개발자 영역에 속하는 React, Vue가 대표적으로 사용된다.
'Backend > Web' 카테고리의 다른 글
MVC 패턴의 발전과정 (0) | 2025.03.20 |
---|