ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. Servlet 개념 정리 및 실습, 배포(deploy)
    Back-end Developer/Spring Framework, 설정 및 실습 2018. 12. 1. 19:46

    지난번에 간단하게 Framework 실습을 위해 환경을 잡았었죠.

    오늘은 Spring 사용을 위한 Servlet 관련 개념을 간단하게 정리하고 실습도 해보려구요.



    Servlet(Server + Applet) ?


    서블릿(Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. (Wiki 참고)


    • Tomcat은 Servlet container라고 합니다. Tomcat은 Servlet을 수행할 수 있는 Runtime Environment를 제공합니다. 따라서 Servlet은 Tomcat 위에서 실행되는 Java 프로그램입니다.
    • WAS(Web Application Server)에 의해 컴파일된 후 메모리에 적재되어 client의 HTTP 요청을 처리하는 자바 프로그램입니다.
    • Servlet은 client에서 요청이 발생하면, thread를 생성해서 병렬적으로 수행합니다. 
    요청-응답 프로그래밍 모델에 의해 접근 가능한 서버의 기능을 확장하는데 사용되는 Java class


    이렇게 정리 할 수 있을거 같아요. 이 내용으로만 개념을 끝내지 마시고 좀 더 자세한 내용을 찾아보시길 권장합니다.



    실습


    프로젝트 생성


    우선 서블릿 프로젝트를 하나 생성해 볼게요.

    프로젝트 명은 임의로 정해주세요. 파일 경로 확인 한번 하시고 Next를 눌러주세요.



    src 폴더 선택 후 Next



    설정 확인하시고 web.xml 파일 생성에 체크해주세요.



    web.xml 파일은 application 설정을 위해 기록하는 문서입니다.

    현재는 크게 쓸일이 없지만, 향후 스프링 실습때 필요하기 때문에 꼭 체크를 하고 완료를 눌러주세요.


    좌측에 Project Explorer에 HelloServlet 구조 확인좀 해볼게요.

    Java Resource - > src 여기서 서블릿 프로그램 생성 할 예정이구요.

    Library에는 탐캣을 제공하는 라이브러리와 JRE 제공하는 라이브러리가 보이는데 두개를 활용하게 될거에요.

    그리고, 아까 우리가 생성한 web.xml 파일은 WebContent -> WEB-INF에 있어요.


    그럼 이제 생성된 web.xml 파일에 source 부분을 한번 볼게요.




    중앙에 'welcome file list'가 보이시죠? 원래 어떤 사이트에 접근하는것은 그 사이트를 구현해 놓은 어떤 파일로 접근하게되잖아요.

    근데 실제로 우리가 어떤 사이트 접속시에 url을 보면 파일 이름을 따로 명시해주지 않죠

    즉, 보통 도메인으로 접속하게되는데 이런 경우에 도메인 주소를 치면 리스트의 파일들에 선택이되고 사용자에게 보여지게 됩니다.


    ※ web.xml에서 에러가 발생시

    저의 경우엔 ‘The processing instruction target matching "[xX][mM][lL]" is not allowed.’ 이러한 에러 메세지가 떴는데요.

    이 에러의 경우 2가지만 체크해 보시면 대부분 처리 됩니다.

      1. <?xml version=“1.0”… 으로 시작하는지 확인

      2. 코드 맨 앞에 불필요한 공백이 있는지 확인


    Html 파일 생성


    여기서는 index.html 파일을 만들어내어 사용자들이 접근시 내용들을 있도록 유도 해볼게요.

    WebContent 문서 오른쪽 마우스 클릭 -> new -> HTML file 선택 -> index.html 생성




    'index.html' 코드는 아래와 같이 입력했습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Sevlet Example</title>
    </head>
     
    <body>
        <form action="DoLogin" method="POST">
            UserName: <input type="text" name="username"> <br>
            Password: <input type="password" name="password"> <br
            <input type="submit" value="press" />
        </form>
        
    </body>
    </html>
    cs

    <form action> 태그
    간단하게 이것만 설명하고 넘어갈게요.
    form 태그는 어떤 동작을 위한 태그인데요, 여기서는 버튼'press'를 눌러 submit을 수행하기 위해 사용했습니다.
    즉 이동할 url 서블릿에 해당해요. 또한 로그인 관련 기능을 만들기 위해 HTTP 메소드 중 POST를 사용합니다.

    http 메소드에 대해 특히 CRUD 관련해 정리 좀 해볼게요. 물론 아래 네개 외에도 몇 개 더 있으니까 찾아보시구요.


    HTTP Method (Create, Read, Update, Delete)
      • Post(C): 컨텐츠 생성을 위한 요청 방식입니다(요청 URL의 폼 입력 처리). 데이터에 요청 정보가 포함됩니다.
      • Get(R): URI(URL)가 가지고있는 정보를 검색하기 위해 서버에 요청하는 방식입니다.
      • Put(U): 컨텐츠 수정을 위한 요청 방식입니다(요청 URL의 폼 입력 수정). 보안상 문제가 발생 할 수 있습니다.
      • Delete(D): 파일 삭제을 위한 방식입니다.



    해당 코드를 실행해봤습니다.



    위의 주소에 'http://localhost:8080/helloServlet/index.html''http://localhost:8080/helloServlet/' 를 치면 동일한 결과를 보실 수 있습니다.

    또한 Tomcat 실행중이기 때문에, 웹에서도 위의 주소를 치면 잘 뜹니다 ^___^/

    Why?



    그리고 로그인 시도를 한번 해보면....

    당연하게도 아직 로그인 이후 파일을 생성해두지 않았기 때문에 'HTTP STATUS: 404 Not Found' 가 발생합니다.

    로그인 이후 파일이란 여기 실습에선 'DoLogin'에 해당하는 서블릿이겠죠!



    Servlet 파일 생성


    그러면 다음 파일인 DoLogin Servlet을 생성해 봅시다.

    Java Resources -> src -> new -> packeage 이름은 servlets로 생성해주세요.




    그리고 해당 패키지에서 DoLogin 서블릿을 생성해 볼게요.

    new -> servlet -> 이름은 DoLogin 으로 지정하고 Next를 눌러주세요.



    여기서 다시 Next




    아래 메소드에서 doPost 메소드만 선택하고 완료 눌러주시면 됩니다!




    생성된 서블릿의 코드는 아래와 같습니다.


    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
    package servlets;
     
    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 DoLogin
     */
    @WebServlet("/DoLogin")
    public class DoLogin extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public DoLogin() {
            super();
            // TODO Auto-generated constructor stub
        }
     
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
        }
     
    }
     
    cs


    코드를 간략히 보면,


    @webservlet: annotation을 통해 DoLogin url mapping 되어있습니다. 우리가 구현할 부분은 아래 'doPost'메소드겠죠?

    사용자가 submit 버튼을 누르면 서블릿의 'doPost'라는 메서드가 스레드를 통해 생성되어 작동하게 되는것이죠.


    HttpServletRequest HttpServletResponse

    클라이언트로부터 request 들어올때 마다 thread가 생성된다고 말씀드렸었죠. 그로인해 객체가 넘어올 있도록 도와줍니다.


    두 인터페이스의 역할


    'SerialVersion UID' 같은 멤버변수는 스레드에서 공유되는 자원이므로 Concurrency control 필요합니다.

    그러므로 멤버변수를 다루거나 생성할 땐 주의해주세요!!

    특히, 이 UID는 객체 직렬화에 사용되는데요, 서로 직렬화에 알맞는 클래스를 찾는데 도와주는 신분증 같은 것이죠.

    항상 final static long으로 선언되어야 합니다.



    아래는 doPost 메소드 구현 부분 코드입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // read form data
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            
            PrintWriter out = response.getWriter();
            
            // build HTML code
            String htmlResponse = "<html>";
            
            htmlResponse += "<h2> Your name is: " + username + "<br>";
            htmlResponse += "Your password is: " + password + "</h2>";
            htmlResponse += "</html>";
            
            out.println(htmlResponse);
    }
    cs


    여기서 request: 입력, response: 출력을 의미하게됩니다.

    위에 메소드에서 파라미터로 들어오는 두 객체의 설명을 보시면 어느정도 예상은 하셨을거같네요. ㅎㅅㅎ;


    그래서, 사용자가 index.html이 실행되었을 때 Username, password을 입력하면 

    request.getParameter("")를 통해 그 데이터를 읽어 들여 저장합니다.

    단, index.html에서 태그 내에 입력했던 것과 같은 글자를 괄호 내부에 입력해 주셔야해요.



    결과 실행


    다 된거 같으니 실행 한번 해볼게요!

    실행하여 이름과 비밀번호를 치고, press를 누르면 Tomcat server로 request가 전달됩니다.




    그러면 서블릿의 doPost 부분이 실행이 되고, 유저에게 response를 보내 결과를 보여주게 되는것이에요.



    실제 제가 입력했던 정보가 잘 전달이 되었습니다. 후후

    고생 많으셨습니다.



    배포


    마지막으로 배포(deploy)하는 방법을 알아 볼게요. 아시는 분들은 그냥 넘어가시면 될거같아요!

    상단 File -> Export -> web의 WAR file  선택 후 Next




    여기선 경로 설정을 해주세요.

    apache-tomcat-8.0.53/webapps/에 export 시킵니다.




    배포


    1. 터미널로 apache-tomcat-8.0.53/bin/으로 접속해서 Tomcat을 실행해주세요.

    2. 아시겠지만 까먹으신분들을 위해 ./startup.sh 로 실행하시면됩니다.

    3. webapps 문서에 helloServlet 파일이 생성된 것을 확인!

    4. 이제 웹에서 로그인 후 뒤에 /DoLogin 파일이 붙으면 성공입니다. \^_____^/

    생성된 helloServlet 파일




    지금은 개인 운영체제에서 개발중이지만, 실제론 대부분 linux로 서버를 생성하기 때문에 배포를 linux 서버에 실시하시면 됩니다.

    반응형

    댓글

Designed by minchoba.