코딩짜는 일상

[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 11차 - 서블릿과 JSP 본문

TIL

[현대이지웰 Java 풀스택 개발자 아카데미 6월] TIL 11차 - 서블릿과 JSP

Remily 2025. 9. 25. 00:01
반응형

📚 서론

초기의 웹은 요청 링크에 맞춰 고정된 텍스트 문서를 제공해주는 단순한 기능에서 시작되었습니다.

이런 느낌으로 문서들이 연결됨 출처: giphy

 

하지만 고정된 정보를 제공하는 것에서 더 나아가 실시간으로 바뀌는 상황을 반영하거나

클라이언트와의 상호작용을 통해 정보를 가공하여 제공하고자 하는 필요성이 생겼죠.

 

그리하여 동적 웹 프로그래밍 언어인 PHP, JSP, Servlet 등이 탄생하게 되었습니다.

 

 

 

웹 애플리케이션 동작 흐름 예시

 

위 이미지는 계산기 웹 애플리케이션을 만들었다고 가정했을 때 동작 흐름도를 그려본 것입니다.

 

클라이언트가 2 * 5 * 고객의 수를 알려달라고 요청하면 웹 서버는 이것을 웹 애플리케이션 서버(WAS)에 전달합니다.

그리고 WAS가 필요에 따라 DB와 상호작용 하는데, 이 경우엔 고객의 수를 요청하고 응답 받습니다.

그 후 응답 받은 값을 계산하여 200이라는 값을 도출하고 웹 서버로 회신하며, 웹 서버는 이것을 다시 클라이언트에 회신합니다.

 

 

여기서 200이라는 값의 응답을 클라이언트

즉, 사용자가 육안으로 확인하려면 HTTP 태그로 사용자의 브라우저에 응답이 도착해야 합니다.

 

그렇다면 200이라는 단순 값을 HTTP 태그로 변환해주는 건 누가 하는 걸까요?

 

 

 

 

 

🎷 서블릿 (Servlet)

서블릿은 WAS 내부에서 동작하는 자바 클래스

클라이언트의 요청을 받아 처리하고 응답을 생성하는 컴포넌트입니다.

 

지금은 이 분류가 좀 희미해졌는데,

이유는 현재 웹 서버들이 실제로는 WAS와 통합된 형태로 동작하는 경우가 많기 때문입니다.

 

대표적인 웹 서버 Apache HTTP Server는 정적인 처리를 하지만 Tomcat, PHP같은 모듈을 붙여 동적인 처리도 가능합니다.

그래서 요즘은 Apache Tomcat이라고 붙여서 부르기도 합니다.

 

 

아무튼 정리하자면 서블릿동적인 처리를 해주는 웹 컴포넌트이며 웹 컨테이너에서 실행되는 자바 클래스입니다.

또한 자바 기반이라 자바코드로 이루어져 있으나 웹에서 동작하도록 구성된 코드입니다.

 

사용법은 다음과 같습니다.

 

 

1. 새로운 서블릿 파일 생성하기 📜

이클립스를 열고 File > New > Dynamic Web Project를 선택해 새로운 프로젝트를 만들고

Java Resources 의 src/main/java에 오른클릭 > New > Servlet을 선택해 줍니다.

 

그 후 서블릿 파일 이름을 입력해주고

(현재 src/main/java에 곧바로 서블릿을 만들고 있으므로

Java package를 입력하지 않으면 자동으로 (default package)가 됩니다.)

 

URL mappings에 서블릿 파일명으로 자동 생성된 맵핑명을 더블 클릭

원하는 URL Mapping Pattern으로 수정해 줍니다. (혹은 새로운 맵핑 패턴을 추가할 수도 있습니다.)

 

mapping pattern은 링크의 마지막 부분이 되는데

위와 같은 형태로 웹 페이지의 주소가 최종 결정됩니다.

 

src/main/webapp/WEB-INF/web.xml 파일을 수정해서

 

 

매핑 패턴까지 설정했다면 마지막으로 서블릿에 추가할 메서드들을 선택해줍니다.

 

Constructors from superclass는 대부분의 경우 해지하고 쓰는 편인데

이것은 서블릿의 상위 클래스인 HttpServlet의 생성자를 자동으로 삽입해주는 기능으로써

대부분은 HttpServlet을 상속 받은 상태 그대로 사용하기 때문입니다.

 

doGetdoPost의 경우 HttpServletRequestHttpServletResponse를 통해

클라이언트 폼으로부터 요청값을 받거나 응답값을 내보내기 위해 사용됩니다.

 

init초기화 메서드로써 브라우저 객체를 생성할 때 최초로 한 번 실행되며

destroy마지막에 호출되는 메서드로써 화면을 새로고침 하거나 소스코드가 변경될 때마다 실행됩니다.

 

 

2. 서블릿 클래스 작성 ✍️

해당 서블릿 페이지에 접속했을 때 실행할 내용을 클래스로 작성합니다.

 

저는 클라이언트에서 GET방식이나 POST방식 중 어떤 요청을 보내더라도 동일한 처리를 하기 위해

doProcess 클래스를 추가하고 doGet과 doPost 메서드에 넣어주었습니다.

@WebServlet("/servletTest") // 매핑 패턴
public class FirstServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 실행할 내용	
	}
}

 

