WEB Application

2020/08/26 웹 프로그래밍 기초

Tech Signal 2020. 8. 26. 19:06

애플리케이션 개발 순서: 설계 -> 개발 -> 테스트 -> 배포(포장해서 사용자들에게 나눠주는 것)

요리 주문(요구사항 분석) - 재료 준비 (db의 raw data) - 레시피(로직)대로 가공해 information으로 만듦 -요리를 보냄

웹프로그래밍: 클라이언트 사이드 모듈 / 서버 사이드 모듈 두개가 한 공간에서 유기적으로 돌아가게 하는 것

 

 

Application(context): 명령어의 집합. e.g. was는 자기 컨텍스트에서 그 요청에 답할수있는 컨텍스트를 찾음. 클라이언트가 응답 받아서 브라우저로 렌더링함

JSP: 새로운 언어가 아니다. J stands for JAVA

sql과 용어 비슷

!!제일 중요!!

처음 세개는 real time(실시간 처리)하고 배치 프로그램은 일괄처리. 

일괄 처리 예시: 네이버에서 탈퇴할 때 나의 회원정보가 탈퇴 일주일 후에 삭제되는 것. 

하지만 일괄처리/ 실시간 처리 애들이 서로 영향을 주면 안됨. 절대로 별개여야함

=> 멀티 쓰레드

 

또 중요한 것. 일괄 처리할 때 만약 일주일이면 그 시간을 재야함. time check를 해줄 수 있는 것 필요

=> 스케줄러

 

 

테스트 계속 해도 100퍼센트 테스트란 없다. like 살충제 패러독스

그렇기 때문에 그냥 테스트의 수준, 테스트 시나리오만 세워놓고 test해야함.

 


WEB: 논리적인 의미의 공간

인터넷(International Network): 웹을 실제로 구현한 게 인터넷/ 클라이언트의 요청과 서버의 응답이 오고가는 매체

네트워크: 정보를 주고받기위한 물리적 매체/ data server and client

 

HTTP protocol

- 클라이언트가 요청하고 서버가 응답할 때 웹이 구현된 기술 방식을 사용해야함 ==> http protocol 사용 (하이퍼텍스트를 전송하기위한 프로토콜) / -> 즉, HTML(HyperText Markup Language)을 사용한다. 

 

- HTML은 클라이언트, 서버의 공통 언어체계이기도 하다.

 

- 광케이블로 주고받을수있는건 0 1 집합 뿐임 (data stream) => 전송규칙 (protocol 필요) 그 프로토콜 중 html 전송 제일 잘하는게 http

 

-지금까진 RMI 프로토콜로 정보를 전송했지만 이제는 HTTP 프로토콜을 쓸 거에요

 


정보 요청이나 응답 전송하려면 클라, 서버 서로 식별해야함. 네트워크의 peer들을 어케 식별할 것인가? :IP

 

IPv4: 최대값 255씩 4섹터 -> 2의8승(8비트 ) * 4 = 32bit/ 2의 32제곱..

Ipv6: 영어f까지만있음 16진수 = 16진수는 4비트 필요..... -> 16* 8세트 = 128비트

 

근데 누가 네이버 ip 주소 외우고 다니냐 -> 걍 domain name

네이버라는 하나의 peer 식별하는 법: ip(for 기계) or Domain ( for 인간)

 

클라이언트 -> 한국의 모든 도메인네임은 KISA에서 관리. 도메인 네임 서버 (DNS) 에서 특정 도메인에 매핑되어있는 사이트 찾음 

 

NIC(network information centre) 나라마다 있음. 우리나라로는 KISA로 이름이바뀜 -> ICANN에서 관리(미국). 미국은 이런 정보를 관리하기 때문에 최강대국이다. + 우리나라에서 북한 사이트 못 들어감 - 그런 정보를 읽고 막는 게 미국임


<HTML/ JavaScript 비교>

html: 정적static (시계 구현 불가능) 

