코딩딩/Spring

서블릿

전낙타 2023. 9. 6. 16:52

실행 방법에 따른 자바 클래스의 구분

  • Application : mian 메소드를 만들어서 실행

    java 클래스명

    ———-

    |______________java 인터프리터가 public static void main(String[] args) 스펙의 메소드를 찾아서 실행

  • Applet : html 태그로 삽입(지금은 안쓴다. 무겁다)
  • servlet

서블릿

  • 클라이언트의 요청을 처리하기 위한 자바기술
  • 서버에서 클라이언트의 요청을 처리하고 응답할 수 있도록 만들어진 객체
  • 클라이언트가 요청하면 서버에서 실행되면서 DB에 대한 처리, 서버의 리소스를 이용해서 만들어진 결과를 클라이언트에 응답
  • 클라이언트가 요청하면 서버가 요청한 서블릿을 찾아서 실행하므로 서버가 찾을 수 있는 위치에 있어야 한다.
    • 서버가 찾을 수 있는 위치 : 서블릿 디렉토리 (classes)

      표준화된 폴더 구조의 classes폴더

      → 서버가 서블릿을 찾는 위치

  • 서버 내부에 구성된 많은 기능들을 우리가 만들어 놓은 서블릿 클래스에서 실행되도록 하려면 서버가 서블릿이라고 인지할 수 있어야 한다. 서블릿이 되기 위한 규칙이 존재

    규칙에 맞게 서블릿을 작성해야 한다.

