tier와 peer의 차이?
- peer : 물리적인 식별자를 가지고 있는공간
우리 PC도 각자 고유한 IP주소, 물리적 식별자를 가지고 있음.
[peer의 전제조건]
1)네트워크를 사용해야 함.
2) 동일한 프로토콜을 사용하는 상대방이 있어야 함.
3) 네트워크상의 동이 ㄹ프로토콜을 사용하는 두개의 식별자 중에서 한 쪽 끝단을 peer 라고 함.
==> 즉 네트워크 상에서 통신이 이루어지려면 최소 2개 이상의 peer가 있어야 함.
- tier :
요청에 대한 부담을 낮추기 위해 tier를 쪼갬.
web에서 request를 발생시키면
ewb server
요청을 받았으면 response 해야 함
양 끝단에 있는데, 하나의 네트워크
+ 2 tier 구조
요청이 많아지면 어려움. 쪼개야 함.
차수를 올림
정적인 콘텐츠를 요청하는것 :정적요청 (이미지,동영상파일 등)
현재 서버의 시간이 몇시인지? : 고정될 수 없는 요청.
역할에 따라서 쪼개게 되는.
==> 웹 서버 : 정적인 요청만 담당하게 쪼갬.
req 오면 이게 내가 감당할 수 있는 요청인지 검증. 가능하면 처리.
그런데 아닌 경우, 즉 동적인 요청의 경우. application을 동작시킬 수 있는 server가 뒤에 있음.
web에서만 동작.
WAS.
요청자, 웹서버, WAS어플리케이션서버
3tier 구조가 됨.
그런데 DB를 내가 원하는 형태의 UI로 요청하면
1단계 DB가져와야
2단계 UI입혀야
3단계 UI입혀서 주어야
=>DB서버가 다시 쪼개진다고 하면,
-> 하나의 요청이 처리되는데 4tier구조가 됨.
- 그래서 실제 웹 상에서 처리되는 대부분의 서버들은 4tier구조를 가짐.
peer와 tier의 차이.
- 서버가 얼마나 분리가 되어있는지를 표현하기 위해서 사용하는 단어들임.
클라이언트 서버 시스템의 이해
----------------------------------------------
클라이언트의 눈에 보이는 부분 || 안보이는 부분
Frontend module backend module
html(markup language)
css(style sheet)
(정적 UI)
동적 인터페이스를 구현하기 위한 언어가 필요했음.
-> javascript
-> 효율적으로 사용하기 위해 JSP, bootstrap 등등 나옴
java
(우리가 계속 나오는게 자바라서 동작원리도 이해해야 함)
WAS가 사용하는 주언어는 java
관계형DB(mariaDB, Oracle, ...)
=>관계형 DB, Entity
(E/R)
SQL을 가지고 중간에서 대화 가능
사이에서 데이터 가져올 수 있게
변환하는게 ibatis
//
NodeJS를 쓰면 javascript로 backend
쓸수도있고 JAP같은거 쓰면
java로 front도 구성할 수 있기도 함
//
**이제 JAVA를 이용해서 개발 할 수 있는 환경을 구축하는 것도 필요함.
**network이나 web을 쓰지 않고 standalone app 개발.
-------------------------------------------------------
자바 : compiler필요
자바가 쉽다 : 갖다 쓸 수 있는 API가 많아서 활용이 용이하다는 뜻
API필요
bite code를 실행해 줄 Virtual Machine
==>이 세 가지가 있어야지 프로그램이 가능.
==jdk toolkit에 묶여있음
SE, Standard Edition은 Web 구성 위한게 없었음.
--------------------------------------------------------
어제의 미션을 봐보도록하자
---
package kr.or.ddit.web.dummy;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
System.out.println("Hello Servlet");
}
현재 컴파일러가 사용하는 위치에 참조해야 하는 것들이 없음.
* classPath
두개를 정해둠.
현재위치와,
%JAVA_HOME%\jre\lib\rt.jar 위치
근데 이 안에 있는건 IOException한개만 있음...
근데 이제 HttpServlet, HttpServletRequest, HttpServletResponse, ServletException, annotation은 없음.
import java.io.*
import javax.servlet.http.*
import javax.servlet.*
우리가 안 갖고 있는 (SE) API를 톰캣WAS에서 빌려다쓰자.
servlet-api.jar
우리(SE)가 안 가진 servlet이라는 스펙을 가진 jar
-----------------------------------------
톰캣 설치도 다시 짚어보자
우리는 수업시간에
먼저 Servlet Spec
다음에 JSP Spec
나중에 EL Spec 도 확인해야 함
major version 이 버전없 된 건 : 크게 바뀐
( . 앞)
minor version이 버전없 된 건 : 크게 바뀌진 않은
( . 뒤)
현재 우리나라에서는 아직 Servlet Spec 3점대를 사용함.
자바EE버전은 보통 SE버전보다 한 단계 낮음.
--------------------------------------------
설치한 후,
환경변수 설정 할 것
톰캣의 설치 위치를 CATALINA_HOME
라고 잡았는데, tomcat의 별칭이 catalina
tomcat 개발할 떄 엔진 이름이었음
우리가 찾아가던 것 처럼. "여기서부터" 라고 하는 위치를 classpath로 추가해 주는 것.
얘네는 standalone 형태로 동작을 안한다는 것. ==동작 위해서 위치를 바꿔주었거든..
==> servlet을 동작하기 위해서는 server가 필요하다.
== 다른 말로 container라고도 하는데, 이 소스는 container가 없으면 동작하지 않음. 왜?
1) Main Thread가 있으려면, main이라는 정확한 signature를 가지고 있는 메서드가 있어야 하는데 없음. 그래서 JVM이 명확하게 구동할 수 없는 것임.
** tomcat을 쓰는 이유
1) Tomcat이 가진 추가 api를 이용 위해서
2) tomcat을 이용해서 구동을 해야 하기 때문에
========================================
@@ 오늘 수업의 첫 번째 주제 : Tomcat
두 번째 : Servleet
세 번쨰 : web
- web이라는 공간을 명확하게 알고 이해해야 tomcat이 어떻게 동작하고 servlet이 왜 필요한 지 알 수 없음.
* 교재 타이틀에 Web이라고ㅓ 써있음./ web을 알아볼 것.
인터넷 : 물리적으로 존재하는 통신망 (like 한반도)
웹 : 논리적 공간( like 대한민국)
한반도 : 손에 만져지는 물리적인 객체
대한민국 : 추상적, 논리적인, 만져지지 않는
국가 성립 첫번째 조건. 언어. 국가 내 사용 독립적 언어.
web이라는 가상 공간에서 통용되는 언어 필요, 그 언어가 html
- web에는 최소 두개의 요소가 필요.
Client, Server
web : html로 표현되는 데이터를 주고받고 있는 공간.
주고 받을 때 패키지로묶어주는게 protocol.그걸 http로 사용
한 서버를 식별할 수 있는 식별자의 체계가 필요함
==>IP Address
==>IP v4, v6방식 두가지 있음.
1~255(8bit)가 4개의 섹터를 구성 : 32비트로 표현할 수 있는 자리수
=> IP v4방식으로는 2^32갯수만 표현가능
=>70억 인구가 최소 3개의 ip를 가질 수 있도록 만든 게 IPV6버전. (v5버전 만들고 보니까 자리가 별로 안늘어서 v6만들고 v5폐기)
==> : 콜론으로 구성. 8자리. f까지 간. 16진수체계
==> 한 섹터에 16진수 4개 들어감.
4bit * 16개...
16bit가 8개가 모임...128bit...
v6방식은, 2^128개.
근데 여기서 a class, b class... 식으로 쪼개면 무한대로 쪼개기 가능
지금은 넘어가는 과도기라 v4, v6같이사용중.
- 대화를 위해서는 물리적 peer의 주소를 알아야 대화가능. 이게 ip address
- port라는 번호도 있음. 이건 무슨 역할?
두개의 티어가 한 티어 안에 존재... W.S. 와D.B. 하나의 ip address를 둘이 갖고 있음... 그러면 ip만으로는 식별 불가능해서, 논리적 주소로 갖는게 port임. ( :8080 )
오라클 포트넘버( :1521)등
이 ip내에서 하나의 단말 안에서는 db서버도 tomcat 서버도 있어서, 한 ip 주소 안에 있는 여러개의 서버를 논리적으로 식별 위해서 0~65535까지 존재하는 port 넘버가 생김. 64bit
0~1023포트 : well-known port라고 함. 이미 정의하고 있는 server들, protocol들이 있음.
가용 포트넘버를 쓴다고 하면 10
24번 이후 사용했었음well-known 포트넘버를 비껴가기 위한 것
-서버는 24시간 늘 요청이 들어오는지 감시하고 있어야 함 (listening)
- client가 들어올 수 있는 문이 근데 65535개 있음.
- 몇 번째 문을 listening 할 지 먼저 정해주어야
( 톰캣 설치할 때 포트넘버 설정)
- 우리가 만들 요청을 통해서 클라이언트의 요청을 감시함.
============================
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81
bin : binary -- 2진법 batch 파일
리눅스계열 (sh)
윈도우계열 (bat)(shutdown.bat, startup.bat / 서버 끄고 키는 것)
conf : configuration 설정파일. --대부분이 xml파일.
: 왜 xml파일로 만들까?
--> 시스템에 상관없이 공통적으로 파일을 이용하기 위함 (범용성)
--> 요즘은 json으로 만들기도 함.
==>xml과 json의 사용목적이 같다는것을 알 수 있음.
webapps
(WAS, MS, SC)
========================
---
C:\Windows\System32\cmd.exe
---이 위치에서
startup.bat 실행
==>tomcat 콘솔창 켜짐
-? 에러가 난다? cmd창에서 다시
catalina.bat run
으로 하면
콘솔창이 안바뀌고 실행됨
##
오호
톰캣도 자바로 만들어놔서 톰캣이랑 자바랑 버전이 안맞으면 실행이 안됨.
===========================
콘솔창에 에러가 있는지 없는지 우선 확인.
대ㅜ분 에러가 떠..있어요..?....
(
.initInternal Failed to initialize connector [Connector[HTTP/1.1-8080]]
)
==>8080포트넘버에 문제가 생겨서 에러가 났다고 함
netstat -ano
명령어를 통해서 어떤 포트번호가 어떻게 사용되는지 보여줌
( | ==pipeline문자라고 함, 하나의 콘솔 안에 여러개의 명령을 엮을 떄)
netstat -ano | findstr "8080"
명령 실행
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\bin>netstat -ano | findstr "8080"
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 3580
TCP [::]:8080 [::]:0 LISTENING 3580
현재 점유되어있음. 3580에게
=> 작업관리자에서 세부정보의 PID(Process ID) 보면 됨
=> TNSLSNR.EXE
(TNS listener : 오라클임)
==> 톰캣을 구동시키려면 포트번호를 바꿔야함
------------------------------------
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\bin>netstat -ano | findstr "18080"
180180검색해봣는데 안나온다? => 할당이 안된 사용해도 되는거인거지
==> server.xml파일에서 포트번호 바꿔줌.
crtl+c는 cmd에서 취소키임.
바꾸니까 에러가 없죠
------------------
크롬에서
http://127.0.0.1/
이 어드레스는 다시 돌아서 나에게 오는 address
;oopback address
IPv4 주소 : 127.0.0.1
IPv6주소 : 0:0:0:0:0:0:0:1
=> 축약형 == 0::1
domain name =localhost
http://localhost:18080/
w정상적으로 서버 도는거..
http://물리적주소(IP, 도메인네임):논리주소(port)/자원의경로
정상적인 GarbageCollection 처리가 되려면shutdown 처리가 잘 되어야 server가 꺼짐.
bin 폴더에서
shutdown.bat 해야 함.
- 톰캣을 설치한 첫번째 이유, 80번포트를 우리를대신해서 감시하라고
- 톰캣 welcome page ( D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps\ROOT의 index.jsp)
//자원의 주소를 생략해도 볼 수 있는것 == welcomepage
--------------------------------------
웹 리소스
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps\ROOT\bg-nav.png
네트워크 클라이언트가 이렇게 접근할 수는 없으니까, localhost라는 가상의 주소를 준 것
http://localhost/bg-nav.png 이렇게 접근.
- 원래 어떤 자원을요청할 떄, 자원의 이름을 생략할 수 있는 경우는 웰컴페이지 등 몇개 안되죠.
webapps에 context가 다섯개임.
ROOT는 최상위..폴더라서 이름 생략 가능
이 파일의 경로는
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps\docs\index.html
이건데, 클라이언트가 이렇게 접근 안 되니까. http://localhost/docs/index.html
로 일단 바꿔줌.
url이라는 논리주소체계에서는 경로 구분에 / 이용.
http://localhost/docs/index.html
이렇게 하면 접근 가능.
localhost라는 논리주소체계는. webapps라는 폴더가 가진 context까지만 접근할 수 있는 별칭인것. (일부영역만 공개)
document(doc) base / app base 라고 함
이 app base 이후에는 파일시스템의 주소체계가 그대로 보임
http://ip:port/depth....
(doc/root부터 시작하는 구조)
---------
docs라는 context의 ....index임. index 생략가능 (웰컴페이지라)
http://localhost/docs/
이 주소로 접근가능
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps\docs\api
이 폴더도 와 보니 index있네
http://localhost/docs/api/index.html
== http://localhost/docs/api/
---- 그러면 어딘가는 index가 뜨게 설정해주는데가 있을 것
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\conf
이 컨텍스트에 보게 되면 web.xml 파일에 제일 아래에
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
이렇게 설정되어있음.
우리가 그동안 만들었던 프로젝트들도 톰캣이라는 상위 어플리케이션 아래에 종속된 하위 어플리케이션. 같은 규칙을 가진다는 거지..
#과제1
클라이언트 입장에서 브라우저를 이용해
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps\examples\jsp\async
의 async3.jsp를 열어보자
http://localhost/examples/jsp/async/async3.jsp
==> 이런 식으로 일부 영역을 웹상에 공개하는 걸 publishing이라고 함.
>>오옼 request.getContextPath가 여기 webapps네
http://localhost/first/
우리는 이제 최초의 application을 하나 만듦. 다만 이건 정적자원임.
=================
<style type = "text/css">
이 type.. 이런게 MIME TEXT임 아주 중요함 내일 수업 주제중 하나임
=>정해진 용법이 있고, 그 용법을 통해 표현하는게 있음.
오 우리가 지금 소스를 수정하는동안, 서버를 재구동하지도, 컴파일 하지도 않았음.
특징의 하나임
클라이언트가 현재시간을 요청한다고 한다면 동적으로 정보를 받아야 하기에, html, css만으로 안 됨 javascript필요
이제span tag에 인쇄한다고 하면, 이 element가져와야함.
documnet.getElementById로 id를 기준으로 element를 가져오는건데, document를 사용해서 가져옴. 이걸
spanTag라는 변수명에 저장하고
이 spanTag의 값을 now변수에 담긴 날짜를html로 넣어줌.
바꿔줌
---------------------------
우리가 만든 모든 소스를 클라이언트가 볼 수 있다는건, 클라이언트 페이지가 다 만들고 있는 거임.
클라이언트가 보낸 요청에 대해서 F12개발자 툴에서network - response에 가서 보면, 이 소스를 그대로 가져와서 본 거임
==> 이걸 Frontend module이라고 함
여기에서 소스를 가져온거라서 date 객체에 의해 만들어 진 시간 객체는 client의 시간객체임.
server side background 언어는 java.
1)프로토콜을 받을 수 있어야 하고..
2)클라이언트가 보낸 요청을 받을 수 있어야 함
3)요청을 받았으면 다시 해당 클라이언트한테 답을 반환 해 줄 수 있어야 함.
자바로 만들어야 하는 건 html인데
http라는 프로토콜을 받고 또 요청을 받아서 web으로.. 보내 줄 수 있는.. .. 그런 객체를 servlet이라고 부름
//
D:\B_Util\5.ApacheTomcat\apache-tomcat-8.5.81\webapps
이거 docbase하고 함.
//
context마다 WEB-INF 폴더는 다 가지고 있음.
약속이 된 거라는거지,
-----
이걸 만들어 보자 근데
http://localhost/first/WEB-INF/inner.html
안나와
404. 서버는 도는데, 찾을 수 없다고 나옴.
WEB-INF는 보안폴더임. 이 영역은 외부에서 접근 못하게 막아두는 거임.
clsspath는 그래서 이 WEB-INF에 들어있음
(web-information 폴더)
WEB-INF
안에 html파일이 없어. 하나도 정적인 파일. 서비스가 안 됨.
jsp폴더도 있음.
=> 보호되고 있는 jsp 파일들. 이 jsp들이 동작하려면 적어도 model2로 되어야 함. model1으로 동작 안 함.
classes 폴더
하나의 context가 독립적으로 사용하고 있는 class들
이 classes 폴더 안에 폴더가 있다면 base package 라는거지
개발순서를 생각해보면, servlet 소스를 src폴더에 만들고, 컴파일 된 폴더들은 classes폴더에 만들어 져야 하고,
앞으로 그러면 -d. 라는 폴더의 위치는 이 classes폴더여야 하는거지
--
한칸 위로
cd..
metadata-complete="true">
이 값이 true면 annotation이 제 기능을 못 함
---------
서버사이드 개발자들은, req, res를 잘 가지고 놀 수 있으면 하나의 백 어플리케이션을 만들 수 있음.
요청을 분석하는 작업이 50%. 나머지 50%작업인 응답을 생성할 수 있음. 잘 분석해야지만.
System.out.println("Hello Servlet");
이건 서버의 시스템. 클라이언트쪽이 아니라 서버쪽에 출력이 되어서, 클라이언트는 이 텍스트의 존재를 모름.
클라이언트가 확인할 수 있는 종류로 바꿔보자.
스트림은 크게 두 가지가 있음. 문자단위와 byte단위.
-->
지금 우리가 받아온 건 2byte단위의 문자스트림임.
기록해야 하는 단위라 String이라서 char 스트림이 필요했음
System.out.println의 out도 2byte 스트림임
.
###### 다음주 화요일 io보강.
----------
과제
qualified name은 상관없고...
클라이언트가
/first/today/now.do 형태의 주소를 사용했을 때, 현재 서버의 시간을 알 수 있는 servlet을 하나 만들고 이 sevlet으로 서비스를 제공해보자.
kr.or.ddit.web.TimeServlet 이라는 이름으로 해보자
set classpath 환경변수 확인하는 명령문
환경변수 설정할 때 %% 쓰지 않음..
----------------------
javac -d ..\classes TimeServlet.java
http://localhost/first/WEB_INF/classes/kr/or/ddit/web/TimeServlet.java
-----------------------
servlet spec의 동작구조를 디테일하게 뜯어 볼 텐데,
지금 annotation 사용해서 하는건 servlet 3.0에서만 사용가능. 내일은 2.5방식으로 수업을 해본다고 함.
더 어려움
오늘까지 수업내용이 정리가 되어 잇으면 따라올 수 있음
MIME 이라는게 어떤 데이터를 표현, 의미하는지, 이것으로 무엇을 할 수 있는지.
지금까지는 단순하게 문자열 서비스만 햇는데
streaming service를 해보자. 동영상을 해보자.
그 때 가장 필요한게 MIME이라는 구조임.
디테일하게 말하는 이유는, 한번쯤은 검색해보라고.
##
오늘 미션.
now.servlet 이거는 지금 현재시간만 서비스하고있죠.
클라이언트 시간과, 서버 시간이 다 표시되도록 하기
타이틀을 하나 주고
welcome first app
client now : asdfd
server now : adsfasf
써야 하는 언어가 몇가지?
java 서버시간 잡을 떄
javascript 클라이언트 시간 잡을 떄
html UI구성할 떄
css 디자인할때
결과물 완성 되었을 때, 각각의 언어가 어떤 위치에서 작동하는지를 확인해 보면, frontend와 backend가 확연히 구분 될 거라고 함.
--tomcat콘솔......은 상대경로 허용안함