2012년 5월 28일

JSP.Chapter3 Servlet의 기본개념과 사용법 1



JSP를 배울때 Servlet을 대충 배우고 넘어가는 학원도 많고 그런 책들도 많다.
Servlet은 매우 중요한 기능을 하지만 JSP를 사용하면 자동으로 Servlet이 만들어지기 때문에
굳이 알아둘 필요성이 없다고 말하기도 한다.

필자는 아직 초보라서 잘 모르겠지만 서블릿에 대한 기본개념은 확실하게 알아두고 가는편이 좋다고 생각한다.
(참고로 어떤 강사는 서블릿을 단 1시간도 안걸려서 설명하고 넘어간적이 있다.)
아무리 자동으로 변환되어서 쓸일이 없다 하지만 JSP가 어떻게 변환되고 코딩되어
웹상에서 쓰이는지도 모른다면 반쪽짜리 프로그래머가 될꺼라는 개인적인 견해이다.

아무튼 필자의 개인적인 견해닌깐 너무 심각하게 듣지말고 필자는 이왕 배웠으니 포스팅을 하도록 하겠다.




우선 Servlet란 어떤일을 하는지 알아보자.
Servlet을 배우기전에 우선 간단하게 Web에서 일어나는 일을 한번 보도록 하자.(볼사람만 클릭하자 ; 안봐도 되긴 하다.)
웹이하는일


위의 글에서 Servlet이 하는일이 다 나왔다.
바로 요청(request)을 받고 그에 대한 응답(response)을 해주는것이다.
간단해 보이지만 빠질수 없는 부분인것이다.

이외에도 많은 기능이 있지만 거의 모든 기능이 요청과 응답을 위한 기능이다.
자 그럼 서블릿을 한번 만들어보자.
서블릿도 JDBC처럼 꼭 실행되어야 할 3가지의 순서가 있다. 당연히 외워두면 좋다.

1. Request(요청)

클라이언트가 요청(request)한 자료를 가져오는 부분이다.
클라이언트가 요청을 보낼때 쓰이는 전송방식으로는 get과 post가 있다.

두 전송방식의 차이점은 아래에서 설명하겠다. 

2. Service
java코드로 Losic을 구현하여 요청에 대한 처리를 해주는 부분이다.
이때 DB와 연동을 하여 처리할수 있는 요청이 들어오면 JDBC를 사용하는 것이다.

3.Reponse(응답)
응답을 해줄때 주의점이 우리가 Losic을 구현하는 언어는 java이지만 
java로 요청에 대한 처리를 한후 그 값을 바로 클라이언트로 보내면
클라이언트는 Browser를 통해 보고 있기때문에 java를 해석하지 못한다.
그래서 우리가 응답을 해줄때에는 클라이언트가 볼수 있는 언어
즉 Browser가 해석할수 있는 언어로 바꿔서 보내주어야 한다.

위의 세가지를 기억해두고 순서대로 진행하면 된다.
매우 간단하기때문에 까먹을 일은 없을것이다.


자 그럼 우선 Driver처럼 서블릿을 가져와야 하는데
Servlet도 JDBC드라이버처럼 각 서버마다 제공하는 Servlet은 약간씩 다르다.
아무튼 우리는 톰켓을 기본으로 할것이기 때문에 우선 톰켓을 설치하도록 하자.
톰켓을 설치하는 방법은 필자의 블로그에 있을것이다.

( 수정해야 되지만 일단은 그렇게 하면 될것이다 ;;)

그리고 난뒤 톰켓 폴더를 잠시 보도록 하자.
bin - 실행파일이 위치한 폴더
conf - 환경설정할 폴더
lib - 라이브러리 폴더
logs - 어떤 에러가 났는지 서버가 열리고 닫히는 그런 로그가 생겨난다.
           서버에서 에러가 났을경우 확인하면 고칠수 있다.
톰켓에서 중요한 폴더는 위 4가지 폴더이다.

서블릿은 lib폴더에 가보면 servlet-api.jar파일이 보일것이다.
이것을 잠시만 참조 하도록 하자. (jar파일을 참조하는 방법은 JSP Chapter.1에 설명해놨다.) 

 주의할점이 있는데 지금 이클립스 JAVA SE버전에서 설명하는 것이다.
JAVA EE버전은 서블릿 챕터가 끝나면 사용할것이다.

그럼 이제 서블릿을 만들 준비가 다 되었다. 
Servlet을 구현할때에는 하나의 강제적인 사항(필수사항)이 있다.
바로 Servlet이란 인터페이스를 반드시 구현해야 되는것이다.
이 Servlet 인터페이스를 API에서 찾아보면 5개의 추상메소드가 있다.

(인터페이스를 구현하면 그 인터페이스에 속한 추상메소드를 반드시 정의해야 된다는거! 기본적으로 알것이라고 믿겠다.)
5개의 추상메소드의 기능을 간단히 살펴보면 아래와 같다.

init( ) -  생성자대신에 초기화를 해주는 메소드
service( ) - 데이터를 얻어내고 로직을 실행하고 응답페이지를 만드는 메소드
destory( ) - 작업이 끝난후 뒷 마무리를 하는 메소드
getServletInfo( ) - 서블릿 정보를 적어주는 메소드
getServletConfig( ) - 서블릿의 환경설정을 하는 메소드 

이렇게 5가지의 추상메소드를 구현해주어야 하는데 매번 5개의 메소드를 적어주기 힘들다.
그리고 서블릿의 정보나 환경설정은 거의 똑같을텐데 매번적어주는것도 소스의 낭비이다.

그래서 가져오는 클래스가 추상클래스인 GenericServlet 클래스이다.
GeneicServlet클래스는 Servlet인터페이스를 구현하여 속한 메소드를 정의한 클래스이다. 

