멀티캠퍼스

서블릿 기초

isaacagent 2025. 8. 25. 20:09
728x90

Servlet은 자바를 이용해서 웹 서버를 동적으로 웹 페이지를 생성하고, 클라이언트 요청을 처리하는 서버 측 프로그램이다. 주로 HTTP 요청 - 응답 모델을 기반으로 동작하고, 웹 컨테이너 안에서 실행이 된다. 

 

왜 필요할까?

1.     Java의 확장성과 좋은 유지보수성을 이용하여 html에서 활용하기 위해서

2.     MVC 패턴에 용이함

3.     동적인 웹페이지 생성에 특화

 

LifeCycle

1.     첫 요청을 하면 init()이 호출됨

2.     Service()에서 doGet(), doPost() 호출

3.     클라이언트에서 HTTP 응답

4.     서버 종료하면 destroy()

 

Servlet 실행 과정

그림 1. Servlet 실행 과정

흐름도

그림 2. Servlet 흐름도

코드 읽기

@WebServlet(“/hello”)는 해당 서블릿 클래스가 웹 어플리케이션 내에서 “/hello”라는 URL패턴으로 매핑 됨.

그림 3. Annotation을 통한 /helloServlet 호출

클라이언트가 “/hello” URL HTTP GET 요청을 보내면 서블릿 컨테이너가 이 요청을 감지 -> 컨테이너 요청에 매핑된 HelloServlet은 인스턴스 doGet() 호출

최초 “/hello” 요청이 들어오기전 컨테니어가 HelloServelt객체 생성. Init() 메소드 호출로 초기화 진행. 이어서 get()요청을 하면, service() 메소드 호출하여 내부적으로 HTTP 메소드에 맞는 doGet()실행 -> doGet() 메소드에서 HTTP 응답 작성 후 클라이언트에게 전달 -> 컨테이너가 더 이상 서블릿을 필요로하지않거나 서버가 종료 될 때 destroy() 메소드 호출 후 자원해제.

생각 확장

별로 초기화를 따로 하지 않아도 무방함.

객체를 한번 생성 후 그 객체를 여러 클라이언트 요청에서 재사용. 이는 호출 할 때마다 생성하는 것보단 효율적, 그래서 다수의 요청이 들어와도 여러 스레드를 만들어서 멀티 스레드로 일 처리 진행.

자바는 독립적으로 실행되는 어플리케이션인 반면, 서블릿은 클라이언트의 HTTP요청을 받아 동적으로 처리하고 HTTP 응답을 생성하는 방식이고, 컨테이너에 의해 관리가 된다.


JSP

jsp의 문법 요소에는 총 5가지가 존재한다.

1. 지시자

2. 스크립트릿

3. 표현식

4. 선언문

5. JSP 액션태그

 

그림 4. 지시자 예시

 

주로 페이지 처리 방법을 지정하는 주요 문법 요소이다.

contentType - 출력 문서의 타입과 인코딩을 지정

language - JSP에서 사용할 언어를 설정

 

그림 5. ScriptLet 예시

<% ...%> 블록을 사용해서 자바 코드를 작성한다.

그림 6. 표현식 예시

 

<%= .... %> 블록을 사용하여 변수, 계산식, 함수 결과를 페이지에 바로 출력하는 요소이다. 동적으로 값을 출력하는데에 가장 간단한 방식이다.

그림 7. 선언문 예시

<%! ... %> 내의 변수와 메소드는 JSP 서블릿 클래스의 멤버가 된다. 멤버 변수는 객체 생성 시 유지되며, 메소드를 정의해 동작을 작성할 수 있다. 화면에는 표현식을 사용해서 표시 할 수 있다.

그림 8. JSP Action Tag 예시

page 속성 - 포함할 외부 JSP 또는 HTML 파일 경로를 지정한다.

flush 속성 - 현재 JSP 페이지의 출력 버퍼를 비워서 바로 포함 페이지를 실행하게 할지 설정한다. 


주로 React만 다뤄봤고, Spring은 다뤄본적이 없어서 조금 어색한 느낌이 없잖아 있다. 그래서 두 가지를 비교를 해보았다. 

내가 그나마 많이 본 프레임 워크는 Express 이다. Node.js 환경에서 사용이 가능한 백엔드 웹서버 프레임 워크이다. 그럼 그 두 개의 차이점이 뭘까?

 

구분 Servlet Express

언어 Java JavaScript (Node.js)
실행 환경 서블릿 컨테이너 (Tomcat, Jetty, Undertow 등) Node.js 런타임
동시성 모델 멀티스레드 (요청마다 스레드 할당, 풀 관리) 싱글스레드 + 이벤트 루프 (비동기 콜백/Promise)
상태 관리 세션/쿠키 지원 내장 (HttpSession) 세션 관리 미들웨어(express-session) 별도 설치
배포 방식 war 파일을 컨테이너에 배포 Node.js 앱 자체 실행 (node app.js, pm2 등)
확장성 Java EE 표준 기반, JSP/JSF, Spring MVC 등과 연동 미들웨어 조합식 확장, 자유도가 높음

 

Servlet은 주로 요청 및 응답 객체를 사용해서 통신을 진행한다. 규모가 커지면 Spring과 같이 쓰는 점이 있다.

Express는 (app.get('/',...)) 같은 형태로 페이지 구성을 할 수 있다. 그리고 REST API, GraphQL, WebSocket 등 추가로 이어 붙일 수 있다. 

안정적이고 전통적인 시스템을 구축하려면 Servlet 형태가 좋고, 경량화 및 실시간성을 주로 생각하는 경우는 Express를 고려하는 편이 좋다.