Servlet / JSP ) 3. Servlet 프로그램 만들기

60jong·2022년 4월 27일
0

Servlet / JSP

목록 보기
3/17

Server 공부 흐름

[Servlet] --HTML코드 출력 문제--> JSP --스파게티 코드 문제--> JSP MVC -> Spring MVC -> SpringBoot


Servlet 프로그램 만들기

자바 어플리케이션에서는 main() 메소드부터 호출되는 것처럼
자바 "웹" 어플레이케이션 ( Servlet 프로그램 ) 에서는 service() 함수가 먼저 호출된다.

Context Site인 company 디렉토리에 Servlet 프로그램을 추가시켜보겠다.

Company.java

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Company extends HttpServlet {
	public void service(HttpServletRequest request
    , HttpServletResponse response) throws IOException. ServletException {
    
    	System.out.println("Hello, Servlet~");
    }
}

그리고 cmd창으로 통해 javac 커맨드로 컴파일을 해보면

cannot find symbol

기본 JDK 라이브러리에는 servlet 라이브러리가 포함되지 않기에 오류가 발생한다.
따라서 javac로 컴파일 시 Tomcat의 lib디렉토리 ~\apache-tomcat-9.0.62\lib 에 존재하는 servlet-api.jar를 classpath로 지정해줘야한다.

javac -cp "~\apache-tomcat-9.0.62\lib\servlet-api.jar" Company.java


성공적으로 컴파일이 되고, Company.class 파일이 생성됨을 확인할 수 있다.


Servlet 프로그램 실행하기

이제 웹에서 Company.class를 요청함으로써 소스 코드가 실행되는지 확인해보자.

WEB-INF

WEB-INF 디렉토리는 서버에서만 다루기 위한 파일들을 보관하는 디렉토리이다.
따라서 클라이언트에서 "URL을 통해서"는 요청이 불가능하다.

  • Tomcat의 홈 디렉토리에는 WEB-INF라는 디렉토리가 있는데 이 디렉토리는 URL을 통해 접근이 불가능하다.

    • 시도
      WEB-INF 디렉토리 안에 classes 라는 디렉토리를 만들고 그 안에 Company.class를 옮긴 뒤 웹 브라우저를 통해 요청해보자.

      404에러서버 안에 요청한 페이지가 X가 나는 것을 볼 수 있다.
  • 인용구 안에 설명하기를 "URL을 통해서" 요청이 불가능하다고 했다. 그렇다면 어떻게 요청을 해야할까?

    Tomcat의 web.xml에 URL과 파일을 매핑시켜주는 코드를 추가해주면 된다.

    • 	<servlet>
      		<servlet-name>company</servlet-name>
      		<servlet-class>Company</servlet-class>
      	</servlet>
      
      	<servlet-mapping>
      		<servlet-name>company</servlet-name>
      		<url-pattern>/hello</url-pattern>
      	</servlet-mapping>

      이 코드는

      "url을 통해 `/hello`라는 요청이 왔을 때, `company`라는 이름의 servlet을 실행시켜주는데, 
      company라는 이름의 servlet은 Company라는 class의 servlet이다."

      를 의미한다. 이렇게 매핑을 시켜준 뒤 localhost:8080/hello로 요청을 해보면

      Company.java 코드 내용이 실행됨을 확인할 수 있다.

정리)

  • URL을 통해 /hello 요청이 오면 웹 서버 (WS)는 Tomcat의 홈 디렉토리에서 hello에 해당 하는 파일을 찾는다.
  • 찾지 못한다면 WAS를 통해 /hello와 매핑된 것이 있는지 web.xml에서 찾아본 뒤, 매핑된 것을 찾는다면 WAS는 WS에게 해당 Servlet을 넘겨준다.
  • 그리고 WS는 이를 클라이언트에게 응답한다.

Servlet 프로그램을 통해 웹 페이지에 문자열 출력하기

Company.java에서는 System.out.println을 통해 콘솔 창에 문자열을 출력했다.
이제는 웹 페이지에 문자열을 출력해보자.

System.out.println("Hello, Servlet~");

을 아래 코드로 바꾼 뒤, 다시 컴파일 / Tomcat 재실행 / URL 매핑된 내용을 통해 요청을 해보자.
(IDE 사용 마렵... 이번 까지만 메모장으로 한땀한땀 코드를 치자.)

//Byte 단위 전송하는 Stream계열
OutputStream os = response.getOutputStream();  //response : HttpServletResponse 객체
PrintStream out = new PrintStream(os,true);
out.println("Hello, Servlet~");


or


//문자열 출력에 특화된 Writer계열
PrintWriter out = response.getWriter();
out.println("Hello, Servlet~");

성공적으로 문자열이 출력됨을 확인할 수 있다.


Intellij를 통한 Servlet 개발 환경 세팅

여태 메모장을 통해 소스 코드르 입력하고, cmd창을 통해 컴파일을 한 뒤, 
직접 Tomcat를 재실행하며 Servlet을 배포했지만, 
이제 Intellij 라는 IDE(Integrated Development Environment)를 사용해 
좀 더 편하고 빠르게 배포해보겠다.

Intellij에서 Web 개발 프로젝트 생성하기

  • Intellij에서 일반 Java 프로젝트를 생성한다.
  • 프로젝트를 우클릭 한 뒤, Add Framework Support...를 클릭하고 Java EE에서 Web Application을 클릭한 뒤 확인을 누른다.
  • Tomcat 연결을 위해 Add Configurations... 클릭 후 Tomcat local 항목에서 Tomcat이 설치된 디렉토리를 설정해준 뒤 확인을 누르면 Tomcat 연동이 완료된다.
  • Servelt 라이브러리를 추가해주기 위해 servlet-api.jar 파일을 추가해준다.

Intellij로 Servlet 프로그램 만들기

  • 기존의 메모장에 적던 코드를 Intellij를 사용해 적으니 훨씬 편했고, 무엇보다 컴파일 / 배포 /Tomcat 실행 이 한 번에 가능해서 매우 편했다.

  • 프로젝트로서 Servlet 프로그램을 관리하기 관리하기가 너무 편해졌다.


Annotation을 통해 URL 매핑

지금까지는 web.xml에 태그를 추가해 URL 매핑을 했다.

  • web.xml을 통한 URL 매핑

       <servlet>
           <servlet-name>company</servlet-name>
           <servlet-class>com.jongky.web.Company</servlet-class>
       </servlet>
    
       <servlet-mapping>
           <servlet-name>company</servlet-name>
           <url-pattern>/hello</url-pattern>
       </servlet-mapping>

하지만 Annotation을 통해 URL을 매핑하는 방법도 있다.

  • Annotation을 통한 URL 매핑

    @WebServlet("/hello")
    public class Company extends HttpServlet {
      public void service(HttpServletRequest request, HttpServletResponse response)
              throws IOException, ServletException {
          PrintWriter out = response.getWriter();
          out.println("Hello Servlet");
      }
    }
    

    단순히 class 선언문 위에 @WebServlet()을 추가하는 것만으로 web.xml을 통해 적었던 긴 태그를 대체할 수 있다!!

profile
울릉도에 별장 짓고 싶다

0개의 댓글