자 그럼 서블릿을 사용하기 위해선 반드시 Servlet를 구현해야 하지만 그 Servlet을 구현한 클래스인 GenericServlet를 상속받으면 Servlet을 구현한거와 마찬가지이다.

그리고 난뒤 GenericServlet클래스를 살펴보면 하나의 메소드 service( )메소드가 추상메소드인것을 확인할수 있다.
당연한 이야기이지만 클라이언트의 요청마다 구현 해야되는 Losic이 다르기 때문에 
Losic을 구현하는 service( )를 추상메소드로 놔둔 것이다.

자 그럼 GenericServlet 클래스를 상속받아서 서블릿을 만들어보자.
public class HelloServlet extends GenericServlet{}
GenericServlet를 상속받았기때문에 init( )나 destory( )등의 메소드는 정의해줄 필요가 없이 service( )메소드만 정의해주면 된다.
(srvice는 IOException처리를 해주어야 되기때문에 java.io.*을 import해주어야 한다.)
import javax.servlet.*;
import java.io.*;

public class HelloServlet extends GenericServlet{

public void service(ServletRequest req, ServletResponse res)
throws IOException, ServletException{
   }
 service( )메소드를 불렀으니 service( )에서 하는 일을 다시한번 생각해보자.
1. date get
2. Logic 구현
3. 출력페이지 전송

현재 우리는 받을 데이터가 없기때문에 data get은 할필요가 없다.
그럼 HellowServlet를 출력하기 위해 String msg에 HellowServlet를 한번 넣어주자.
이것만으로 Logic구현이 끝이 났다. 


그리고 난뒤 출력페이지를 만들어야 하는데 출력페이지를 만들때 주의할점!!
상대방이 볼때에는 Browser로 보기때문에 Browser에서 볼수 있는 언어로 출력해주어야 한다.
import javax.servlet.*;
import java.io.*;

public class HelloServlet extends GenericServlet{

public void service(ServletRequest req, ServletResponse res)
throws IOException, ServletException{
   
   String msg = "Hellow Servlet";
   
PrintWriter out = res.getWriter();
out.println("<html>");
out.println("<body>");
out.println(msg);
out.println("</body>");
out.println("</html>");
   }
서블릿의 ServletResponse클래스를 보면 getWriter( );이란 메소드가 있는데 
이 메소드는 PrintWriter클래스가 클라이언트에 문자를 보낼수 있도록 지원한다.
PrintWriter클래스는 우리가 일반적으로 사용하는 PrintStream클래스의 println( )등의 메소드를 모두 가지고 있다.
(확실한 차이점은 아직 필자도 모르겠다 ㅠㅠ)

아무튼 위 명령으로 인해 이제 PrintWriter에 속한 출력 메소드를 사용하면 그 출력 문장이 클라이언트에 보여지는 것이다.

마지막으로 몇번이나 강조했지만 클라이언트는 Browser로 보고있기때문에
Browser가 해석가능한 간단한 html기본공식과 함께 msg란 함수를 보내주었다.
(실제로 그냥 하나의 문자만 보내는데는 굳이 html이란 표기를 안해주어도 된다.) 


자 그럼  Servlet이 제대로 만들어졌는지 확인을 해보도록 하자.
톰켓 폴더에 가면 webapps란 폴더가 보일것이다.
이 폴더 안에 들어가면 ROOT란 폴더가 보일것인데 이 ROOT폴더 안에 있는 index가
바로 톰켓 설치후 제대로 설치가 되었는지 확인할때 나오는 메인페이지이다.

자 우리는 ROOT안에 WEB-INF란 폴더로 들어가서 classes란 폴더를 하나 생성하도록 하자.
그리고 난뒤 위에서 만든 소스의 class파일을 classes란 폴더 안에 복사 해놓자.

마지막으로 설정을 해주어야 하는데 톰켓 폴더 안에 conf폴더를 보면 web.xml이란 파일이 보일것이다.
이 파일을 메모장등으로 열어서 invoker를 검색해보자.
그럼 주석으로 둘러 쌓인 아래와 같은 코드들이 검색 될것이다.
   <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
   <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
위 두개의 소스의 주석을 풀어주도록 하자.

원래 Servlet는 html을 통해서 많이 들어가기때문에 직접적으로 가는 주소를 막아두었다.
실제로 우리가 직접적으로 Servlet의 위치를 알아서 들어갈 일이 별로 없기 때문이다.

아무튼 두개의 주석을 풀어주고 난뒤에 톰켓을 실행하자.
그리고 난뒤 주소창에 http://localhost:8080/servlet/HelloServlet 을 치면
우리가 만든 서블릿이 보일것이다.

제대로 보이는지 확인해보도록 하자.
아 그리고 혹 이클립스와 톰켓을 연동시켜 놓았으면 위와 같은 주소로 들어가지 못한다.
그럴때에는 아무 다이나믹 웹 프로젝트에서 패키지 test를 만들고 난뒤 그 패키지에 위에서 만든 HelloServlet.java를 복사해놓고
주소창에 http://localhost:8080/프로젝트명/servlet/test.HelloServlet 를 쳐보자. test. 이다. test/가 아니다 ;ㅁ; 주의하자.


모두 HelloServlet가 화면이 뜨면 좋겟다 ;ㅁ; 

자 그럼 Servlet을 이용하여 간단하게 출력하는 방법을 알아보았다.
다음 챕터에선 Data를 받고 그 Data를 처리하는 logic까지 구현해보도록 하자.



출처 - http://mirwebma.tistory.com/88

댓글 없음:

댓글 쓰기