01. 서블릿과 JSP는 어디에 쓰는 물건이고
웹 서버는 어떤일을 하나요?
클라이언트는 서버에게 요청을 한다.
서버는 요청한 내용을 응답한다.
요청 : 요청에는 요청한것에 대한 이름과 주소 정보가 들어있다.
응답 : 클라이언트가 요청한 내용이 들어있다. 물론 서버가 못찻는 경우, 오류 메시지가 대신 들어간다.
클라이언트는 무엇을 하나?
웹 클라이언트는 사용자가 서버에 요청을 보낼수 있는 기능을 제공합니다.
요청을 보내고 난 다음, 서버가 보애농ㄴ 요청의 결과를 화면에 출력하는 일도 클라이언트의 역할이죠
사용자 : 사용자가 웹 페이지에 있는 링크를 클릭합니다.
브라우저 : 부라우저는 이를 요청으로 만들어 서버에 넘깁니다.
서버 : 서버는 요청한 페이지를 열심히 찾습니다.
서버 : 서버는 응답을 만든다음, 이를 브라우저로 내려 보냅니다.
브라우저 : 브라우저느는 전달받은 HTML을 사용자가 볼수 있도록 화면에 출력합니다.
HTTP 프로토콜 , 넌 누구냐!
HTTP는 TCP/IP위에 들아갑니다. TCP는 한쪽 노드에서 다른 쪽 노드로 파일을 보내는 녀석입니다. 물론 여러개로 잘라서 보낼수도 있지요. IP는 한 호스트에 목적지 호수트까지 패킷을 옮기고 이동하기 위한 기반 프로토콜이라고 할수 있죠 HTTP는 이와 별개로 웹에서만 사용하는 프로토콜입니다. HTTP는 TCP/IP 기반으로 하여, TCP/IP를 이용해서 한지점에서 다른지점으로 요청과 응답을 전송합니다. HTTP의 구조는 요청/응답의 끊임없는 주고 받음 이라고 할수 있습니다. 클라이언트는 요청하고서버는 여기에 응답한다는 말이 적절하겠네요
요청의 주요 구성요소 :
HTTP 메소드(실행할 액션을 말합니다.)
접근하고자 하는 페이지(URL)
폼 파라미터(메소드의 매개변수와 비슷한 놈)
응답의 주요 구서용소 :
상태코드(요청이 성고했는지 아닌지 등)
컨텐츠 타입(턱슽, 그림, HTML 등)
컨텐츠(HTML 코드, 이미지등)
HTML은사실 HTTP 응답의 일부분 입니다.
HTTP응답안에 HTML이 들어있습니다. HTTP 응답에는 HTML뿐만아니라 헤더정보라는 것도 들어있죠 브라우저는 헤더 정보를 가지고 컨텐츠를 어떻게 화면에 보여줄지에 대한 힌트를 얻습니다. 어쨋든 HTTP 응답안에 HTML컨텐츠가 데이터로 포함되 있다 생가갛면 됩니다.
내가 서버라면, 요청에 들어있는 정보중 어떤것이 궁금할까요?
제일먼자 알고싶은것은 아마 HTTP 메소드가 무엇인지 아닐까요? 메소드라고 해서 자바 메소드를 말하는 것이 아닙니다. HTTP 메소드는 그 이름만으로도 이것이 어떤 놈인지 함께 들어올 정보가 어떻게 포맷되어있는지 알수 있습니다. HTTP 프로토콜에는 메소드가 여럿 있는데 그중 가장많이 사용하는 것이 GET, POST 입니다.
GET : 사용자가 링크를 클릭합니다. -> 브라우저는 서버에 HTTP GET 요청을 보냅니다.
POST : 폼에 정보를 입력하고 서밋 버튼을 쿨릭합니다. -> 브라우저는 HTTP POST 요청을 보냅니다.
단순한 요청은 GET/ 사용자가 입력한 정보를 함께 보내려면 POST
GET은 HTTP 메소드중 가장 단순한 것이빈다. 하는 일은 단순히 서버에게 자원을 요청하는 것 뿐이죠 여기서 말하는 자원이란 HTTP 페이지, JPEG 이미지 PDF 문서등을 말합니다. GET의 핵심은 서버로 부터 뭔가를 돌려 받는다라는 것입니다.
POST는 좀더 강력한 녀석입니다. GET++정도? POST는 서버에게 자원을 요청할때 필요한 정보를 함께 넘겨 줍니다.
하지만 다음과 같은 이유 때문에 GET보다는 POST를 사용해야 하는 경우가 있습니다.
1. GET으로 보낼수 있는 글자수는 제한이 있습니다.(서버에 따라 좀 다르긴해도) 검색 입력 칸에 검색어를 끝도 없이 써 넣으면, 아마 GET이 작동하지 않을수도 있겠죠
2. GET의 데이터 전송방식은 브라우저 주소란에 기입하는 URL뒤에 붙이는 식입니다. 그러므로 중요한 데이터든 아니든 간에 화면에 다 보입니다. 그러니 패스워드 처럼 민감한 데이터는 GET로 보내지 않는것이 현명하겠죠
3. 위 두가지 이유로 해서 GET으로 전송하는 URL은 즐겨찾기에 등록할수 있지만, POST는 대부분 그렇지 못합니다. 부라우저에 따라 폼 서밋 결과를 즐겨찾기에 등록할수도 못할수도 있습니다.
GET을 해부해 봅시다.
URL에 추가되는 자원에 대한 경로와 파아미터는 요청라인을 구성하는 요소입니다.
POST도 해보해 봅시다.
POST를 만든 목적은 서버한테 복잡한 요청도 한번 해보려고 만들었겠죠. 예를들어 사용자가 자신의 정보를 폼에 입력하여 서버로 전송하면, 서버는 이 정보를 데이터베이스에 저장한다오 같은 시나리오를 예로 들을수 있겠네요 여기서 서버로 보내는 데이터를 메시지몸체 또는 짐이라고 부릅니다.
HTTP응답을 해부해봅시다. 그런데 MIME 타입이란 것은 무엇이죠?
바낻로 서버가 클라이언트로 보내는 응답에 대해 알아볼 시간이군요 HTTP응답은 간단히 헤더와 몸체로 구성되어있습니다. 헤더에는 사용된 프로토콜이 뭔지 보내준 요청이 성공했는지 몸체에 포함된 컨텐츠의 종류는 무엇인지 등이 들어 있고, 몸체는 HTML 과 같은 컨텐츠가 들어가있지요 바로 이 정보를 브라우저가 화면에 출력합니다.
content-type : text/html
Content-type의 값을 보통 MIME 타입이라고 부릅니다. MIME 타입이란 브아우저에게 지금 서버가 이러 이러한 데이터를 보내려고 합니다. 서버가 보내주는 MIME타입은 클라이언트가 보낸 요청의 헤더 중 Accept란에 기술되어있는 겂과 관련 있습니다.
URL을 ‘얼’이라고 발음하지 마세요 ‘유알엘’ 입니다.
URL(Uniform Resoure Locators) : 웹상에 있는 모든 자원은 자신만의 고유한 이름을 가집니다. 이 고유한 이름을 부여하는 방식이 바로 URL 입니다.
http://www.wickedlysmart.com:80/beeradivice/select/beer1.html
웹서버는 정적인 페이지 서비스가 전공입니다.
정적인 페이지는 디렉토리에 있는 파일 그대로 입니다. 서버는 단지 파일을 찾아서 있는 그대로 클라이언트에게 넘겨줄 뿐이지요, 즉 모든 클라이언트가 동일한 결과를 보겠지요
페이지를 요청받으면, 우선 그걸 찾고, 다음 이를 전해준다. 물론 헤더정보를 조금 붙여 보내지만, 그게 다 전부..
웹서버 혼자서 할수 없는 두가지
1. 동적인 컨텐츠 생성
웹서버는 단지 정정 페이지만 제공할뿐입니다. 그러나 도우미 애플리케이션이 웹 서버와 협력해서 동적인, 실시간으로 작성한 페이지를 제공할수있습니다. 동적인 페이지는 이미지 디렉토리에 임의ㅇ로 그림을 하나골라 제공하는 페이지와 같은 것을 말합니다.
2. 서버상에 데이터 저장하기
사용자가 폼에 데이터를 입력하고 전송 버튼을 꾹 누릅니다. 우베서버는 폼 데이터를 받고서는 깊은 고민에 빠집니다. “그래서 나보고 어떻하라구, 나중에 쓸려면, 파일에든 아니면 데이터베이스에든 저장해놓아야 할텐데, 언제 이걸다 응답페이지를 만들지. 이거참” 이경우 웹서버는 자신을 도와줄 애플리케이션에게 SOS 요청을 합니다. 웹 서버는 파라미터를 애플리케이션에 넘겨주고, 응답하도록 부탁합니다.
도우미 애플리케이션을 CGI프로그램이라고 부릅니다.
1. 사용자는 정적인 페이지가 아닌 CGI프로그램에 대한 URL을 클릭합니다.
2. 웹서버는 들어온 요청이 도우미 프로그램을 호출하는 것임을 간파하고는 해당 프로그램을 실행합니다. 물론 GET 또는 POST로 넘어온 파라미터를 그대로 이 프로그램으로 넘겨 주겠지요.
3. 도우미 프로그램은 현재 시간이 들어가 ㄴ페이지를 만들어 서버에 HTML 형식으로 넘겨줍니다. 이시점에서 웹서버가 도우미 프로그램으로부터 받은 페이지는 정작인 페이지 입니다.
4. 도우미 프로그램은 장사를 끝내고 셔터문을 내립니다. 클리이언트는 정적인 페이지가 된 HTML페이지를 섭로 부터 받습니다.
서블릿의 신비를 벗겨봅시다(작성, 배포, 실행)
1.디렉토리를 만듭니다.
Project-> src(Ch1Servlet.java), classes, etc(web.xml)
2. Chservlet.java 파일을 src 디렉토리 밑에 만듭니다.
3. web.xml 이라는 배포서슬자(DD Depoloyment Descriptor)를 작성하여 etc 디렉토리 밑에 두세요
4. 톰켓 디렉토리에 디렉토리 구조를 만듭니다.
tomcat->webapps-> ch1->WEB-INF(web.xml)->classes(Ch1Servlet.class)
5. projetct1 디렉토리로 가서, 다음 명령으로 서블릿을 컴파일 한다.
%javac -classpath /your path/tomcat/common/lib/servlet-api.jar -d classes src/Ch1Servlet.java
6. Ch1Servlet.class 파일을 WEB-INF/classes 디렉토리로 복사하세요, 그다음 web.xml 파일을 WEB-INF 디렉토리에 복사하세요.
7. 톰켓 디렉토리에서 톰켓을 실행합니다.
%bin/startup.sh
8.브라우저를 하나띄워, 주소창에 아래 URL을 입력합니다.
http://localhost:8080/ch1/Serv1
9. 이제부터 서블릿 클래스를 수정하거나 배포 서술자를 고쳤을 경우 아래의 명령으로 톰캣을 중지시킨뒤 재시동하면 된다.
%bin/shutdown.sh
JSP는 HTML에 자바를 넣을수 없을까 라는 고민에 탄생했다네요
1. HTML 페이지 디자이너들은 대부분 자바를 모릅니다.
2. HTML 페이지를 자바 String 변수에 넣는것은 악몽입니다.
—————————————————————–핵심정리
HTTP는 하이터텍스트 전송 프로토콜의 약자입니다. HTTP는 웹에서 사용하는 네트워크 프로토콜이며 TCP/IP위에 돌아갑니다.
HTTP는 요청/응답 모델을 사용합니다. 즉 클라이언트는 HTTP Request를 보내고, 웹 서버는 HTTP Response 로 응답합니다. 그러면 브라우저는 내려 받은 컨텐츠 타입에 따라 문서를 출력합니다.
서버로부터 온 문서가 HTML이라면, 이 HTML 페이지는 HTTP 응답에 첨부되어 날아옵니다.
HTTP 요청에는 URL, HTTP 메소드, 파아미터 데이터가 들어있습니다.
HTTP 응답에는 상태코드, 컨텐츠 타입, 실제 컨텐츠가 들어있습니다.
GET메소드는 폼 데이터를 URL뒤에 추가합니다.
POST 메소드는 요청의 몸체에 폼 데이터를 포함합니다.
MIME 타입은 브라우저에게 ‘어던 종류의 데이터를 받을 겁니다”라는 정보를 미리 알려주어, 브라우저가 데이터를 어떻게 다룰지 준비하도록 합니다.
URL은 웹에 있는 모든 자원은 자신만의 고유한 주소를 가집니다. 제일 앞에는 프로토콜의 종류, 그다음은 서버이름, 포트번호, 자원이 있는 경로와 마지막으로 자원의 이름이 뒤따라 옵니다. 여기에 쿼리 스트링이 있다면 추가될수 있습니다. Get 메소드인경우.
웹서버는 정적인 페이지를 서비스하는데 최적화되어있습니다. 만약 동적인 페이지를 만들어야 한다면, 서버와 협업하여 이를처리할수 있는 도우미 애플리케이션(helper application)이 있어야 합니다. 자바 이외의 이런 프로그램을 CGI 라고 부릅니다. CGI는 Common Gateway Interface의 약자입니다.
HTML을 println() 안에 작성하는 방식은 컴파일 오류를 내기 쉬우며, 관리하고 쉽지 않습니다. JSP는 자바 안에다 HTML을 작성하는 방식이 아니라, HTML안에다 자바 코드를 작성하는 방식으로 이 문제를 해결합니다.