이제 클라이언트에 Hello world를 찍어볼건데

서블릿의 경우 PrintWriter 클래스의 getWriter()메소드를 통해 클라이언트에 출력할 수 있습니다.

 

 

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	response.setContentType("text/html; charset=utf-8");
    PrintWriter out = response.getWriter();
    
    out.print("<h1>Hello world</h1>");
}

 

 

3. 출력 🖨️

서버를 실행하면 다음과 같이 출력됩니다!

 

 

 

단점 😥

클라이언트에 응답을 출력하는 방법을 보면 아시겠지만,

PrintWriter 클래스의 getWriter() 메소드를 사용해 out 객체를 만들고

out객체에 print(), println() 메소드를 사용해 HTML 태그를 직접 작성해 클라이언트로 내보냅니다.

 

이것은 매우 복잡하고 가독성이 낮은 방법입니다.

또한 웹 브라우저 디자인과 서비스 로직의 분리가 어렵습니다.

 

이것을 보완하기 위해 JSP가 탄생하게 되었습니다. 😎

 

 

 

 

 

🎺 JSP

JSP는 서블릿과 다르게 HTML코드에 자바코드를 삽입한 형태로 작성되며,

서버 사이드 스크립트 언어입니다.

 

서블릿의 단점인 UI와 로직의 혼합 문제를 보완하기 위해 등장한 기술로

웹 페이지의 표현(View) 영역을 쉽게 작성할 수 있도록 설계되었습니다.

 

 

서블릿을 보완하기위해 만들어진 만큼 실행순서도

 

가장 먼저 Servlet(.java)로 변환된 후 컴파일 되고

컴파일 결과를 통해 .class 파일을 생성한 후 최종적으로 실행됩니다.

 

 

어떤식으로 사용하기에 view와 로직을 분리할 수 있는지

위 서블릿 예제를 JSP로 변형하면서 사용법을 보여드리겠습니다.

 

 

1. 새로운 JSP 파일 생성하기 📜

JSP는 HTML 기반이기에 src > main > webapp폴더에 만듭니다.

 

별다른 설정이 필요없기 때문에 파일명만 입력해주고 바로 Finish 합니다.

 

 

2. HTML로 View 작성 ✍️

앞서 서블릿을 실습할 때 <h1> 태그로 Hello world를 출력해줬을 뿐이니 단출하지만 동일하게 작성하겠습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<h1>Hello world</h1>

 

 

3. 서블릿으로 Controller 작성 🕹️

서블릿으로 실습한 내용은 클라이언트가 Get방식과 Post방식 둘 중 어느것으로 요청하던

<h1> 태그로 Hello world를 출력하는 내용이었습니다.

 

Hello world를 출력하는 부분은 완성했으니

이제 요청이 도착하면 만들어둔 JSP를 호출하는 부분만 작성하면 됩니다.

 

이 부분은 서블릿으로 작성해 보겠습니다.

@WebServlet("/servletTest2")
public class SecondServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("/JSP파일이름.jsp").forward(request, response);
	}
}

 

 

4. 출력 🖨️

출력 결과는 서블릿과 동일합니다!

 

 

단점 😥

JSP의 경우 서블릿으로 요청값을 받아 간편하게 HTML코드 내에 출력도 가능합니다.

 

// 서블릿
@WebServlet("/servletTest2")
public class SecondServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	String name = request.getParameter("name");
        request.setAttribute("userName", name); // 전달받은 요청값을 jsp로 넘기기
		request.getRequestDispatcher("/JSP파일이름.jsp").forward(request, response);
	}
}

 

// JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
// 1. ${}로 변수를 출력한다.
<h1>Hello world, ${userName }!</h1>

// 2. 또는 <%= %>로 출력도 가능하다.
<h1>Hello world, <%= request.getAttribute("userName") %>!</h1>

 

하지만 이 방식 역시 HTML 코드 내에 자바코드가 섞이므로

가독성이 하락하고 유지보수가 어렵습니다.

 

또한 서블릿 부분을 보면 클라이언트가 보내는 요청의 형식이 어떤것인지에 따른 처리도 추가로 필요하고

JSP에 받은 값을 보내기 위해 setAttribute()로 바인딩하는 과정도 필요합니다.

 

 

이런 번거로운 과정을 생략하고 개발자에게 컨텐츠 자체에만 집중할 수 있도록 만들어진 것이 Spring입니다.

 

 

다음주에는 이것에 대해 정리해보도록 하죠!

 

 

 

 

 

🔥 결론

과거 직장에서 PHP의 template_를 쓴 경험이 있는데

이번에 배운 JSP와 흡사한 부분이 많아서 신기했습니다.

 

이런걸 보면 언어는 서로 좋은 부분은 차용하면서 점점 발전해 나가는 것 같네요.

 

이런게 선의의 경쟁 아니겠어요? 🤭

반응형