-
서블릿필터 ServletFilterServlet-JSP 2022. 1. 12. 23:53
**유튜브 뉴렉쳐님의 강의를 들으면서 공부하고 정리한 내용입니다.
우리는 WAS를 사용해서 웹 서버 개발을 하게 된다. 우리는 TOMCAT이라는 WAS를 사용해서 개발을 하게되는데, TOMCAT이 사용자로부터 요청이 들어오게 되면 적절한 소프트웨어를 사용해서 결과를 돌려주게 되어 있다.
우리는 그것을 SERVLET이라고 부른다.
서블릿을 사용 할 떄 발생하는 메모리 공간을 서블릿 컨테이너라고 하며 WAS는 서블릿 컨테이너에 서블릿을 담아두고 요청이 들어 올 때마다 컨테이너에서 꺼내서 결과를 돌려주게 되며 더이상 사용하지 않는 서블릿을 경우 서블릿 컨테이너에서 삭제 하기도 한다.
우리는 서블릿말고도 만들 수 있는 오브젝트가 있는데 그것을 서블릿필터라고 한다.
Servlet Filter
우리는 지난 시간에

웹페이지를 실행 할 때 한글이 깨지지 않게 설정을 바꿔주었었다. 앞으로 서블릿을 만들일이 많아질텐데 앞으로 만들어질 서블릿에서는 이 코드가 전부 필요하게 된다.
그럼 우리는 간단하게 서블릿이 가지고 있는 server.xml이라는 파일에 저 코드를 넣어줘서 모든 페이지에 적용이 될 수 있도록 간단하게 만들어 줄 수도 있다.
하지만 이렇게 생각 해 보자. 우리집에는 지금 다섯식구가 살고 있다. 모두 자는 시간이 다르고 기상 시간도 다른데 한 사람의 기상/수면 시간에 맞춰서 모든 가족이 활동을 할 수는 없는 것이다. 각자 자기의 생활 패턴에 맞게 생황을 해야한다.
그래서 우리가 생각 할 수 있는 것은 중간에 servlet filter라는 것을 넣어주는 것이다.
이 servlet filter는 중간에 가로채기를 할 수 있다는 것이다.
그래서 WAS가 SERVLET에 가는 동안에 servlet filter이 중간에 가로채서 servlet filter가 먼저 실행 된 후에 SERVLET이 실행 되게 할 수 있다.
그리고 servlet filter가 실행 된 후 SERVLET이 실행 되고 말고의 실행 여부도 servlet filter가 결정 지어 줄 수 있다.
servlet filter은 수문장이라고 생각하면 된다.
접근권한이 있는지 없는지를 확인해서 SERVLET이 실행 되어야하는지 마는지도 책임지게 할 수 있고 모든 서블릿이 가지고 있어야 할 설정도 해줘서 거쳐가면서 실행 될 파일을 결정해주는 것이다.
그리고 servlet filter에 설정한 소프트웨어가 SERVLET에 가기 전에 실행 되기도 하지만 SERVLET이 실행 된 후에 결과도 servlet filter에 넣어 줄 수 있다.
그래서 사전과 사후에 필요한 소프트웨어가 있다면 이 servlet filter에 설정을 해 주면 된다.
servlet filter를 만드는 방법
@WebServlet("/notice-reg") public class NoticeReg extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=utf-8"); request.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); String title = request.getParameter("title"); String content = request.getParameter("content"); //DB를 연결 했다면 이 값을 DB에 저장 하거나 해야하는데 아직 DB 연결을 안했으니깐 //일단 그냥 반환만 해주자 //내용을 잘 받았다 이것이 맞니? 하고 돌려 주는 것. out.println(title); out.println(content); } }우리는 지난시간에 서블릿에 한글로 변환하는 코드를 설정 해 주었었다.
오늘은 이걸 서블릿 필터에 만들어주기로 한다. 우선 코드를 주석 처리 해 주고
기존 패키지에 만들지 말고 새로운 패키지를 만들어서 추가 해주도록 하자

패키지명과 클래스이름을 설정 해주고 우측의 add 클릭 filter 검색->servletFilter 클릭

ok 눌러서 add 한 다음 finish

그럼 자동으로 implements 와 Override 된 것이 추가가 된다.

이제 매개변수를 사용해서 filter를 구현 해 볼 것인데 필요없는 주석은 지워준다.
이 filter를 설정하는데에는 두가지 방법이 있다.
1. web.xml 파일을 이용하는 방법
기존에 serlvet을 설정 해줬던 방법과 비슷하다.
<filter></fllter>
<filter-mapping></filter-mapping>을 작성 해 준 다음

현재 내가 어떠한 클래스를 쓸 것인지(filter-class) 매핑 설정 될 때 사용 할 이름(filter-name)을 지정 해 준다.
그리고 매핑에 와서 어떠한 필터에 대해서(filter-name) 어떤한 매핑을(url-pattern) 할 것인가를 지정 해 줘야 한다.
만약 특정 url에 대해서 매핑을 하겠다 하면 url 주소를 지정 해 주면 되고 모든 url에 대해 지정 하고 싶다고 하면 /*로 지정 해 주면 된다. 우리는 우선 모든 url에 대해 매핑을 해 주는 것으로 해보자
(패키지명,클래스명은 클릭 후 F2를 눌러주면 쉽게 할 수 있다.)
<filter> <filter-name>characterEncodingFilter</filter-name> <!--사용 할 이름을 지정 해 준다 --> <filter-class>com.newlecture.web.filter.CharacterEncodingFilter</filter-class> <!-- 패키지명.클래스명까지 입력 해 준다. --> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>이렇게 해 주면 설정은 완료.
이제부터 우리가 무언가를 요청하면 이 URL 요청에 의해 실행 되게 되는 것이다.
실행을 해 보면 콘솔창에는 설정 해 둔 출력 메세지가 뜨지만 요청 페이지에는 아무 내용도 뜨지 않는다

그 이유는 출력 메세지가 실행이 되고 그 요청을 서블릿 쪽으로 보내는 것은 filter가 책임지기 때문이다.
근데 그것은 filter chain이라는 것이 담당한다.

그럼 chain.doFilter(request, response)를 중간에 작성 해 주면 chain을 전 후로 요청을 받았을 때 실행되는 코드와 결과를 반환 할 때 실행 되는 코드로 나뉘게 된다.
그래서 앞에는 before 뒤에는 after라고 생각하면 된다.
chain은 다음 실행을 관할하기 위한 녀석이고 여기서 조건 검색을 통해서 다음 실행을 어디로 가게 할 것인지 결정 할 수 있다.
우리는 모든 작업이 실행 되기 전에 UTF-8을 실행 시켜야 하기 때문에 BEFORE 위치에 UTF-8코드를 작성 해 준다.
1. @Annotation을 사용하는 방법
1번에서 web.xml에서 설정한 filter 부분을 우선 주석 처리 한 다음 filter 클래스로 넘어와서 @WebFilter("")설정을 해 주면 된다.

이렇게 @으로 지정 해 주면 xml 파일에 귀찮게 여러 코드를 치지 않아도 한번에 필터 설정이 가능 해 진다.
우리는 앞으로 @으로 filter를 설정 해 주자.
'Servlet-JSP' 카테고리의 다른 글
배열로 입력받기 (0) 2022.01.13 서블릿 사용자로부터 값을 받아 계산해보기 (0) 2022.01.13 입력할 내용이 많은 경우는 POST 요청 (0) 2022.01.08 사용자 입력을 통한 GET 요청하기 (0) 2022.01.08 GET 요청과 쿼리 스트링 (0) 2022.01.08