JSP

서블릿

서블릿Servlet 은 Server + Applet 의 합성어로 서버에서 실행되는 Applet이란 의미로 자바를 이용하여 웹에서 실행되는 프로그램을 작성하는 기술을 말합니다.

웹 애플리케이션을 제작하기 위해 제공되는 언어는 이미 언급한 PHP, ASP 와 같이 많지만 요즘에 많은 기업에서는 JSP& 서블릿을 사용하고 있습니다. 이는  다른 웹 기술에 비해 빠른 응답을 해 줄 수 있다는 장점이 있기 때문입니다. PHP처럼 JSP 라 하지 않고 JSP& 서블릿이라고 한 이유는 독특한 탄생비화 때문입니다. 이 부분은 뒤이어 설명합니다.

 하지만 앞으로 서블릿을 공부하면서 상속이나 출력 스트림, 예외 처리와 같은 자바 기술에서 사용되는 용어들이 아주 자연스럽게 나오는데, 이들 용어에 대해서 낯선 분들은 자바 기술에 대한 별도의 학습이 필요합니다.

 서블릿은 자바 클래스 형태의 웹 애플리케이션을 말하는데, 브라우저를 통해 자바 클래스가 실행되도록 하기 위해서는 javax.servlet.http 패키지에서 제공하는 HttpServlet 클래스를 상속받아 구현해야 합니다. HttpServlet 클래스를 상속 받아 만든 서브 클래스를 서블릿 클래스라고 합니다.

 서블릿 또한 자바 프로그램의 다른 클래스들처럼 자바 가상머신인 JVM 에서 동작해야 하므로 클래스 파일이 생성되어야 합니다. 그래서 클래스의 형태로 작성합니다. JDK 에는 웹 애플리케이션을 제작할 수 있는 클래스가 제공되는데, 그 클래스가 바로 HttpServlet 입니다. HttpServlet은 웹 서비스가 가능한 웹 애플리케이션을 제작할 수 있도록 자바를 확장해 놓은 클래스로 톰캣을 설치하면 제공됩니다. HttpServlet을 상속받은 클래스를 서블릿이라고 합니다. 이미 여러 기능들이 미리 만들어져 있기 때문에 개발자는 편리하게 HttpServlet 을 활용하여 새롱누 기능의 웹 프로그램을 만들 수 있는 것입니다.

 

Addition");

        out.println("

");

        out.println(num1 + " + " + num2 + " = " + add);

        out.println("");

        out.println("");    

        

        Thread th =new Thread(new Runnable() {

            public void run() {

                AppMain main =new AppMain();

                String[] aa =new String[2];

                aa[0]="Hello";

                main.main(aa);

            }

        });

        th.start();

    }

 

    

    

    

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

 

}

 

Colored by Color Scripter

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

package unit01;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

/**

 * Servlet implementation class AdditonServlet01

 */

@WebServlet("/AdditonServlet01")

public class AdditonServlet01 extends HttpServlet {

    private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public AdditonServlet01() {

        super();

        // TODO Auto-generated constructor stub

    }

 

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        int num1 =20;

        int num2=10;

        int add =num1 + num2;

        PrintWriter out =response.getWriter();

