Spring

Servlet과 JSP

지지 2022. 3. 1. 20:56

Servlet과 JSP

더 공부 후 조금 더 자세하게 추가할 예정

간단 정리

  • 역할의 차이일 뿐 기능적인 차이는 없다.(하는 일은 동일)
  • servlet : java코드 안에 html코드
  • JSP : html코드 안에 java코드

1) Servlet

  • servlet을 발전시킨 것이 spring
구분 servlet spring
Annotation @WebServlet @Controller + @RequestMapping
Mapping 클래스 단위 메서드 단위, 때문에 하나의 클래스에 여러개의 매핑 가능
상속 HttpServlet상속 상속 안받음 (자바는 단일상속이기 때문에 상속을 안받는 것이 좋다. 이런점이 spring에서 개선이 된 것)
메서드명 Override된 init(), service(), destroy()등 마음대로
매개변수 HttpServletRequest, HttpServletResponse를 무조건 매개변수로 받아야함 필요한 것만 매개변수로 받음
  • 서블릿은 기본적으로 init(), service(), distory() 이 세개의 메서드를 사용한다.

    • init() : 서블릿 초기화. 서블릿이 생성, 또는 리로딩될 때 단 한 번만 수행됨
    • service() : 호출될 때 마다 반복적으로 수행됨
    • destory() : 뒷정리 작업. 서블릿이 제거(unload) 될 때 단 한 번만 수행됨
  • 즉, 클라이언트가 요청을 보내면 ServletContext가 서블릿 인스턴스의 존재를 확인한다.
    일치하는 인스턴스가 있다면 service() 메서드를 호출하고, 없다면 서블릿 클래스를 로딩하고 새로운 서블릿 인스턴스를 생성한다. 이 때 init() 메서드가 호출이 된다. 그 후 요청부터는 인스턴스가 만들어진 상태이기 때문에 service() 메서드만 호출이 되고, 프로그램이 갱신되거나 애플리케이션이 종료가 되서 서블릿이 메모리에서 내려갈 때 destroy() 메서드가 호출이 된다.

**참고 : 서블릿은 기본적으로 singleton패턴이기 때문에 한 개의 인스턴스만 생성이 된다.

2) JSP

  • jsp파일은 언제, 어떻게 servlet으로 변환이 될까?
    • *.jsp 요청이 들어오면, jspServlet이 서블릿 인스턴스가 있는지 확인한다.
    • 없으면 이 파일을 서블릿으로 변환하는데, 이 때 *_jsp.java로 변환이 된다.
    • 이렇게 변환된 java파일을 컴파일 하면 *_jsp.class파일이 만들어지고, 인스턴스가 생성된다.
    • 이제 서블릿과 마찬가지로 초기화 메서드 _jspInit()과 실행 메서드 _jspsService()가 호출되며 응답을 준다.
    • 처음에 변환과 컴파일을 해야하기 때문에 시간이 걸린다.(지연된 초기화)

3) Servlet과 JSP의 차이

  • Servlet
    • java코드 안에 HTML 코드 (하나의 클래스)
    • data processing(Controller)에 좋다.
    • 즉 DB와의 통신, Business Logic 호출, 데이터를 읽고 확인하는 작업 등에 유용하다.
    • Servlet이 수정된 경우 Java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일한 후 재배포하는 작업이 필요하다. (개발 생산성 저하)
  • JSP
    • HTML 코드 안에 Java 코드
    • presentation(View)에 좋다.
    • 즉, 요청 결과를 나타내는 HTML 작성하는데 유용하다.
    • JSP가 수정된 경우 재배포할 필요가 없이 WAS가 알아서 처리한다. (쉬운 배포)

4) 유효범위와 속성

  • Http는 상태정보를 저장하지 않는 stateless라는 특징이 있다.
  • 그렇기 때문에 저장소가 필요한데, 이 저장소가 범위에 따라 4개가 있다.
    • 접근범위와 생존기간이 다른 4개의 저장소가 있다. 사용 목적에 따라 알맞은 저장소를 사용하면 된다.
    • 저장소는 Map형태로 제공된다.
    • pageContext 저장소 : 해당 jsp페이지 내부에서만 접근가능. 다른 jsp페이지에서는 접근할 수 없다.
      • 지역변수와 기본객체(request, response 등)를 저장
      • EL태그를 쓰려면 꼭 이 저장소에 저장을 해야한다.
    • application 저장소 : Servlet Context전체에서 접근가능.
      • 이 저장소는 딱 1개 있다.(공통저장소)
    • session 저장소 : 클라이언트마다 가지고 있는 개별 저장소. 모든 페이지에서 접근가능.
      • 클라이언트가 10000명이면 세션 객체도 10000개가 필요하기때문에 편리하지만 메모리 부담이 크다.
      • 그래서 session엔 최소한의 정보만 저장한다.
    • request : 요청이 처리되는 동안만 존재.
      • 데이터를 다른 페이지로 넘길 때 사용 (forword)

5) URL패턴

  • @WebServlet으로 서블릿을 URL에 매핑할 때 사용
  • 우선순위
    • 1 - 정확히 일치하는 것(exact mapping)
    • 2 - 경로를 와일드카드로 처리(path mapping)
    • 3 - 확장자를 적고, 파일명을 와일드카드로 처리(extension mapping)
    • 4 - 모든 주소와 매핑이 된다(default mapping)

6) Filter

  • 공통적인 요청(전처리, 후처리)에 사용한다. ex) 로깅, 인코딩 등