JSP - 서블릿 사용법

KimJH_94·2022년 10월 22일
0

JSP

목록 보기
2/7
post-thumbnail

💻 서블릿 사용하기


직전 글에서 톰캣을 이클립스에까지 연동 시켰다. 이제 이클립스에서 자바를 사용하여 웹에 업로드 할 수 있게 됐다. 이를 서블릿을 이용할건데, 서블릿은 자바를 사용하여 웹을 만들기 위해 필요한 기술로 클라이언트의 요청을 처리하고 그 결과를 반환하는 클래스이다.

클라이언트는 웹서버에 요청을 하여 정적 웹페이지, 즉 Web Server로 부터 자료를 Response받는다. 하지만 데이터 베이스가 관여해야 하는 등 웹 서버가 동적 웹페이지에 대한 요청을 받는 경우 서버는 추가적인 처리 과정 이후 클라이언트에게 응답을 보내게 된다. 이 때 서블릿이 필요하다.


⭐️ survlet-api.jar파일 라이브러리에 가져오기


서블릿을 사용하기에 앞서 서블릿 api를 제작할 동적 웹 프로젝트의 라이브러리 안에 넣어주어야 한다. 우선 저번에 다운받은 아파치 톰캣 폴더안의 lib폴더로 가준다. 그 안에서 s를 눌러주면 servlet-api.jar를 확인할 수 있다.

해당 파일을 복사하여 이클립스에서 작업하고 있는 동적 웹 프로젝트 라이브러리 폴더 안에 붙여넣어준다.

경로는 해당 폴더명 > src > main > webapp > WEB-INF > lib 이다.


⭐️ 자바 서블릿 파일을 담을 패키지 제작


패키지의 경우 .으로 이어나가며, .이후마다 폴더로 구분되며, 회사명과 프로젝트 이름, 서블릿등 단어를 조합해서 짠다. 패키지의 경우엔 src > main > java 아래에 만들어주었다. 실제 파일들은 위 경로 아래에 위치해있고, 상단 자바 리소스 아래에 패키지에 작업할 수 있는 클래스들이 따로 보인다.

아래에 보이는 패키지는 서블릿 필터를 담을 패키지이다. 맨 처음 보았던 WAS 이미지에서, 웹 서버와 웹 컨테이너 사이에 서블릿 필터가 위치해 있다.

서블릿 필터는 체인형식으로 적용되어 필터 다음 필터 다음 필터... 이런식으로 계속해서 추가해줄 수 있고, 서블릿 필터를 통해 서블릿에서 이루어져야 하는 공통적인 기능들을 서블릿이 호출되기 전에 수행(전처리)되게 하고 싶거나 서블릿이 호출 되고 난 뒤에 수행(후처리) 하고 싶을 때 사용한다.

서블릿의 구조를 살펴보고 다시 돌아와서 필터를 살펴보도록 하겠다.


⭐️ web.xml에 서블릿 등록하기


이후 어노테이션으로 서블릿을 간단하게 등록하여 사용할 수 있지만, 이를 직접적으로 어떻게 사용하는지 간단하게 알아보도록 하자.

🔥 간단한 서블릿 클래스파일 만들기

아까 만들어준 패키지 내부에 클래스파일을 하나 제작해준다.

해당 클래스 파일에 HttpServlet 클래스를 상속시켜준다. 이후 arg0, arg1 파라미터 두 개를 받는 service 메소드를 오버라이드 받아온다. 여기서 arg0은 사용자가 서버에 요청할 때 사용하는 파라미터이고, arg1은 서버가 사용자에게 응답할 때 사용하는 파라미터이다.

오버라이딩을 통해 재정의 된 메서드 내부에 간단한 프린트문을 이용하여 문장을 출력해주도록 하겠다.

🔥 web.xml파일에 제작한 서블릿 클래스 파일 등록시키기

이제 web.xml파일에 방금 제작한 서블릿 클래스를 등록하여 웹 화면에 출력하도록 만드려고 한다. 그 전에 web.xml파일은 무엇일까?

