학습목표
자바 웹 애플리케이션의 기본 구조에 대해 설명할 수 있다.
Servlet 클래스를 Tomcat 환경에서 실행시키는 방법에 대해 설명할 수 있다.
HttpServlet 을 작성하는 방법에 대해 설명할 수 있다.
자바 (Java) 웹 애플리케이션
webapp/WEB-INF/classes : 웹 애플리케이션의 클래스 파일(=개발자가 만든 클래스 파일이 위치하는 곳)
webapp/WEB-INF/lib : 웹 애플리케이션의 라이브러리 파일, 외부에서 구한 오픈 소스 라이브러리 저장 장소
webapp/WEB-INF/web.xml : 웹 애플리케이션의 환경파일, 웹 애플리케이션이 컨테이너에 의해 실행될 때 환경파일에 있는 대로 동작함
webapp 폴더 : jsp, html, css, js 파일 등이 위치
classes 에 위치한 클래스들과 lib 에 위치한 jar 파일들은 Classpath 에 추가하지 않아도 웹 애플리케이션에서 이용 가능
WEB-INF 하위의 파일들은 HtttpRequest 로 클라이언트가 직접 접근할 수 없음
--> 일반적으로 HTML, css, 자바 스크립트 등 클라이언트 URL 로 바로 접근해야 하는 파일들은 WEB-INF 밑에 두지 않음
웹 애플리케이션 배포 파일
자바 웹 애플리케이션을 서버에 배포할 때는 war 파일로 묶어서 배포할 수 있음
.war : 웹 애플리케이션의 배포 파일
Servlet Container 에 배포
Servlet Container : 요청된 JSP/Servlet 을 실행하고 그 결과를 돌려주는 서버
Container : 클라이언트의 요청을 분석하고 실행시켜주는 역할 (우리가 계속 요청이 들어올때까지 대기하고 있을 순 없으므로 Container 가 클라이언트의 요청을 인지한다.)
JSP/Servlet API 를 구현하고 확장한 서버
Servlet 의 생성부터 소멸까지 일련의 Lifecycle 관리
--> 대표적으로 톰캣(Tomcat)
Servlet 개념
Request/Response 기반의 자바 서버 사이드(Server side) 애플리케이션 개발 기술
Servlet 은 하나의 인스턴스에 여러 Thread 가 동작하는 Multi-Thread 방식 (개발자가 멀티 스레드를 양산하거나 관리하지 않음 --> Container 가 함!)
main() 메소드를 구현하지 않으며, Servlet Container 에 의해 실행되고 관리됨
Servlet 작성 방법
아래 클래스 중 하나를 상속 받아 작성
- javax.servlet.Servlet
- javax.servlet.GenericServlet
- javax.servlet.http.HttpServlet <-- 대부분 사용
HTTP Request 에 의해 실행되는 웹 애플리케이션은 HttpServlet 을 상속 받아 작성
HttpServlet의 수행 흐름
- 클라이언트가 브라우저를 통해서 Servlet Request
- Servlet Container 에서 Request 를 받아서 해당 Servlet 의 Instance 가 있는지 확인하고 없다면 Servlet 을 로딩하고 Instance 생성
- 해당 Servlet 의 서비스 가능한 Thread 가 있는지 확인하고 service() 메소드를 호출하고 없다면 새로운 Thread 를 만들어서 service() 메소드 호출 // 동시에 여러 명이 들어왔다 --> 여러 스레드가 한번에 작동한다. (멀티 스레드)
- 호출된 Servlet 에서 결과를 html 형태로 만들어 Servlet Container 에 전달
- Servlet Container 에서는 결과 (Response) 를 클라이언트에게 전송
HttpServlet Lifecycle
1. Instance 생성
2. init() : instance() 가 생성된 직후에 한 번 Servlet Container 에 의해 호출됨
3. service(ServletRequest req, ServletResponse res)
- 클라이언트의 요청이 있을 때마다 각각의 Thread 가 생성되어 service() 메소드 호출
- service() 메소드에서 HTTP Method 에 따라 아래의 메서드 호출
- doPos(req, res) : HTTP POST method
- doGet(req, res) : HTTP GETmethod
- doDelete(req, res) : HTTP DELETE method
- doPut(req, res) : HTTP PUT method
4. destroy()
Servlet Instace 가 더 이상 필요 없을 때 호출
HttpServlet 작성 방법
- javax.servlet.http.HttpServlet 상속
- init(), destroy() 메소드 작성(Optional)
- service(req, res) 메소드를 작성하거나, doPost(req, res), doGet(req, res) 중 하나 혹은 모두 작성
한글 깨짐 방지를 위해 선언하는 구문
javax.servlet.http.HttpServletRequest Encoding
request.setCharacterEncoding("EUC-KR");
javax.servlet.http.HttpServletResponse 의 Content Type 설정
response.setContentType("text/html;charset=EUC-KR");
HttpServletResponse 에서 PrintWriter out 객체 획득
PrintWriter out = response.getWriter();
java.io.PrintWriter 객체에 클라이언트에 전송할 HTML 출력
out.println("<h1>Hello World</h1>");
4. Servlet 이 실행될 URL 을 어노테이션으로 명시
@WebServlet("/testServlet")
public class RequestTestServlet extends HttpServlet
실습 진행
HelloServlet 을 만들고 Tomcat 9.0 서버를 통해 @WebServlet("/HelloServlet") URL 을 통해
크롬에서 "/HelloServlet" 요청이 들어왔을 때 서블렛 구동시켜보기
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("EUC-KR");
response.setContentType("text/html;charset=EUC-KR");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>helloworld servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>HelloWorld</h1>");
out.println("</body>");
out.println("</html>");
}
처음 들어보는 용어 투성이지만 아직 재밌다. 다만 정처기나 미리 자바 실습을 한번씩 돌려보지 않았으면 이것도 따라가기 어려웠을듯
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
6차시 Servlet 설정 (0) | 2023.06.29 |
---|---|
5차시 웹 Query 문자열 (0) | 2023.06.29 |
4차시 Response 분석 (0) | 2023.06.29 |
3차시 Request 분석 (0) | 2023.06.29 |
1차시 웹 애플리케이션의 이해 (0) | 2023.06.28 |