SOCO
컴파일, 클래스 생성, 실행, 출력 (1) 본문
[잠깐 복습]
서블릿을 만든다는 의미는 서버 애플리케이션을 만든다는 것
서버 애플리케이션은 기능별로 코드가 나눠져있고,
필요에 따라 코드가 선택적으로 실행될 수 있게 만들어져있음
(웹이라는 환경을 통해서 프로그램을 실행해야하기 때문)
예를 들어
사용자가 공지사항 리스트를 달라고 요청을 하면,
리스트라는 서블릿(서버 애플리케이션)만 실행하는 것임
사용자가 요청하기 전까지 서버애플리케이션(서블릿)은 로드되지 않음
수많은 조각(기능)들이 있고, 모든 기능이 다 사용되지 않음
어쩌다가 요청이 들어오면 그것만 사용됨
효율성을 높이기 위해 웹이라는 환경에서 사용되는 서버프로그램이다보니
필요에 따라 로드될 수 있도록 조각나있는 것임
조각 나 있는 서버 애플리케이션 => 서블릿!
모든 서버 애플리케이션을 다 한 번에 개발하는 것이 아니라
필요한 것을 하나씩 개발해나가면 됨
-------
[그렇다면 어떻게 만들 것인가?]
자바 애플리케이션은
자바 프로젝트 > 클래스 > main 메서드(클래스에 종속되어있는 함수)를
시작으로 프로그램을 만드는 것임
//자바 어플리케이션
public class Hello{
public static void main(String[] arg){
System.out.println("Hello World");
}
}
서블릿은 service라는 이름의 함수를 통해서 프로그램을 만드는 것임
1. class 이름 -> 구현 기능에 따라 변경
2. main 메서드가 아니라 -> service 함수임 (이건 변경x)
[구체적인 코드 예시]
서블릿의 클래스는 WAS(ex. 톰캣)에 의해서 로드가 되고, 실행이 되고, 결과를 돌려주게 됨
WAS는 클래스명에는 관심이 없음
약속되어있는 인터페이스 명이나 추상 클래스 명을 사용하게 됨
즉, 추상클래스라는 자료형식으로 서블릿을 참조하게 되어있음
추상클래스를 통해서 호출하는 함수는 정해져있는 service함수임
클래스 명은 기능에 따라 정하면 됨 (예시로 Nana로 씀) ->이렇게 만들어진 클래스를 Nana 서블릿이라고 함
HttpServlet을 상속(extends)받고 있는 모든 구현 클래스는 서블릿 클래스가 되니까 Nana 서블릿이라고 말함
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Nana extends HttpServlet
{
public void service(HttpServletRequest reuest, HttpServletResponse response)
throws IOException, ServletException
{
System.out.prinln("Hello Servlet");
}
}
*추상 클래스 : 미완성 메서드(추상메서드)를 포함하고 있는 클래스 상속을 통해서 자손클래스에 의해서만 완성될 수 있다(abstract - extends)
*인터페이스 : 일종의 추상클래스. 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 인터페이스는 인터페이스로부터만 상속을 받을 수 있음(interface - implements)
[전체적인 과정]
코드 작성 -> 컴파일 -> 클래스 파일 생성 -> 사용자 요청(호출) -> 실행 -> 출력
필요한 것 : 메모장, jdk, 톰캣
서블릿은 이클립스가 없이도 개발할 수 있다
=> 멘 땅에 개발해보고
=> 좀 더 편하게 사용할 수 있는 통합개발환경을 사용 !
<<컴파일 까지>>
1. 코드작성 : 우선 메모장에 위의 예시를 따라 적는다
2. 저장(확장자 : .java) : 컴파일(번역)하기 위해 저장 (클래스명과 동일한 이름으로 파일을 저장해야함!)
3. 콘솔창열기 : 윈도우키 + r키 => cmd why? 콘솔창에서 컴파일 해야하니까!
4. cd 파일경로 : 해당 파일(Nana.java)이 저장되어있는 경로 복붙
5. dir : 해당 디렉토리에 저장되어 있는 목록을 보기 -> Nana.java 있음
6. javac Nana.java : javac로 컴파일 하기 위함
7. 오류가 남 => cp라는 옵션을 줘서 서블릿 라이브러리(servlet api)를 이용할 수 있게 해야함
8. 서블릿api의 경로를 찾기 : 톰캣있는 파일 >lib에 있음
9. cd 파일경로 : 해당 파일(Nana.java)이 저장되어있는 경로로 다시 들어감
10. javac -cp 서블릿api경로\servlet-api.jar Nana.java
11. dir : Nana.class가 생성된 것을 확인할 수 있음 (Nana 서블릿!)
<<호출 및 실행 전에 알아야할 것>>
1. 클래스 파일을 어디에 둬야하는가?
클래스 파일을 어디에 둬야하는가?
예약된 곳이 있음
1)패키지가 없는 경우
apatch폴더>webapps폴더>ROOT폴더>WEB-INF 폴더 > classes 폴더에 Nana.class를 둬야함
2)패키지가 있었다면 (패키지가 com.newlecture라면)
apatch폴더>webapps폴더>ROOT폴더>WEB-INF 폴더 > classes 폴더 > com폴더 > newlecture폴더에 Nana.class를 둬야함
이 규칙에 맞춰서 클래스를 두지 않으면 찾을 수가 없다!
*ROOT폴더 : 톰캣의 홈디렉토리
2. 사용자는 어떻게 요청을 할 수 있을까?
ROOT폴더>WEB-INF 폴더 이건 사용자가 요청할 수 있는 부분이 아님! 서버에서만 사용하는 것!
클라이언트가 이 WEB-INF폴더 안을 들여다볼 수도 없고, 요청할 수도 없게 되어있음
그럼 어떻게 요청할 수 있게 하는가?
자바 서버 어플리케이션, 즉 서블릿, 즉 클래스는 웹서버+WAS(지금은 톰캣)만 알고있으면 됨
(웹서버+WAS가 이 코드를 실행하니까)
따라서 사용자가 요청할 때 사용하는 이름을 클래스 파일과 맵핑하는 작업이 필요함
예를 들어 사용자가 4를 요청하면 4와 맵핑되어있는 서블릿 코드(URL과 매핑된 서블릿 코드)를 실행해서 결과를 돌려주는 방식으로 진행됨
실제 서블릿이 Nana.class라고 해도 사용자에게는 다른 이름으로 요청할 수 있게 해주는 것임
예를 들면,
hello가 오면 Nana.class가 실행되도록 하겠다는 정보를 톰캣에 설정함
<servlet>
<servlet-name>na</servlet-name>
<servlet-class>Nana</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>na</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
이렇게 하면
사용자는 http://localhost/hello를 통해서 요청하고
톰캣은 이렇게 요청이 온 경우
이 요청에 해당하는 서블릿 코드를 찾아서 실행해줌
<<호출 및 실행>>
1. 톰캣파일 실행
apatch폴더>bin폴더 > startup.bat파일 실행
2. (일단)브라우저에서 localhost:8080해보자
1) http://localhost:8080/example1.txt 해보자
/ : 홈디렉토리(ROOT)를 의미
example1.txt.파일 요청
지난 번에 한 파일! 아주 잘 나옴
2)example1.txt 파일을 WEB-INF에 복붙해서 불러보자
http://localhost:8080/WEB-INF/example1.txt
/ : 홈디렉토리에
WEB-INF/ : WEB-INF폴더에
example1.txt파일 요청
찾을 수 없음이 나옴
WEB-INF 폴더는 외부에서 요청할 수 있는 디렉토리가 아니기 때문임
3. 매핑
WEB-INF안에 있는 web.xml에 아래 내용 추가
<servlet>
<servlet-name>na</servlet-name>
<servlet-class>Nana</servlet-class> //실행할 서블릿코드
</servlet>
<servlet-mapping>
<servlet-name>na</servlet-name>
<url-pattern>/hello</url-pattern> //사용자에게 제공하고 있는 url
</servlet-mapping>
4. 톰캣 서버 다시 실행
5. http://localhost:8080/hello
실제 ROOT에 hello라는 파일이 있는 것은 아님
사용자가 이렇게 요청을 하면
요청을 받는 웹서버는 파일을 찾아봄
만약 ROOT에 해당 파일이 없으면
이 요청을 WAS에게 넘김
WAS가 자기 매핑정보에서 hello를 찾아서 거기에 맞는 서블릿코드를 실행함
system.out.println("hello servlet")은
사용자에게 출력하는 것이 아니라
서버 쪽에 있는 console에 출력하는 것이므로
제대로 작동한다면 웹 화면은 하얀 화면이 나와야함(클라이언트)
이때 톰캣서버(startup.bat)를 보면 hello servlet이 출력되어있음(서버 쪽 console)
6. 클라이언트에게 출력
자바에서는 콘솔출력을 배우지만
이제는 웹 출력을 할 수 있어야함
서버 쪽에서 클라이언트(분산되어있는 원격)에게 출력할 수 있는 도구가 필요함
그 도구가 바로 response임
'백 > Servlet,JSP(잠시 pause)' 카테고리의 다른 글
이클립스 IDE 준비하기 (0) | 2021.07.01 |
---|---|
컴파일, 클래스 생성, 실행, 출력(2) (0) | 2021.06.30 |
톰캣 startup.bat 바로꺼짐 해결 (0) | 2021.06.30 |
톰캣 (0) | 2021.06.24 |
웹서버프로그램과 서블릿의 관계 (0) | 2021.06.23 |