web.xml은 배포설명자 라고 불린다. 이는 웹 어플리케이션의 설정파일로, 웹 어플리케이션을 실행시킬 때 함께 올라가야 할 설정(설명)들을 정의해 놓은 것이다. 모든 웹 어플리케이션 실행 시 xml파일이 메모리에 로드된다.

이 xml파일에 해당 서블릿 클래스가 호출될 수 있도록 경로를 짜줄 것이다.

처음 web.xml파일을 열자마자 보이는 welcome-file 문장들이다. 이는 도메인만을 입력해서 사이트에 접속했을 때 나타나는 파일 이름들로, 윗 줄부터 해당 이름의 파일이 존재하지 않을 때 마다 아래에 있는 파일들을 호출에서 창에 띄워준다.

그 밑에 제작한 서블릿을 불러오는 문장들을 추가해주면 된다.

서블릿 네임은 xml파일 내에서 우리가 불러올 서블릿 클래스 파일을 지칭할 이름을 지정해주는 것이고, 그 밑에 서블릿 클래스에는 우리가 만들었던 패키지의 경로 + 원하는 서블릿 클래스 파일의 이름을 붙여준다.

서블릿 매핑 내부엔, 아까 정했던 파일의 이름과 url패턴을 지정해주면, 주소창에 localhost:포트번호/url패턴 으로 아까 만들었던 서블릿 클래스 파일을 화면에 띄울 수 있게 된다.



⭐️ 어노테이션을 이용한 URL매핑


방금까지 작업한 이 귀찮은 작업을 어노테이션 한 방으로 해결할 수 있다. 첫 번째 제작한 서블릿 클래스 파일과 내부는 동일하게 제작한 뒤, 클래스 이름 위에 @WebServlet을 어노테이션으로 달아준다. 그 뒤엔 도메인 뒤에 붙을 url을 적어주자.


localhost:포트번호/방금적은url주소 로 해당 페이지를 브라우저에 띄울 수 있다.


⭐️ 한글 출력 문제와 서블릿 필터


for문을 이용하여 1부터 10까지 돌며 출력문을 뽑는 코드를 짰다. 여기서 아래처럼 "번째 서블릿입니다" 문장이 ?로 나타나는 것을 알 수 있다.

이럴 땐 오버라이딩 된 메소드 내에 해당 문장들을 추가해주자.

이 세줄은 한글을 페이지에 보여주는 기적의 3형제이다. 항상 붙어서 다닌다고 생각하면 된다.

이 때 드는 생각은, 만약 100개의 서블릿을 추가해야 하는데 100개의 서블릿 모두에 한글 표시를 도와주는 3문장을 모두 추가 해야 하는가이다. 이때 전처리 과정을 위해 서블릿 필터에 해당 문장을 적어준다. 그렇다면 서블릿 필터는 어떻게 작성할까?

