[꼼꼼한 개발자] 꼼코더

[서블릿 개념 핥기] - 02 - 서블릿이란? + 실습 (한 번에 이해할 수 있는 글) 본문

Servlet, JSP/개념 핥기

[서블릿 개념 핥기] - 02 - 서블릿이란? + 실습 (한 번에 이해할 수 있는 글)

꼼코더 2023. 1. 10. 01:58
반응형

⁉️ 서블릿이란?

결론만 이야기하자면

  1. 웹 클라이언트의 요청을 처리할 수 있는 클래스이다
  2. HttpServlet을 상속하여 만들어지는 것들을 servlet이라고 불린다
  3. 즉 JSP파일도 Servlet으로 동작한다.

하지만 이렇게 이야기하면 어렵게 느껴진다. 아래 글들을 읽고 나면 이해가 될 것이다.


👨🏻‍🏫 본론

저번 시간에 클라이언트의 요청을 JSP파일로 받았었다. → localhost:8080/servlet/login.jsp

오늘은 클라이언트의 요청을 Servlet으로 직접 받도록 바꿔보자.

 

여기서 잠깐!?🖐 “저번에 JSP는 Servlet이라고 하지 않았나?”라고 할 수 있다.

하지만 브라우저 입장에서는(주소창에서 요청) 아래와 같은 이유로 인하여 다르다고 보인다.

 

JSP는 → JSP파일(/login.jsp )을 요청하는 것이고.

Servlet은 → 브라우저가 Servlet에(/login) 요청할 수 있도록 직접 작성하여 설정하는 것이다.

 

다시 말해 JSP파일이 아니라 어떠한 Servlet을 요청하는 방식으로 바뀔 것이고.

이것을 알아야 MVC패턴을 이해할 수 있다.


🎮 MVC 패턴

이 3가지로 웹 애플리케이션을 만들 때 분류를 한다.

  • Model - 비즈니스 영역의 로직 처리 -> 로직 처리 클래스, 자바빈
  • View - 사용자에게 보이는 부분, 사용자에게 값을 보여주는 역할만 동작하게 한다. ->JSP파일
  • Controller - 사용자의 입력처리와 흐름제어 담당. -> Servlet

👨🏻‍💻 서블릿 실습

LoginServlet.java 생성 후 HttpServlet을 상속받아 init(), destory(), service() 메서드를 오버라이딩 한다.

생성한 java파일(LoginServlet.java)을 저장하고 이제 이 서블릿을 브라우저에서 요청을 해야 한다.

기존에는 브라우저에서 localhost:8080/servletx/login.jsp 요청 시 login.jsp 파일의 결과를 주었다면.

 

지금은 작성한 자바코드를 요청해야 하는 상황이 왔다. 하지만 자바 코드를 요청하는 것은 말이 되지 않는다.

그래서 우리는 XML 설정을 통하여 요청하면 자바 코드를 요청하는 것이 가능하다.


⚙️ XML 설정

web.xml파일 생성 후 내가 만든 LoginServlet.java을 등록해줘야 한다.

이 개념만 알면 앞으로 Servlet을 찾아서 공부할 때 지장은 없다.

이제 하나씩 정의를 해보자. 아래 사진을 참고하면서 정의를 확인해 보자.

🖐 태그 <>들의 역할

<servlet> : 설정하려는 서블릿을 등록하는 역할

  • 반드시 하위 태그로 <servlet-name>과 <servlet-class>가 나와야 한다.

<servlet - name> : 서블릿의 이름을 지정.

  • 지정한 이름은 이후 해당 서블릿을 참조할 때 사용합니다.

<servlet-class> : 서블릿의 클래스의 경로.

  • 패키지명과 함께 대소문자를 구분하여 정확하게 입력해야 합니다.

위 3 작업이 끝나면 서비스 동작할 때 서비스는“아하! 이 class가 내가 사용해야 할 class구나(LoginServlet.java)”라고 인식을 하게 된다. 그 다음은 브라우저에서 어떤 경로로 요청할지 경로를 매핑하는 xml을 작성했다.

 

<servlet-mapping> : 경로를 매핑하는 역할

<servlet-name> : 매핑할 <servlet>의 이름