        out.println("

 

 

웹 프로그래밍에서 가장 중요한 것은 클라이언트가 어떻게 서버에 요청하는지를 알아야 합니다. 이것을 이해해야 서블릿의 동작 방식을 이해할 수 있기 때문입니다.  서블릿 클래스에 대한 문법적인 내용은 2장에서 자세히 살펴보고 이번 예제에서는 서블릿 동작 방식을 이해하기 위해 클라이언트가 어떻게 서버에 요청하는지부터 살펴봅시다.

 클라이언트는  서버에 get과 post 두 가지 방식 중 하나로 요청을 합니다. 두 전송 방식의 차이점은 다음과 같습니다.

전송 방식 설명
get방식 주소 창을 타고 넘어가기 때문에 서버로 보내는 데이터를 사용자가 그대로 볼 수 있습니다. 그래서 보안에 취약합니다. 255 자 이하의 적은 양의 데이터를 전송합니다.
post 방식  html  header 를 타고 넘어가기 때문에 보안에 강합니다. 255자 이상의 대용량의 데이터를 전송합니다.

 

1바이트가 8비트인 것처럼, 연필 한 자루가 12개인 것처럼, 주소 입력란에 데이터를 전송하는 데는 제한이 있습니다. 컴퓨터는 2진수 체계이므로 2에 저장할 수 있는 최댓값이 255이다보니 255자까지 저장 가능하도록 한 것이다.

 서블릿 클래스에는 doGet() 혹은 doPost() 가 있는데, 요청 방식에 따라 호출되는 메소드가 달라집니다. get 방식으로 요청하면 doGet() 이 호출되고 post 방식으로 요청하면 doPost() 가 호출됩니다. 그렇기 때문에 요청 방식에 따라 doGet() 혹은 doPost() 메소드 내부에 호출되었을 때 해야 할 일을 써 넣어야 합니다.

 

doGet() 혹은 doPost() 메소드 중 어떤 메소드가 호출되는지 실질적인 HTML 코드로 설명하겠습니다. 보통 <form> 태그를 통해 서버에 무엇인가를 전달하거나 요청을 하게 됩니다. 다음과 같이 말입니다.

<form action="CallServlet">  --->요청할 서블릿

 <input type="submit" value="전송">  --> 클릭하면 서블릿이 요청된다.

</form>

 

위 그림은 <form>태그로 서버 측에 존재하는 많은 서블릿 중 하나를 정해서 요청하고 있습니다. 이를 위해 action 이라는 속성값에 요청할 서블릿 이름을 기술해야 합니다. 전송 버튼이 눌리는 순간에 action 속성값에 지정된 서블릿이 요청됩니다. 

전송 버튼은 일반 버튼이 아닌 <input> 태그이 type 속성값을 "submit" 으로 지정하여 만들어야 합니다.

<form> 태그가 서블릿을 요청할 때는 get과 post 두 가지 전송 방식 중 한 가지로 전송됩니다. 개발자가 원하는 전송 방식을 결정해 줄 수 있는데, 그러기 위해서는 method 속성값을 <form> 태그에 추가하면 됩니다. method 속성값으로 get을 기술하면 doGet()  메소드가, post를 기술하면 doPost() 메소드가 호출됩니다.

 그런데 폼 태그에 서블릿 이름을 넣어 놓으면 서버에서는 어떻게 해당 서블릿을 찾을 수 있을까요?  그것은 WAS(톰캣 엔진) 가 운영체제와 같은 시스템 프로그램이므로 확장자가 .class 인 파일을 톰캣이 가지고 있다가 요청이 들어오면 해당 서블릿 클래스들을 찾아서 실행하는 원리입니다. 뒷부- 분으로 갈수록 이런 동작원리는 확실하게 이해할 수 있을 겁니다.

- <form> 태그를 이용한 get 방식의 요청의 예

<form method="get" action ="CallServlet">

 <input type="submit" value="전송">

</form>

- <form>태그를 이용한 post 방식의 요청의 예

<form method="post" action="CallServlet">

  <input type="submit value="전송">

</form>

 

method 속성을 생략한 채 전송 방식을 결정하지 않으면 기본값인 get 방식으로 요청을 하게 됩니다.

<form> 태그 외에도 HTML 의  <a> 태그를 사용하여 링크를 걸어 주면 서블릿은 get 방식으로 요청한 것으로 인식합니다.

 

- <a> 태그를 이용한 get 방식 요청의 예

<a href="CallServlet" > get 방식의 요청 </a>

 주소 입력란에서 직접 서블릿 요청을 위한 URL 을 입력해도 get 방식으로 요청한 것으로 인식합니다.

 

 요청에 대한 처리를 위한 doGet() 과 doPost() 메소드는 어떤 요청이 왔느냐에 따라 둘 중 하나가 호출된다는 것 빼고는 메소드이 형태는 완전히 동일 합니다. 다음은 doGet(), doPost() 의 형태입니다.

 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServerletException {

}

doGet(), doPost() 에서 동일한 방식으로 처리되기 때문에 doGet() 메소드만 대표로 살펴보도록 합시다.

 

public void doGet(HttpServletRequest request, HttpServletResponse response  ) throws IOException, ServletException {

}

HttpServletRequest request -> 요청 처리 ,

HttpServletResponse response ->응답 처리

IOException , ServletException -> 예외 처리

 

그렇다면 어떤 경우에 Post 방식을 쓰고 어떤 경우에 get 방식을 쓸까요?

 

앞에서도 잠깐 언급했지만 get 방식은 서버로 데이터가 전송될 때 주소 창을 타고 넘어가기 때문에 보안에 취약합니다. 그렇기 때문에 로그인 폼을 만들면서 get 방식을 사용한다면 회원이 입력한 암호가 그대로 노출됩니다.  그래서 get 혹은 post 를 선택할 수 있는 일반적인 폼에서는 Post 방식을 사용하는 것이 일반적입니다.

 반면 폼이 아닌 <a> 태그를 통해서도 페이지를 이동할 수 있는데, 이렇게 하이퍼링크를 통해서 서버가 요청되는 경우에는 무조건 get방식으로 요청됩니다.

 doGet() 메소드는 throws 절로 메소드에서 발행하는 IOException, Servlet Exception 예외를 외부에서 처리하도록 정의되어 있고 두 개의 매개 변수를 갖습니다. HttpServletRequest 형으로 선언된 첫 번째 매개 변수는 클라이언트의 요청(request) 을 처리하고, HttpServletResponse 형으로 선언된  두 번째 매개 변수는 요청 처리 결과를 클라이언트에 되돌리기 (응답하기 , response) 위해 사용됩니다.

 서버가 요청에 대한 처리를 마치고 클라이언트에게 결과를 되돌려주기 위해서는 아래와 같이 doGet()  혹은 doPost() 의 두 번째 매개 변수인 HttpServletRequest 로부터 PrintWriter 형의 출력 스트림 객체를 얻어 와야 합니다.

 

public void doGet(HttpServletRequest request, HttpServletResponse  response) throws IOExceptio, ServletException{

  PrintWriter out =response.getWriter();

}

또한 아래와 같이 PrintWriter 출력 스트림 객체의 println() 을 호출하면 브라우저에 HTML 코드를 보내주어 결과를 얻어 볼 수 있게 됩니다.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException

{

  PrintWriter out =response.getWriter();

out.println("<html><head><title>Addition </title></head>");

}

자바의 문법적인 형태를 그대로 닮은 서블릿에 대해서 살펴보았으니 이제 같은 목적을 위해 나왔지만 자바의 성격은 거의 느끼지 못하는 HTML 과 유사한 JSP 의 전반적인 개요에 대해서 살펴보도록 하겠다.

 

JSP

Jsp 는 Java Server Page 의 줄임말로 자바로 서버 페이지를 작성하기 위한 언어입니다. HTML 과 JSP 태그로 구성되어 화면을 작성하는 데 유리한 웹 프로그램밍 기술 입니다. 서버 페이지는 웹 서버에서 실행되는 페이지를 말하며 요청에 필요한 페이지를 이한 로직이나 데이터베이스와의 연동을 위해 필요한 것들을 포함합니다.

 이러한 서버 페이지에서 실행되는 로직을 구현하기 위해서는 프로그래밍 언어가 필요한데, JSP 에서는 자바를 사용하고 있습니다. 여기서 말하는 자바는 우리가 알고 있는 썬마이크로시스템즈 (현 오라클로 변경) 의  '자바'를 말합니다. 즉 JSP 에서는 자바 언어로 로직(프로그램)을 구현합니다.

 다음은 서블릿 클래스를 학습하면서 살펴본 두 수에 대한 합을 구하여 결과를 출력하는 예제를 JSP로 변환한 예입니다. 이 예제를 실행하기 위해서는 주소 입력란에서 직접 JSP 페이지를 기술하여 실행합니다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<%
    int num1 =20;
    int num2 =10;
    int add =num1 + num2;
%>
<%=num1 %> + <%=num2 %> =<%=add %>

</body>
</html>
 

앞에서 이클립스로 JSP 페이지를 만들고 실행하는 방법을 알려주었는데, 그 방법대로 여러분이 직접 JSP 페이지를 만들고 실행해 보기 바랍니다.위 JSP 예제를 살펴보면 서블릿과는 사뭇 다르다는 것을 느낄 것입니다.  서블릿은 자바 코드 내부에 HTML 코드가 들어가는 구조이지만, JSP 는 이와  반대로 HTML 문서 내부에 자바 코드가 들어가는 구조입니다.

 HTML 문서 일부분에서 자바를 사용할 수 있도록 하기 위해서 JSP 는 다양한 태그를 제공합니다. 위 예(addition02.jsp) 에서는 <%@ page %> 태그가 사용되었는데 이 태그는 해당 페이지 내에 사용되는 전반적인 환경을 결정해주는 태그입니다. 이 페이지에서 language ="java" 는 사용하는 언어가 자바이며 contentType ="text/html "; 은 이 페이지가 html 문서이며 charset=UTF-8 pageEncoding="UTF-8" 은 한글 인코딩을 UTF-8 로 처리하겠다는 의미입니다.

 <%  %> 태그를 스크립트릿 scriptlet 이라고 하고 <%= %> 태그는 표현식 (expression) 이라고 합니다. JSP 페이지에 기술한 내용은 HTML 로 간주되기 때문에 자바 코드를 기술하기 위해서는 <% %> 태그 내부에 기술해야 하면 변수에 저장된 값이나 함수의 결과값을 출력하기 위해서는 <%= %> 태그를 사용합니다. 자세한 내용은 뒤에서 살펴볼 예정이니 이런 게 있구나 정도만 기억하고 넘어가시기 바랍니다.

 서블릿과 JSP 를 비교해 보면 JSP 로 개발하는 편이 훨씬 쉽고 간단하다는 것을 알 수 있을 것입니다. 그렇다면 서블릿은 필요 없을까요? 지금까지 살펴본 예제에서는 로직이 복잡하지 않기 때문에 HTML 코드 중심의 구조인 JSP 로 페이지를 개발하는 것이 효율적이로 보이지만 쇼핑몰과 같은 웹 애플리케이션을 개발하다 보면 복잡한 자바 코드가 기술되어야 하는데, 이를 JSP 페이지에 기술해 두면 디자이너가 실수로 코드를 건드려 문제가 발생하게 됩니다.

 그렇기 때문에 실무에서는 아래에서 보여주는 예 (AdditionServlet03.java, addition03.jsp) 와 같이 복잡한 로직은 서블릿에 기술해 놓고 결과만을 JSP페이지를 통해 클라이언트에 제공하는 형태로 개발합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

import java.io.IOException;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

/**

 * Servlet implementation class AdditionServet03

 */

@WebServlet("/AdditionServet03")

public class AdditionServet03 extends HttpServlet {

    private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public AdditionServet03() {

        super();

        // TODO Auto-generated constructor stub

    }

 

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        

        int num1 =20;

        int num2 =10;

        int add =num1 + num2;

        

        request.setAttribute("num1", num1);

        request.setAttribute("num2", num2);

        request.setAttribute("add",  add);

        

        RequestDispatcher dispatcher =request.getRequestDispatcher("02_addition.jsp");

        dispatcher.forward(request, response);

    }

 

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

 

}

 

Colored by Color Scripter

cs  

 

AdditionServlet03 클래스의 내용은 AdditionServlet01.java 내용보다 간단합니다. 이클립스에서 자동으로 생성해주는 클래스에는 불필요한 내용이 

많기 때문에 코드 길이가  길어져서 이해하기 힘들어질 수 있기 때문에 필요한 내용만 남겨 두고 정리해 둔 것입니다. 이후에 나오는 서블릿 클래스도 이와 마찬가지로 이클립스에서 생성해준 코드보다는 훨씬 간단한 형태일 것입니다. 직접 만든 서블릿 클래스와 내용이 다르다고 혼동하지 말기 바랍니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

${num1} +${num2 } =${add }

</body>

</html>

 

Colored by Color Scripter

cs

 

AdditionServelt03.java 에서는 두 수에 대한 합을 구하는 자바 코드를 기술하고 출력할 데이터를 request 객체의 속성값으로 저장한 후 서버 상에서 페이지가 이동되는 포워드 방식으로 addition03.jsp 페이지로 이동을 하면 addition03.jsp 페이지에서는 request 객체에 저장된 속성값을 얻어와 출력해줍니다. 포워드 방식은 4장에서 자세히 학습합니다. 이와 같이 로직과 표현을 분리하여 프로그래밍을 하는 것을 MVC 패턴이라고 합니다. 서블릿이 비즈니스 로직을 구현하는 Model 역할을 하고 Jsp 가 결과를 출력하는 View 역할을 하고 있습니다. MVC 패턴으로 웹 프로그래밍을 하는 것은 복잡하고 까다로운 것이므로 서블릿과 JSP 문법을 다 습득한 후에 다루도록 하겠습니다.

 

1. 다음 Java 기술 중 웹 애플리케이션을 지원하며 HTML 과 JSP 태그 (스크립트릿) 로 구성되어 화면을 작성하는 데 유리한 것은 ?

JSP 

2. 웹 서버와 웹 애플리케션 서버가 무엇인지 개념을 설명하시오.

웹 서버는 클라이언트의 요청을 받으며 해당 처릴르 하여 클라이언트에 결과 페이지를 응답해 줄 수 있도록 구성된 서버 또는 그 서버가 설치된 컴퓨터를 의미 합니다. 웹 애플리케이션 서버는 웹 서버만으로는 데이터베이스와 연동되어 처리 되어야 하는 동적인 데이터들을 처리 해 낼 수 없기때문에 DBMS 와  웹 서버 사이에서 제어를 해주는 프로그램을 말한다.

 

3. 알고 있는 WAS 를 모두 기술하시오.

BEA사의 웹로직, IBM 의 웹스파이어, SUN 사의 IPlanet, Oracle 9iAS, 티맥스의 제우스 

 

4. 어떤 식으로 요청을 하면 doGet 메소드가 호출되는지 사례를 들어 설명하시오

- 주소 입력란에서 직접 요청을 하는 경우

- form 태그의 method 속성 값을 get으로 주거나 생략할 경우

 

5. 서블릿과 JSP 의 차이점을 기술하시오.

- 서블릿은 자바 클래스 내부에서 자바 코드가 기본이 되고 출력 스트림을 통해 HTML 코드를 문자열 형태로 기술하여 클라이언트에 전송하고 JSP는 HTML 코드가 기본이 되고 스크립트릿 안에 자바 코드를 기술합니다.

 

6. 한글 인토딩은 무엇이며 왜 해야 하는지 설명하시오.

- 인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와의 매핑 규칙을 말합니다. 예를 들어 ASCII code 에서 ABC 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩입니다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있습니다.

컴퓨터는 영미권에서 만들어졌기 때문에 영어를 표현하는 경우는 아무런 문제가 없지만 다른 문자를 사용하는 나라에서 자국의 언어로 표현하려면 문제가 되는 경우가 있습니다.

그렇기 때문에 한글을 표현하는 인코딩을 적용하여 문서를 만들어야 합니다. 한글 인코딩은 MS949(윈도 OS에서 기본으로 사용) UTF-8 등이 있습니다.

 

7. localhost 는 자신의 컴퓨터를 지칭하는 도메인 네임이다. 이 도메인 네임에 대응되는 IP 주소는 무엇인가?

127.0.0.1

 

8. 웹 프로그래밍을 하기 위해 WAS 서버로 톰켓(tomcat) 을 사용했을 때에, 사용할 웹 포트 번호를 변경하기 위해 수정해야 할 파일명은 

(Server.xml ) 이다.

 

9. Tomcat에 대한 설명으로 바른 것은?

1 - Apache SorftWare Foundation 에서 개발한 서블릿/JSP 컨테이너

 

 

 

 

 

about author

PHRASE

Level 1  머나먼나라

댓글 ( 4)

댓글 남기기

작성