[Servlet
] --HTML코드 출력 문제--> JSP
--스파게티 코드 문제--> JSP MVC
-> Spring MVC
-> SpringBoot
자바 어플리케이션에서는
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 파일이 생성됨을 확인할 수 있다.
이제 웹에서 Company.class를 요청함으로써 소스 코드가 실행되는지 확인해보자.
WEB-INF
디렉토리는 서버에서만 다루기 위한 파일들을 보관하는 디렉토리이다.
따라서 클라이언트에서 "URL을 통해서"는 요청이 불가능하다.
Tomcat의 홈 디렉토리에는 WEB-INF
라는 디렉토리가 있는데 이 디렉토리는 URL을 통해 접근이 불가능하다.
WEB-INF
디렉토리 안에 classes
라는 디렉토리를 만들고 그 안에 Company.class를 옮긴 뒤 웹 브라우저를 통해 요청해보자.서버 안에 요청한 페이지가 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는 이를 클라이언트에게 응답한다.
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~");
성공적으로 문자열이 출력됨을 확인할 수 있다.
여태 메모장을 통해 소스 코드르 입력하고, cmd창을 통해 컴파일을 한 뒤,
직접 Tomcat를 재실행하며 Servlet을 배포했지만,
이제 Intellij 라는 IDE(Integrated Development Environment)를 사용해
좀 더 편하고 빠르게 배포해보겠다.
Add Framework Support...
를 클릭하고 Java EE
에서 Web Application
을 클릭한 뒤 확인을 누른다.Add Configurations...
클릭 후 Tomcat local
항목에서 Tomcat이 설치된 디렉토리를 설정해준 뒤 확인을 누르면 Tomcat 연동이 완료된다.servlet-api.jar
파일을 추가해준다.기존의 메모장에 적던 코드를 Intellij를 사용해 적으니 훨씬 편했고, 무엇보다 컴파일
/ 배포
/Tomcat 실행
이 한 번에 가능해서 매우 편했다.
프로젝트로서 Servlet 프로그램을 관리하기 관리하기가 너무 편해졌다.
지금까지는 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
을 통해 적었던 긴 태그를 대체할 수 있다!!