Servlet(2)

주빈·2022년 4월 29일
0

server

목록 보기
3/5

어제에 이어서 servlet을 더 살펴보자.

📜 Servlet 동작 방식

  1. 사용자(클라이언트)가 URL(Uniform Resource Locator)을 클릭하면 HTTP Request(요청)를 Servlet Container로 전송한다.

  2. Http Request를 전송 받은 Servlet Container는 아래의 두 객체를 생성한다.
    -> HttpServletRequest(요청 관련 내용이 저장된 객체)
    -> HttpServletReponse(응답 관련 내용이 저장된 객체)

  3. DD(배포서술자, Deployment Descriptor) = web.xml은 사용자가 요청한 URL을 분석하여 어떤 서블릿 클래스에 요청 내용을 전달할지 찾는다.

  4. 해당 Servlet에서 init() 메서드를 먼저 호출한 뒤 service() 메서드를 호출하여 클라이언트로부터 전송 받은 방식인 GET, POST 여부에 따라서 해당 메서드(doGet() / doPost())를 호출한다.

  5. doGet() / doPost() 메서드는 동적 페이지를 생성 후 HttpServletResponse 객체에 응답을 보낸다.

  6. 응답 종료 시 HttpServletRequest, HttpServletReponse 객체가 소멸된다.


📜 Servlet Container

  • 배포를 위한 포트 연결, 웹 서버 통신을 위한 소켓, 입/출력 스트림을 생성하는 역할을 한다.
    -> WAS(Web Application Server)가 Servlet Container에 해당하면 대표적으로 Tomcat이 있다.
  • Servlet : 어떤 역할을 수행하는 정의서
  • Servlet Container : 정의된 servlet을 보고 수행
  • 클라이언트의 요청을 받을 때 마다 새로운 자바 스레드(Thread)를 만들어 요청을 처리하고 응답을 해준다.

✏ Servlet Container 역할

  1. 웹 서버와의 통신을 지원한다.
    -> 서블릿과 웹 서버가 손쉽게 통신할 수 있게 해준다.
    -> 일반적으로 소켓을 만들고 listen, accept등을 해야 하지만 서블릿 컨테이너는 이러한 기능을 API로 제공해 복잡한 과정을 생략해준다.

  2. 서블릿 생명주기(Life Cycle) 관리
    -> 서블릿 클래스를 로딩하여 인스턴스화 하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 호출한다.
    -> 서블릿이 생명을 다 한 순간에는 적절하게 가비지 컬렉션을 진행하여 편의를 제공한다.

  3. 멀티쓰레드 지원 및 관리
    -> 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 생성하는데 http 서비스 메서드를 실행하고 나면 스레드는 자동으로 사라진다.
    -> 원래는 스레드를 관리해야 하지만 서버가 다중 스레드를 생성/운영을 해주기 때문에 스레드의 안정성에 대해서는 걱정을 하지 않아도 된다.

  4. 선언적인 보안 관리
    -> 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도 된다.
    -> 일반적으로 보안관리는 xml배포 서술자(DD (web.xml))에다가 기록하기 때문에 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일하지 않아도 보안관리가 가능하다.


📜 Servlet의 메서드 별 오버라이딩

  • 웹 클라이언트의 요청 방식이 GET방식으로 요청해오면 doGet() 메서드로 응답
  • 웹 클라이언트의 요청 방식이 POST방식이면 doPost() 메서드로 응답
  • 따라서 반드시 doGet() 메서드와 doPost() 메서드는 Overriding을 해주어야한다.
  • 첫번째 파라미터는 HttpServletRequest 타입, 두번째 파라미터는 HttpServletResponse 타입이다.

✏ Request, Reponse

  • 클라이언트 플랫폼 정보 및 브라우저 정보 : String request.getHeader("User-Agent")

  • Request 관련 쿠키 : Cookies[] cookies = request.getCookies();

  • 클라이언트 세션 정보 : HttpSession session = request.getSession();

  • HTTP 메소드 : String method = request.getMethod();

  • 출력스트림(PrintWriter, ServletOutputStream)을 이용하여 HTML 등을 작성하고 클라이언트에게 돌려보낼 setContentType()을 정한다.

  • 그 밖에 헤더정보 설정, 오류를 발생시키거나 쿠키를 추가


📜 Get 방식과 Post 방식의 차이점

  • 클라이언트가 서버로 요청을 보내는 방법

✏ GET방식 : (데이터를) 가져오다, 얻어오다

  • URL에 변수(데이터)를 포함시켜 요청
    보안 유지를 안 하기 때문에 로그인 같은 경우는 get방식으로 하면 부적합하다.
  • 데이터를 HTTP Header에 포함하여 전송하고 GET방식에서 바디는 보통 빈 상태로 전송되며 헤더의 내용 중 Body의 데이터를 설명하는 Content-type헤더필드도 들어가지 않는다.
  • 전송하는 길이 제한(보내는 길이가 너무 길면 초과데이터는 절단됨)
  • 캐싱 가능 (ex. 즐겨찾기, 북마크)
    (한번 접근 후, 또 요청할 시 빠르게 접근하기 위해 데이터를 저장시켜 놓는 것이다.)

✏ POST방식 : (데이터를) 붙이다

  • 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식
  • URL에 변수(데이터)를 노출하지 않고 요청 데이터를 HTTP Body에 포함하여 전송
  • 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더필드가 들어가고 어떤 데이터 타입인지 명시해주어야 한다.
  • 전송하는 길이 제한이 없음.
  • Body에 데이터가 들어가기 때문에 길이에 제한이 없지만 최대 요청을 받는 시간(Time Out)이 존재해서 페이지 요청, 기다리는 시간 존재한다.
  • 캐싱할 수 없다.
  • URL에 데이터가 노출 되지 않으므로 즐겨찾기나 캐싱 불가능하지만 쿼리스트링(문자열)데이터, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송 가능하다.
profile
누구에게나 필요한 개발자가 꿈

0개의 댓글