서블릿 패키지 경로 내부에 필터 패키지를 추가로 만들어 준다. 내부에 클래스 파일을 만들고, Filter 인터페이스를 상속해준다. 그 뒤 어노테이션을 WebFilter로 달아주는데, url을 /* 로 작성해준다. 이 의미는, 모든 서블릿에게 해당 필터를 적용시켜준다는 의미이다. 그 뒤 doFilter 메소드를 오버라이드 시켜주자.

위에서 작성했던 한글을 깨지지 않게 해주는 삼신기를 오버라이드된 메소드 안에 적어주자.

이제 해당 프로젝트 안에 작성되는 모든 서블릿은 제작한 필터를 거치게 될 것이다. 다만, 여기서 필터체인을 마지막으로 걸어줘야 다음 작업을 진행할 수 있다.

다시 전에 만들었던 1부터 10까지 반복해주는 서블릿 클래스로 돌아가서, 해당 클래스에 적어놓은 한글 3신기를 지우고 프로그램을 실행시켜보자.


⭐️ 사용자에게 정보 받아 자바단으로 넘기기


방금 만든 3번째 파일과 구조는 유사하지만, 반복 횟수를 사용자에게 받으려면 어떻게 해야할까?

📌 반복횟수를 사용자에게 받아 화면에 출력하기

  1. HTML에서 form태그를 제작하여 action값에 url 넣어주기
  2. form태그 안에 입력받을 상자와 제출 버튼 만들어주기
  3. 입력 받을 상자의 name에 적은 값을 자바단에서 변수로 만들기
  4. 자바단에서 해당 변수를 받아 int로 파싱해주기
  5. 사용자가 입력하지 않을 경우를 대비해 예외처리 해주기

🔥 HTML > form태그 제작

HTML의 경우 src > webapp 내부 경로에 파일들을 모아준다. 간단한 인풋박스와 제출버튼을 포함한 페이지를 만들어 준다. 여기서 form action엔 연결될 url을, 입력 버튼의 name엔 이용할 변수명을 작성해준다.

이후 도메인 뒤에 붙을 url은 해당 HTML의 파일명.html이 된다.

🔥 서블릿 클래스 제작

아까와 비슷한 로직을 가진 클래스를 제작해준다. 다만, 사용자에게 입력받을 변수를 설정해준다.

cntValue는, input 박스에서 사용자에게 입력받을 값을 String으로 받아준 변수이다. 그 밑의 int num은, 해당 cntValue를 int값으로 파싱해 준 이후 그 값을 넣어줄 변수이다. 기본값은 0으로 설정해놓았다.

여기서 사용자가 만약 값을 입력하지 않고 제출을 누를 경우의 예외처리를 해 줄 것이다. cntValue의 값이 null이 아니거나, 빈 값이 아닐 때 int로 파싱을 해주는 것으로 로직을 짜보았다.

이후 for문을 돌려, 조건식의 최댓값을 num으로 설정해주었다. 마지막에 br태그를 달아주어 가독성을 생각해주었다.

이제 도메인에 /helloPractice.html 을 달아주어 페이지를 실행시켜보았다.



⭐️ get 방식에서 주소창에 데이터 직접 넣어주기


데이터를 다른 페이지로 넘겨줄 때 get 방식과 post 방식이 있다고 배웠다. 그 중에서 post 방식은 데이터를 주소창에 띄우지 않고 내부로 숨겨주며, 대용량의 데이터를 전송하기에 적합하다. get 방식은 넘겨줄 데이터를 주소창에 직접 찍어주어 보안엔 취약하지만 간단하고, 손쉽게 데이터를 넘겨줄 수 있다.

디폴트 방식인 get 방식을 이용하여 데이터를 직접 다른 페이지로 넘겨보자.

간단하게 링크 2개를 만들어 주었다. 윗 링크를 누르면 localhost:8081/cnt 페이지로 이동하게 되고, 해당 페이지는 서블릿에 cnt가 10번 돌아 인사를 반복하도록 내용을 작성해놓았다. 아래 링크를 누르게 되면, localhost:8081/cnt?cnt=3 으로 이동하게되고, 해당 cnt를 3번만 반복하도록 cnt에 사용자가 값을 담아준 형태이다. 해당 페이지로 이동하게되면 인사를 3번만 하게 된다.




⭐️ 서블릿으로 간단한 계산기 만들기


먼저 간단하게 form태그를 만들어준다. action에는 이동할 주소를 적어주고, 서블릿엔 해당 주소를 매핑해준다.

서블릿으로 가서, 해당 주소를 매핑해주고, HttpServlet을 상속받아준다. 그 뒤 service메소드를 오버라이드 받고, PrintWriter 객체를 하나 만들어준다. (앞에서 계속 했던 작업 반복)

그 뒤, form태그의 x와 y값을 getParameter로 받아와 String 변수에 대입해주고, operator 버튼도 String 변수에 대입해준다.

이후, 예외처리를 해주고, operator 버튼의 value가 "덧셈"일 경우 int로 파싱해준 X와 Y를 더해준다. 반대의 경우는 빼준다.



profile
안녕하세요.

0개의 댓글

관련 채용 정보