[Web] 서블릿 확장 API 사용하기

kiwonkim·2021년 5월 27일
0

포워드와 바인딩

포워드

서블릿이 타 서블릿과 연동되는 것.
ex) 상품 조회 요청시. 서블릿이 DB에서 상품 조회한 후 JSP에게 전달하여 상품 정보 표시.

request를 타 서블릿/JSP와 공유하거나. 추가 정보 제공. 추가 작업 수행 요청 등을 수행 할 수 있다.

  1. redirect
    • 브라우저에 재요청
    • Response.SendRedirect() 사용
  2. Refresh
    • 브라우저에 재요청
    • Response.addHeader() 사용.
  3. loaction
    • 자바 스크립트 이용 브라우저에 재요청
    • location.href 태그에 연동시킬 서블릿 저장.
  4. dispatch
    • 직접 타 서블릿에 재요청
    • RequestDispatcher 객체 사용
    • 클라이언트는 포워딩 된지 모름. url 주소도 그대로.
    • 바인딩이 dispatch만 가능하므로 주로 dispatch 사용.

Dispatch 예시

first 서블릿. RequestDispatcher 객체를 생성하고. forward할 주소를 입력한다.
second?name=lee 인 것을 보아 second 서블릿으로 forward 하되. get 방식으로 name = lee를 전달할 것임을 알 수 있다.

second 서블릿. dispatch 받은 정보를 브라우저 화면단에 출력한다.

수행결과. 클라이언트는 first 서블릿을 요청했음에도. second 서블릿으로 dispatch 되어 second 서블릿이 수행되었다.
dispatch는 서블릿이 직접 수행하므로 url이 변하지 않아.
클라이언트는 포워딩 된지 자체도 모른다.


바인딩

포워딩에서 GET 방식을 통해 url에 붙임으로서 서블릿간 추가정보 전달 가능.
하지만 GET 방식은 데이터 양이 많아지면 한계.
포워딩에서 타 서블릿에 넘겨주는 추가 데이터를 서블릿 관련 객체인 HttpServletRequest, HttpSession, ServletContext 객체에 바인딩(결합) 시켜서 주자.

setAttribute(String name, Object obj) : 데이터인 name을 obj에 바인딩.
getAttribute(String name) : 객체에 바인딩 된 데이터를 name으로 가져옴
removeAttribute(String name) : 객체에 바인딩 된 데이터를 name으로 제거함.

단. 브라우저를 거치는 경우 두 Request는 다른 Request로 인식됨. (HTTP는 Stateless 하다)
바인딩한 Request가 날라간다.
반드시 포워드 방식 중 dispatch를 이용해 직접 서블릿이 넘겨주도록 바인딩 해줘야함.

first 서블릿. 클라이언트 서블릿의 request에 address를 바인딩하여 second 에게 포워딩.

second 서블릿. first에게 포워딩 받은 request에서 getAttribute로 address를 추출.
반환형이 Object이므로 형변환 수행.

보통 DB 로직 수행 서블릿과 클라이언트 화면단 출력 서블릿을 분리한다.
DB 수행 후 결과를 request에 바인딩하여 출력 서블릿에게 전달하는 방식.
출력 서블릿은 후에 분화되어 JSP로 발전된다.


ServletContext

ServletContext 이용 바인딩

모든 서블릿 공유하는 데이터는 일일이 바인딩 및 포워딩 해주어야함.
이를 방지하기 위한 ServletContext.
웹 어플리케이션 마다 생성되는 SerlvletContext 객체.
어느 서블릿이나 해당 attribute를 get set 가능.

하나의 서블릿이 ServletContext 가져와서 Attribute 설정.

ServletContext는 컨테이너 안에서 공유되므로 타 서블릿은 이를 가져와서 그냥 사용하면 됨.

ServletContext 이용 서블릿간 공유되는 초기변수 설정 (web.xml에다)

web.xml에서 context-param 태그를 활용하여 컨테이너 내에서 사용할 변수를 선언하고 초기화 할 수 있다.

서블릿은 context.getInitParameter(변수명) 을 활용해 컨테이너 자체에 초기 선언되어 있는 변수들을 가져다 쓸 수 있다.


애너테이션 활용

서블릿에서 사용할 초기 변수 설정

위의 ServletContext 초기 변수는 서블릿간 공유되는 초기변수이고.
애너테이션을 이용한 초기변수는 해당 서블릿에서만 사용 가능한 초기변수이다.

context 객체 없이 getInitParameter를 통해 애너테이션의 변수를 가져다 쓸 수 있다.

load-on-startup

서블릿은 서버 가동 후. 브라우저가 요청했을 때 메모리에 로드되어 기능을 수행.
따라서 최초 요청시 실행시간이 길어진다.
컨테이너 실행과 동시에 서블릿 미리 실행 해 놓는 것이 load-on-startup

애너테이션 이용하여 우선순위를 설정.
컨테이너 실행 후 어떤 서블릿을 먼저 실행할 것인가.

위의 경우
1. 컨테이너 실행 후 가장 먼저 생성되는 서블릿.
2. init을 통해 호출되지 않아도 초기화. web.xml의 context InitParameter들을 가져와서 현재 컨테이너의 context 객체에 바인딩
-> 왜? web.xml에서 읽어오는 것보다 context 객체에서 읽어오는게 빠르므로 타 서블릿을 위해, 가장 먼저 생성되는 위 서블릿이 바인딩 시켜놓음.

0개의 댓글

관련 채용 정보