서블릿 작성 규칙

  • 서버가 찾아서 실행할 수 있도록 규칙에 맞게 서블릿을 작성해야 한다.
    1. 표준화된 폴더 구조 안에 서블릿 클래스가 위치해야 한다.

      서블릿이 저장될 폴더(서블릿디렉토리) - classes

      [표준화된 폴더 구조]

      context

      jsp, html,css,js,image….(폴더에 있어도 된다.)

      WEB-INF

      web.xml : 설정정보

      lib(폴더) : 자바 라이브러리 파일

      classes(폴더) : 서블릿, dao,dto,vo,service … 자바클래스

    1. 서버에서 호출될 것이므로 무조건 public 클래스로 만들어야 한다.
    1. 서버가 서블릿으로 인식하고 실행해야 하므로 무조건 상속해야 하는 클래스가 존재한다.

      ⇒ 서블릿 클래스가 되기 위해서 무조건 서블릿 클래스를 상속해야 한다.

      [상속관계]

      servlet ← GenericServlet ← HttpServlet ← MyServlet

      servlet : 인터페이스

      GenericServlet : 추상클래스 (서블릿의 일반적인 내용이 정의된 서블릿 클래스)

      HttpServlet : http(https)프로토콜에 특징적인 내용이 정의된 서블릿 클래스

      쿠키, 세선…. 등이 있다

      MyServlet : 사용자가 만든 서블릿

    1. 서버가 호출할 메소드를 오버라이딩
      • 사용자가 임의로 메소드를 만들면 서버가 알 수 없다.
      • 서버가 자동으로 찾아서 호출하기 위해서 상속받는 클래스의 메소드를 오버라이딩 해서 내가 실행하고 싶은 명령문을 구현한다.
      • 서버가 적절한 시점에 호출하는 메소드를 callback 메소드라 한다.
      • 클라이언트가 요청하면 서버가 요청을 분석해서 서블릿 디렉토리에 위치한 서블릿을 찾아서 적절한 시점에 오버라이딩된 메소드를 자동으로 호출
      • 따라서 상황에 맞게 실행하고 싶은 내용이 있는 경우 메소드를 오버라이딩 해서 내용을 정의해야 한다.
      • 자동으로 메소드가 호출된다는 의미는 자동으로 객체가 생성된다는 의미

        즉, 객체의 lifecycle을 서버가 관리한다는 의미

        lifecycle : 객체가 생성되고 객체를 메모리에서 해제하기 까지의 모든 작업을 서버가 알아서 관리

      • 오버라이딩 해야하는 메소드가 lifecycle과 관련있는 메소드

    [오버라이딩 해야하는 메소드]

    • init : 서블릿 객체가 초기화 될 때 호출
    • service : 클라이언트가 요청할 때 호출

      → 클라이언트의 요청을 처리하는 메소드로 요청을 받고 처리할 내용을 구현

      ex) 로그인, 로그아웃, 회원가입, 게시판보기, 장바구니, 예약하기, 예약조회-…

    • destory : 서블릿객체가 메모리에서 해제될때
    1. 서블릿 등록
      • 서버가 서블릿을 찾을 수 있도록 등록
      • 서버가 요청정보를 분석해서 서블릿 디렉토리에서 서블릿을 찾아서 실행할 수 있도록 어떤 요청에 대해서 어떤 서블릿이 실행 될지를 등록
      • 설정파일(web.xml)에 등록
      • 실제 작업은 annotation으로 설정
      • web.xml파일은 xml형식의 파일이므로 사용할 엘리먼트가 이미 정의되어 있고 작성규칙이 정해져 있으므로 맞게 작업해야 한다.

        작성규칙 : dtd - xml안에 정의하고 사용할 엘리먼트에 대한 정의 (엘리먼트의 순서, 타입, 값, 하위구조….)

      1. 서블릿을 등록
        • 실제 어떤 패키지의 어떤 클래스를 실행할 것인지 등록 : 무엇을
        <servlet>
          	<servlet-name>서블릿명(alias)</servlet-name>
          	<servlet-class>서블릿의 실제 클래스명와 위치(패키지명)</servlet-class>
        </servlet>

        ex) basic 패키지에 FirstServlet을 first이름으로 등록

        <servlet>
          	<servlet-name>first</servlet-name>
          	<servlet-class>basic.FirstServlet</servlet-class>
        </servlet>
      1. 서블릿 매핑
        • 등록된 서블릿을 어떻게 요청하면 실행할 것인지 등록(어떤 url로 요청할 것인지)
        • 반드시 <servlet>엘리먼트 다음에 정의해야 한다.
        • <servlet> 엘리먼트와 한쌍으로 정의해야 한다.
        • 먼저 등록한 서블릿을 어떻게 요청할 것인지 등록하기 위한 엘리먼트
        <servlet-mapping>
          	<servlet-name>위에서 정의한 서블릿의 이름</servlet-name>
          	<url-pattern>요청할 서블릿의 path</url-pattern>
        </servlet-mapping>
        
        // 요청할 서블릿의 path는 반드시 /나 .으로 시작

        ex) first라는 이름으로 등록된 서블릿을 /first.playdata로 요청하면 실행되도록 정의

        <servlet-mapping>
          	<servlet-name>first</servlet-name>
          	<url-pattern>/first.playdata</url-pattern>
        </servlet-mapping>
        
        // 요청할 서블릿의 path는 반드시 /나 .으로 시작
      1. 서블릿 요청방법
        • 서블릿을 어떻게 실행해야 하는지 알 수 있어야 한다
        • html 문서에서 요청

          http://서버ip:port/context명/폴더/서블릿매핑명

          서블릿 매핑명 : web.xml <url-pattern>에 등록하거나 annotation으로 등록한 path

          http://192.168.0.6:8088/serverweb/gugudan.html

          http : 프로토콜

          192.168.0.6 : ip

          :8088 : port

          serverweb : context명

          gugudan.html : 매핑명

        • 서블릿을 못찾는 경우 - 404응답코드
        • 서블릿은 요청방법에 따라서 get방식과 post방식으로 요청할 수 있다.
        • HttpServlet에서 제공되는 doGet이나 doPost 메소드를 오버라이딩

          doGet : get방식

          doPost : post방식

        1. get방식으로 요청

          ⇒ 클라이언트가 입력한 내용이 요청헤더에 저장되어 서버로 전송되는 방식

          주로 서버의 데이터를 가져오는 경우 사용

          • 주소표시줄에 직접 입력해서 요청하는 방식

            ⇒ 테스트용으로 사용되거나 첫 번째 페이지에서 요청되는 경우

          • 하이퍼링크로 클락

            <a href="/context명/서블릿 요청 path">구구단 요청하기</a>

          • <form>태그 method 속성에 get을 정의하고 submit 버튼을 눌러 요청하는 경우

            ⇒ <form> 태그의 submit버튼을 누르면 action속성에 정의한 application이 실행되면서 <form></form>사이에 정의된 모든 약식 태그의 name=value가 전송된다.

            ⇒ method속성을 생략하면 get방식

            <form method = “요청방식” action=”/context명/서블릿 요청 path”>

        1. post 방식으로 요청

          <form>태그 method 속성에 post를 정의하고 submit 버튼을 눌러 요천하는 경우

          <form action="/serverweb/requesttest.do" method="post"></form>

        1. 자바스크립트로 요청
          1. location.href에 연결하기

            ⇒ get방식으로 요청

      1. 서블릿의 lifecycle
        • 서블릿 객체는 최초 요청될 때 한 개가 생성
        • 쓰레드가 생성되면서 실행
        • init : 객체가 생성되고 초기화 될때 호출
        • service : 클라이언트가 요청하면 호출

          service를 오버라이딩 하지 않으면 get 방식으로 요청하면 doGet이 실행

          post방식으로 요청하면 doPost 실행

        • deGet : 클라이언트가 get방식으로 요청
        • doPost : 클라이언트가 post방식으로 요청
        • destroy : 서블릿 객체가 소멸

        ⇒ 요청 방식에 따라서 실행되는 메소드명, 매개변수 순서, 매개변수 타입이 다르면 405번 응답코드 발생

      1. 서블릿 요청정보 추출
        • <form></form> 사이의 정의된 양식태그를 통해서 서버에 전송하는 데이터를 추출

          사용자가 선택하거나 입력한 값(파라미터) : 정의된 양식태그

          파라미터는 name과 value가 같이 전송된다.