자바스크립트: 동적

 

BUT 자바스크립트 단점: 브라우저에서만 돌아간다. (due to 브라우저 엔진) 즉, 클라이언트가 실행한다) => 서버 사이드의 데이터를 가져올 수 없다.(=사용할수있는 데이터가 클라이언트 사이드로 한정되어있다.) -> 서버사이드 애플리케이션 needed 

 

!!!웹서버(W.S)는 정적static인 요청 (파일이 미리만들어져있음)을 처리한다!!!!!

!!!웹 어플리케이션 서버(W.A.S)는 동적인 요청을 처리한다!!!

 

client -> web server-> db

3 tier 구조

 

4티어: 서버에서 정적.동적인 요청에 대한 책임 이 분리되어있는 구조. 


웹서버의 역할

1. 대기

서버는 요청을 받으려면 24시간 대기 (리스닝)상태여야함. 

 

IP는 pc구별을 위한 것이고, 한 PC 안에서 서비스 구분은 Port 넘버로 한다. (오라클 SQL의 경우: 1521)

기본 웹은 80번임.. 웹 서버가 80번 포트를 계속 감시한다

애플리케이션 대신에 웹서버가 대기를 하고 있다가 요청을 감지한다.

 

2. 요구사항 분석 및 연결

요청이 들어오면 요청 분석(요구사항 분석)해 클라이언트가 뭘 요구하고 있는지 알아야함 - 어플리케이션이 함 

만약 짜장면 요청이면 짜장면을 만드는 모듈로 연결해줌_ 웹서버의 2 번쨰 역할 <연결>

 

3. 실행

: 코딩, 컴파일,실행할 수 있는것 모음은 jdk에 담겨있다. 자바 SE는 기업용이 아니라 servlet api를 가지고 있지 않기 때문에 apache tomcat으로부터 api를 빌려서 실행


CGI: 클라이언트 요청에 따라 하나의 요청당 하나의 동적인 웹 페이지를 생성함.

 

트래픽이 심함 (네이버의 경우 이렇게 하면 동시에 프로그램이 십만개 돌아갈 수도 있음)

 

해결책: 병행 처리... 쓰레드... 

한 프로세스가 점유하는 자원의 크기와 쓰레드의 자원의 크기 - 아주 다름. 

한 쓰레드가 점유하는 자원의 크기가 훨 작다

-> 프로세스에서 쓰레드로 변환되면 더 효율적인 멀티태스킹 가능.

--> 멀티 쓰레드로 함 : 확장 CGI

!!!!!!멀티쓰레드 처리할때 프로세스는 하나 돌아감 !!!!!!

 

확장CGI 여러개(서블릿, asc닷넷 어쩌구 등등)인데 서블릿 쓰는 이유: 자바 기반이라.

 

자바의 장점:

1. 이식성 (os 종속되지않음) becuz of JVM (자바 프로그램 실행하면 아래에 플랫폼 깔려있고 그위에 jvm있고 그 프로그램 실행됨)

 

2. 확장성 

해쉬맵보다 더 큰 메서드 쓰고싶으면 해쉬맵을 상속받고 다른 메서드 넣은담에 오버라이딩하셈 그리고 똑같은 메서드 가지고있는걸 오버로딩하셈... + 대부분 오픈소스. jdk 가져와서 확장한다. (ibatis도 그렇게만들어짐) 

=> 서블릿도 걍 그대로 사용 가능

 

3. 편리성

왠만한 구현체(list, map 등등) 다 가지고있음 jdk만 있으면 다 할수있음 + 오픈소스

 

-> 그래서 자바기반의 확장CGI thing인 JSP, 서블릿 씁니당 

 

+xml, json 형식 데이터는 왜 씀? : 시스템 종속 받지않아서. 윈도우나리눅스나 자바나c나~~~

 

 