<url-pattern> : 브라우저에서 요청할 (url) 패턴


🎬 설정 후 동작

설정을 다 마치고 브라우저에 localhost:8080/servletx/login로(login.jsp아님 xml 사진 참고)요청 시 위에 등록한 Servlet이 동작한다.

그럼 내가 만든 LoginServlet.java 코드가 동작하게 된다.(화면 부분은 작성하지 않았다.)

자 지금 우리는 어떠한 JSP파일을 요청한 게 아니라 URL형태로 어떠한 명령(요청)을 하게 된 것이다.

위에 설정 파일을 기반으로 동작원리를 설명하자면

 

localhost:8080/servletx/login이라는 요청이 들어오면

 

XML에 “/login에 대한 요청은 loginServlet으로 처리할게”라고 Mapping이 되어있고.

그 loginServlet을 찾아가 보면 servletex.LoginServlet가 적혀있다.

마지막으로 LoginServlet.java코드 안 구현된 메서드()들로 브라우저에 요청을 처리하겠다.

 

라는 설정 내용이다.


📺 화면 작성

LoginServlet.class에 login 로직을 짜보도록 하자

먼저 service()를 지우고 get요청이 들어왔을 때 처리하는 메서드인 doGet()를 오버라이딩 해준다.

 

메소드 내용은 로그인하는 페이지를 보여주도록 하자.

기존 방식과 같이 아래 내용처럼 html 작성하고 보여주어야 한다.

하지만 이러한 작업은 너무 고되고 비효율적이다. 그래서 이 불편함을 JSP를 사용하여 동작해 보자.


🕊 JSP 등장

아래와 같이 service()를 지우고 doGet()를 오버라이딩 하여 작성해 주었다.

사진 속 코드를 설명하자면

  • req에 포워딩할 때 사용하는 Dispatcher를 사용하여 /login.jsp파일에 현재 생성된 객체인 req와 resp를 같이 보낸다.
  • 이 작업은 JSP파일로 브라우저에 응답할 내용을 만들어 내부에서 포워딩을 하는 작업이다.
  • 이렇게 하면 JSP파일을 사용해서 응답이 돌아오는 걸 확인할 수 있다.

👀 최후 수정

이제 이전 login.jsp파일로 화면까지 보여주었다. 하지만 [우 클릭 → 소스보기]를 통하여 소스를 확인해 보면

현재 이 페이지는 로그인 시 action이(로그인 버튼 클릭시 요청하는 경로) loginProc.jsp로 처리가 되어있다.

우리는 Servlet으로 처리할 것이기 때문에 action 값을  loginProc.jsp -> login으로 변경해 준다.

하지만 수정 후 아이디와 비밀번호 입력 후 [로그인] 버튼 클릭 시 이러한 오류가 나온다(아래 오른쪽 사진 참고).

이유인즉은 위에 login.jsp에 작성한 로그인 요청은 메소드는 post인데(위 사진 참고) 우리는 이전 LoginServlet.class에서 get방식(doGet())의 처리 로직만 작성하였기 때문이다.

따라서 LoginServlet.class에 doPost() 오버라이딩한 코드를 추가한다면. 오류는 해결된다.(아래 사진 참고)

자 이제 서블릿으로 처리하는 개념을 우리가 이해하고 “아! 서블릿이 이런 거였어?” 할 수 있는 정도가 됐을 것이다.


🧹 정리

  1. 브라우저에서의 요청을 어떠한 JSP파일을 요청하는 게 아니다 (’login.jsp’ → X, ‘/login’ → O)
  2. 그 요청 url과 내가 정의해둔 자바 class로 매칭을 시켜서 처리한다.
  3. 해당 자바 클래스는 아무나 될 수 있는 게 아니고 HTTPServlet을 상속한 클래스만 가능하다.
  4. 해당 자바 클래스가 가지고 있는 오버라이딩 한 메서드들을 가지고 서비스를 한다.
  5. 이때 JSP는 화면에 보일 페이지를 정의하는 역할이다.
  6. 결론은 서블릿은 웹 클라이언트가 요청을 처리할 수 있는 클래스이다

 

 

 

 

Comments