본문 바로가기

Servlet, JSP

Servlet의 작동구조

 

이번 글에서는 HTML + Servlet을 이용해 간단한 계산기 웹 애플리케이션을 만들어보고, 이 과정에서 자주 등장하는 parameter, mime-type, request, PrintWriter, this.form 같은 개념들을 정리해보겠습니다.


프로젝트 개요

  • 기능: 두 숫자를 입력받아 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지를 계산
  • 구성 파일
    1. calc.html – 사용자 입력 폼
    2. CalcAction.java – 입력값을 받아 계산하고 결과를 HTML로 응답하는 Servlet

1. HTML 입력 폼 (calc.html)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>간단 계산기</title>
<script type="text/javascript">
	const regular_number = /^[0-9]{1,4}$/;
	function send(f){
		// 숫자 검증
		if(!regular_number.test(f.su1.value)){
			alert("0~9999 사이 숫자만 입력하세요.");
			f.su1.value="";
			f.su1.focus();
			return;
		}
		if(!regular_number.test(f.su2.value)){
			alert("0~9999 사이 숫자만 입력하세요.");
			f.su2.value="";
			f.su2.focus();
			return;
		}
		f.submit();
	}
</script>
</head>
<body>
<form action="calc.do" method="POST">
	수1: <input name="su1"><br>
	수2: <input name="su2"><br><br>
	<input type="button" value="계산해줘" onclick="send(this.form)">
</form>
</body>
</html>

주요 포인트

  • this.form : 클릭한 버튼이 속한 <form> 요소를 참조합니다.
  • JavaScript로 숫자 검증 후 f.submit() 호출 → 서버의 /calc.do로 POST 요청 전송.

2. 서블릿 코드 (CalcAction.java)

@WebServlet("/calc.do")
public class CalcAction extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        
        String su1String = request.getParameter("su1");
        String su2String = request.getParameter("su2");
        
        int su1 = Integer.parseInt(su1String);
        int su2 = Integer.parseInt(su2String);

        response.setContentType("text/html; charset=utf-8;");
        PrintWriter out = response.getWriter();

        out.print("<html><body>");
        out.print("<h1>:::계산결과:::</h1>");
        out.print(String.format("<h4>[%d] + [%d] = [%d]</h4>", su1, su2, su1 + su2));
        out.print(String.format("<h4>[%d] - [%d] = [%d]</h4>", su1, su2, su1 - su2));
        out.print(String.format("<h4>[%d] * [%d] = [%d]</h4>", su1, su2, su1 * su2));
        out.print(String.format("<h4>[%d] / [%d] = [%d]</h4>", su1, su2, su1 / su2));
        out.print(String.format("<h4>[%d] %% [%d] = [%d]</h4>", su1, su2, su1 % su2));
        out.print("<a href='calc.html'>다시하기</a>");
        out.print("</body></html>");
    }
}

3. 주요 개념 정리

1) Parameter

  • 클라이언트 → 서버로 전달되는 데이터
  • 형식: name=value
  • 예: /calc.do?su1=10&su2=5
  • 가져오기: request.getParameter("su1")

2) MIME-Type

  • 응답 데이터의 형식 지정
  • 예:
    • text/html : HTML 문서
    • application/json : JSON 데이터
    • image/png : PNG 이미지
  • 여기서는 response.setContentType("text/html; charset=utf-8;")로 HTML 응답 + 한글 인코딩 지정

3) Servlet 역할

  • 웹 요청을 받고 적절한 처리를 거쳐 응답을 생성하는 컨트롤러
  • 직접 비즈니스 로직을 처리하기보다, 필요한 경우 Service 객체에 위임
  • 흐름:
    1. 요청 수신
    2. 요청 데이터 파싱
    3. 비즈니스 로직 호출
    4. 응답 생성 및 전송

4) Service 객체 역할

  • 순수한 비즈니스 로직 수행
  • DB 접근이 필요한 경우 DAO와 협력
  • Servlet과 달리 HTTP 요청/응답 처리보다 **“무엇을 할 것인가”**에 집중

5) request 객체

  • 클라이언트 요청에 대한 모든 정보 포함
  • 파라미터, 헤더, 쿠키, 요청 메서드 등 접근 가능

6) PrintWriter

  • 서버에서 클라이언트로 텍스트 데이터 전송
  • 함수명(예제에서는 out).print()를 사용해 HTML 태그와 내용 작성

7) this.form

  • 클릭된 버튼이 포함된 <form> 요소를 참조
  • JavaScript에서 해당 form을 제어할 때 사용 (submit(), reset() 등)

4. 동작 흐름도

[사용자] calc.html에서 숫자 입력 → "계산해줘" 클릭
      ↓ (JS 유효성 검사 통과 시)
[웹 브라우저] POST 요청 /calc.do (su1, su2 포함)
      ↓
[서블릿 CalcAction] request.getParameter()로 값 수신
      ↓
사칙연산 수행
      ↓
HTML 결과 생성
      ↓
[브라우저] 결과 페이지 표시