Servlet
1. 학습 안내
Servlet jsp 기본적으로 jdk, jdbc를 이용한다.
자바 웹 개발 이다.
서블릿에 자바를 얹으면 웹프로그램이 나온다.
그러나 비효율적이다. html코드 출력문제 발생하는데 이를 해결하기 위해 나온게 jsp 간단하게 만드는 도구이다.
멋진프로그램빠르게 하지만 여기서도 스파게티 코드문제생긴다.
코드정리해서 jsp mvc로 정리하게 된다. 이후에 spring mvc를 만든다.
2. 웹서버 프로그램이란?
과거에는 서버프로그램이라는게 없엇다. 사용자가 요청하고 db쿼리에서 한후 사용자에게 보여준다.
시대가 지나면서 이제는 클라이언트 - 서버 - db 로 나뉘어지고 원격에서 소통하고자한다.
실시간으로 전달하기 위해서 네트워크를 사용한다.
과거에는 프로그램을 만들때 두가지가 다 동일한 언어였는데 불편함이 생겨났다.
두개가 동기화 되는데 한쪽이 업데이트되면 한쪽도 업데이트 되서 둘다 바꾸어야햇다.
클라이언트가 많으면 서버는 하나니 여러번 업데이트를 해야한다.
설치 재설치 등을 반복하는 과정이엇는데 이 부담과 다른 프로그램에도 영향을 미치게 되었다.
이 부담감을 줄이기 위해 웹이라는 것을 이용하게 되었다.
소켓을 이용해서 데이터를 주고받게됫다. 그런데 이 소켓도 맨땅으로 사용하면 부담된다.
데이터를 포맷하고 전달하고 일을 하게되엇다. 이것도 불편해서 rpc등이 생겻다.
데이터 전송 구현의 어려움, 클라이언트 프로그램 업데이트의 어려움등으로 인해 HTTP웹을 사용하게 되엇다.
브라우저가 있고 이 브라우저가 어떤것을 요청할 수 잇고 웹서버에서 요청에 대한 응답을 보낼수있엇다.
웹프로그램을 이용해서 클라이언트가 필요로하는 것을 만들 수 있게 되었다.
약간만 변경하면 웹프로그램을 이용하여 클라이언트와 서버프로그램을 만들 수 있다는 생각이 들게 되었다.
웹은 페이지 만들고 페이지를 요청하는 거엿다. 이런것이 우리가 생각하는 윈도우의 페이지와 다른게 없엇다.
서버에선 db연결이 필요하다. 미리 만들어진데에 담을수잇는데 좀 더 동적으로 전달할 수잇도록 환경을 추가하게 되엇다.
서버에는 동적으로 만들수잇는 간단하게 얹을수잇는 환경을 만들고 문서가 동적으로 사용자 목록을 만들어줄수 잇게 되엇다.
문서를 요청할때 사용자의 요청으로 동적으로 만들어지고 그저 문서로 전달되기 때문에 브라우저만있으면되고 특별히 클라이언트 프로그램 재설치할필요가 없다.
이런식으로 서버와 클라이언트가 나뉘어지게 되면서 서버프로그램만 만들면되게 되었다.
브라우저에 전달하고 브라우저가 보여주게 하면된다.
js가 등장하면서 브라우저 단에다가 과거 윈도우 프로그램을 만드는 것이다.
백엔드를 만들때 추가적으로 가지고 잇어야하는 실행환경이 필요하다.
3. 웹 서버 프로그램과 Servlet
웹서버와 서블릿의 관계를 알아보자.
과거방식으로 목록을 주면 요청이 들어왓으니 홈디렉토리에 있는지 찾아보고 웹문서를 돌려준다.
이 웹문서를 그냥 돌려주면되는데 회원에 대한 목록이 문서로 미리 만들어지는게 불가능하다.
이 목록을 만들기 위한 코드가 서버에 있게 되는 것이다.
웹서버는 이 코드를 찾았으면 이걸 실행해서 db에서 목록을 문서화해서 보여줘야한다.
이 코드를 실행할수 있는 추가적인 환경이 필요하다.
동적인 문서를 요구한다면 이 코드를 실행할 수 있는 것이 필요한데 이것이 WAS이다.
이런 웹어플리케이션 서버가 추가적으로 설치가 필요하다.
코드가 실행되서 이 실행결과를 다시 웹서버에 돌려주게 되는 것으로 cs프로그램을 만들게 된다.
이것을 Server App(서버 어플리케이션)이라고 한다. 이걸 실행할 수있는 환경 WAS이 필요하게 된다.
즉 실행환경 Web Server & WAS(Web Application Server), was에서 활용하는 Server App이 필요하게 된다.
이것들이 웹 어플리케이션을 만드는 구성이 된다.
servlet이라고 명칭하는 이유는 정확히 정의되어 있지는 않다.
클라이언트가 list reg edit del요청하는데 서버에는 그럴때마다 해결할수잇는 코드가 있다.
서버는 요청에 따라 파편화된 것이 실행되고 종료되면 끝난다.
조각난 서버어플리케이션을 의미하는 것같다. Server Application Let이라 servlet이다.
4. tomcat 9 설치하기
톰캣다운 - bin에
startip.bat파일
환경변수 javahome등록되어있는지?
http://localhost:8080/
고양이나오면 정상적으로 동작 중인 것이다.
5. tomcat 9 웹문서 추가해보기
웹서버란 웹문서를 제공하는 서비스이다.
톰캣을 웹문서를 제공하는 역할로 사용해보자.
문서를 보관하고 있는 홈 디렉토리에 txt문서를 둬보자.
이걸원격에서 달라고 할것이다.
localhost:8080/nana.txt
아이피:8080/nana.txt
톰캣 설치한곳 - wepapps - root 여기가 홈디렉토리이다.
http://localhost:8080/
하면 index.jsp를 불러오게 된다.
그래서 http://localhost:8080/nana.txt하면
홈디렉토리에서 nana.txt를 불러오게 된다.
UTF-8하면 글씨깨진다. ANSI로 인코딩하면 안깨진다.
웹서버는 예약된 특정폴더가잇고 문서를 저장하고 다른 원격의 컴퓨터의 브라우저를 통해 서버의 주소와 리소스를 입력하고 이것을 돌려받는 것이구나 라는 것을 알게되엇다.
공인 ip라면 전세계에서 접속이 가능하다.
6. Context 사이트 추가하기
Context는 규모가 커지고 파일수가 많아지고 디렉토리가 많아질 것이다.
네이버를 보면 클릭하다보면 아주 많은 디렉토리에 많은 사람들이 분업을해서 만들어 놓앗다. 폴더에 폴더로 나누어서 각자 만들면 헷갈려짐
문맥은 유지하면서 나눠서 만드는게 어떨까? 그렇게 해야한다.
맡고있는 한 블럭을 떼버리고 한쪽에선 중심(문맥)과 관련되거만 만드는것이다.
다른데선 문맥을 유지하며 각각의 내용만 만드는 거다. 완전 별개의 사이트 인것처럼 만드는것이다.
가상경로 등으로 부르는데 Context Name/academy
물리적으로는 두개의 사이트인데 합쳐서 마치 루트 디렉토리에 들어가는 것처럼 서비스하는 것이다.
이게바로 context사이트이다.
홈디렉토리가 두개가 되는 것이다. 돌아가는건 마치 하나에서 돌아가는 것처럼 하는 것임.
it/news.txt 라는것을 만들었다고 해보자 그런데 이것을 다른 곳에서 작업하고 싶다.
ITWeb이라는 폴더를 새로 만들어서 만들면 기존 ROOT와 다른 페이지가 되는 것이다.
완전히 다른 데에 가져다 두어도 된다.
그러나 주소체계에서 하위폴더에 잇는거처럼 보이게 하고싶다.
톰캣 - conf파일 - server.xml 잘못건들면안되니 복사해놓고 사용
편집들어가서 쭉내리다가
라써저잇는데 밑에 써주기
<Context path = "가상루트" docBase="실제파일위치" privileged="true/">
<Context path = "it" docBase="F:\study\Tools\apache-tomcat-9.0.70\webapps\ITWeb" privileged="true"/>규모가 크면 이렇게 Context를 사용한다.
톰캣 버전이 올라가면서 서버를 껏다켜서 이것을 지양해달라 한다.
어플리케이션에다가 메타인포에다가 따로 context를 마련할 수 있다.
나중에 만들때 추가한다. 어쨋든 개념은 이렇다는 것을 알아두자.
7. 처음으로 서블릿 프로그램 만들어보기
서버어플리케이션을 만드는것이다.
서버 어플리케이션은 기능별로 코드가 나눠져잇고 기능마다 코드가 실행될수잇도록 선택적으로 사용하는 것이다.
필요에 따라 할수잇도록 다 조각나잇다. 왜냐하면 웹이라는 환경을 통해 이 프로그램을 실행해야하기 때문이다.
get list하면 list페이지만 get reg하면 reg페이지만 주면된다.
그래서 한번에 만들 필요없이 필요한거 하나씩 하나씩 만들면된다. service()라는 함수를 이용해서 만든다.
그럼 어떻게 만드나? 자바콘솔어플은 메인함수로 만들었는데
service()함수로 만든다고 생각하면된다. 나머지는 비슷한데 웹 출력과 입력을 받기위한 도구만 추가된다.
public class ??? {
public void???(){
system.out.println("hello Servlet");
}}클래스이름
클래스는 was에서 실행하고 로드된다.
was는 클래스명은 관심없고 extends HttpServlet이 추상클래스를 사용해야한다.
was가 HttpServlet를 호출하는데 서비스 함수를 부를 수있게 된다. 이것을 부르게 할 수잇다.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Nana extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
System.out.println("hello Servlet");
}
}이런식으로 만들고 기능별로 서블릿을 만들면된다.
맨땅에서 서블릿을 만들어보자. 방법을 알고 편하게 만드는 것을 알면 더 쉬울것이다.
메모방에 직접 쳐서 저장해보자.
txt파일에 작성후 Nana.java로저장하고 cmd에서 이것을 컴파일해야한다.
그런데 HttpServlet lib가 없어서 오류가난다.
cmd창에 javac을 검색해주면 이 셋중에 하나를 사용해서 라이브러리가 있는 것을 이용해서 해야한다.
--class-path , -classpath , -cp
그럼 서블릿 라이브러리는 톰캣다운로드 받은 곳에 잇다.
javac -cp F:\study\Tools\apache-tomcat-9.0.70\lib\servlet-api.jar Nana.java
.class 파일 생긴다. 실행은 다음시간에
8. 서블릿 객체 생성과 실행 방법
이 클래스 파일을 어디에 두어야하나?
ROOT\WEB-INF\classes\여기에 둬야한다.
서블릿을 이잇을때 패키지가 잇엇다면 패키지 명으로 또 디렉토리를 만들어야한다.
그냥 이 디렉토리를 달라고 해서 열리면? 안된다.
사용자가 요청해서 class파일을 주면안되고 서버에서만 사용할 수잇어야한다.
홈디렉토리의 WEB-INF은 특별하다. 이 안은 사용자가 절대 요청할 수 없다.
모든 자원들은 특수한일로 서버에서만 사용한다.
그래서 두고 비공개로 특별한 방법으로 요청하게 해야한다.
그럼 사용자가 이것을 요청하려면? 어떻게 해야하나?
일단 실행은 웹에서만 할테니 사용자가 필요한 URL 과 매핑된 서블릿 코드를 찾아서 실행하게 한다.
사용자는 다른 인포로 줄수잇도록 해야한다.
사용자에게 제공되는 서블릿 이름으로 요청하게 된다.
예를들어서 localhost/hello
요청에 해당되는 서블릿을 찾아서 열어준다.
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>
</servlet-mapping>url을 매핑하는 것이다. 스프링때 많이 사용했던게 기억난다.
서버 콘솔에 출력되게 된다.
이제는 웹출력을 할 수 있게 바꾸고 싶다.
9. 서블릿(Servlet) 문자열 출력
서블릿 = 자바 웹(콘솔 -윈도우) 프로그래밍이다.
웹 = 결국은 입출력이 웹으로 바뀌는거고 원격으로 데이터를 보내는 형태라고 볼 수 있다.
기존에 입력과 출력이 다르니 잘알아둬야한다 -> 18장 데이터입출력 스트림사용하는것이다.
바이너리가 아니라 문자열을 출력하는데 더 편하게 사용하기 위한 보조 스트림 PrintStream을 사용해보자.
그런데 웹은 버퍼가 꽉차야 보내진다. 기다리지말고 바로 flush해달라 두번째인자에 true넣으면된다.
OutputStream os = response.getOutputStream();
PrintStream out = new PrintStream(os, true);
out.println("hello servlet!!");
PrintWriter out = response.getWriter();PrintStream을 제공하는 게터가 따로 있으니 이것을 그냥 사용하면 짧아진다.
소스코드 고치기 컴파일다시하기 배포다시하기 서버 다시실행 등등 매우 불편하다.
->이걸 쉽게 개발 수정하는것이 IDE이고 내가 사용할 것이 이클립스이다.
10. 웹 개발을 위한 이클립스 IDE 준비하기
이클립스가 실행 컴파일 배포 등등을 해준다.
이 도구가 정보를 보고 내 프로젝트에 도움을 주게 해야한다.
new project dynamic web project로 만들어야한다.
톰캣과 연결 톰캣버전선택후 디렉토리를 다운받았던거로 해야한다.
클래스를 만들때는 Java Resources파일에 만들어주면된다.
패키지를 만들거나 클래스를 만드는 것은 원래 하던 것과 같다.
만들면 자동으로 root로 들어가게 된다.
11. 이클립스를 이용한 서블릿 프로그래밍
실험하기
index.html 만들고 실행
http://localhost:8080/JSPPrj/index.html (http://localhost:8080/JSPPrj/index.html)
얘를 루트로 사용할건데 context이름을 가지고 나옴.
root는 context사용하지 않는게 좋다.
그래서 프로젝트이름 - 속성 - web project settings - context root 를 /로변경하면 얘가 root가 되는거임.
http://localhost:8080/index.html로 (http://localhost:8080/index.html) 바뀜
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>
</servlet-mapping>12. 어노테이션을 이용한 URL 매핑
서블릿 3.0 이상부터 사용가능해짐. web.xml가서 귀찮게 설정할필요가 없다.
하지만 설정을 해줘야한다.
web.xml로가면
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">여기가 true라면 모든게 web.xml에 설정이 있다는 뜻임. 이것을 false로 만들어줘야 어노테이션을 설정한것을 사용할 수있다.
매핑부분을 지우고 실행하면? 404에러가 발생한다.
@WebServlet("/hello") 클래스이름위에 작성해주기 어노테이션사용해보자
코딩량이 줄어서도 좋고 다른문제는 여럿이어 만드는데
각자 부여받은 프로그램이 엉켜있는 것보다 각자 만들어서 깔끔하게 하는게 좋다.
만약 따로만들면 web.xml에 각각 모든사람이 여기에 손대면서 설정해줘야한다. 너무 말이안된다.
어노테이션을 사용하면 각자 분업화된걸 넣을 수잇으니 협업이 훨씬 쉬워진다.
2023.03.14 후기
서블릿 다시 시작
'기초단계 > JSP&Servlet' 카테고리의 다른 글
| 2023.03.18 Servlet (0) | 2023.03.19 |
|---|---|
| 2023.03.15 Servlet (1) | 2023.03.15 |
| 2023.01.06 JSP & Servlet (0) | 2023.01.07 |
| 2023.01.04 JSP & Servlet (0) | 2023.01.05 |
| 2023.01.03 JSP & Servlet (1) | 2023.01.03 |