프로그램 설치할 때 호환이 되나 먼저 봐야됨. apache tomcat을 설치할 건데 java ee랑 맞춰서 보자! 우리는 tomcat 8 쓸 것임!

이 5개가 현재 톰캣이 기본으로 제공하는 어플리케이션임

톰캣 = W.S + W.A.S

 

jsp 스펙 이야기할떄 work 폴더 중요함

 

loopback address: localhost. 내 주소

welcome file, welcome page: 특정 폴더 url로 입력해서 들어갔을 때 유일하게 있는 파일 or index.html

 


서블릿 스펙 이용해 서버 사이드를 구현하자

 

퀴즈!

1. 클래스 패스를 d:\test로 설정

2. qualified name이 kr.or.ddit.HelloJava인 코드 작성

3. 해당 클래스를 메인 클래스로 운영하여
윈도우 시스템 콘솔에 "Hello Java~"라는 텍스트가  출력 

 

qualified name?
클래스의 식별자(이름) 
1.qualified name : classpath 이후의 전체 패키지 경로를 포함한 이름
2. simple name: 소스상의 클래스 이름 (HelloJava)

해답

public class HelloJava {
          public static void main(String[] args) {

               System.out.println("Hello Java");

          }

}

 

<main 메서드의 시그니처(선언부)를 잘 보자>

- main메서드는 JVM이 시작. 애플리케이션 밖에있는 JVM이 접근하려면 public이어야함.

- static인 이유: 메인메서드 실행 전엔 어떤 메서드도 실행될 수 없기 때문 

- void: 리턴값

- String[] args : CUI라서 문자를 argument형태로 받을 수 밖에 없다

 


>javac -d . -classpath d:\test2

만들어질 파일의 위치 -d는 여기 . 

그안에서 다른 파일의 클래스패스 찾기

 

자원을 classes 에서부터  찾기 시작함: 클래스패스 지정되어있음.

 

만든 클래스를 그 아래에


<서버사이드에서 개발자가 해야할 일>

1. javax.servlet.http.HttpServlet 클래스의 상속 구현체 작성

 

2. 컴파일 / -d 배포할 수 있는 classpath (context/WEB-INF/classes) (컨텍스트의 단독 클래스 패스이기 때문에)

               -classpath 우리가 쓰는 se는 기업용이 아니라 서블렛이 없음. 그래서 톰캣에서 빌려서 %catalina_home%\lib\servlet-api.jar

 

3. tomcat에 서블릿을 등록했다.  servlet은 standalone 형태로 실행 불가(메인메서드없음) helloServlet을 servlet context/WEB-INF/web.xml에 넣어줬음. 

 - servlet -> servlet-name, servlet-class 등록

 

4. 서블릿 매핑 (가상의 주소가 결정됨: URI)

- servlet-mapping : servlet name, url-pattern

 

5. 재구동. web.xml은 서버를 구동할때만 읽기때무네...

 


자바에서 StringBuffer를 써야하는 이유

 

int i(기본형 데이터) = 4(리터럴 상수);

int j = 4; 

-> 메모리 공간 하나 잡힘.  (두개 다 4를 바라보고있음) 

기본형 데이터는 가비지 컬렉션이 되는 곳에 들어가지 않음. 이런식으로 상수 여러개 .. 하면 계속 쌓이고 쌓이면서 가비지 컬렉팅이 안됨. 이거 쌓이구 쌓이면 너무나 큰 용량이다

 

 

 

String str = "string"; -> 여기서 "string"은 상수로 쓰인다. 

+= "ett";

 

==>이렇게 하면 메모리 공간이 총 3개쓰인다. string/ett/stringett... 

근데 만약 

StringBuffer sb = new StringBuffer("text"); 해서 객체 형식으로 만들어주고

sb.append("text2") 하면 가비지 컬렉션되는 메모리 영역에 1개. 

=> 스트링과 스트링버퍼를 쓸때 공간 절약 해야함~~!!! ~! 상수 남발하지뭬.,,,