[교재] 자바 웹 다루는 기술
정적(static) 웹 프로그래밍 - 아파치 같은 웹 서버를 이용해서 웹 페이지들을 브라우저에 표시하는 방식
- 웹 서버 : 각 클라이언트에게 서비스를 제공하는 컴퓨터를 의미
- 클라이언트 : 네트워크로 서버에 접속한 후 서버로부터 서비스를 제공받는 컴퓨터를 의미
- HTTP 프로토콜 : (Hyper Text Tansfer Protocol), www 서비스를 제공하는 통신 규약을 의미. 웹 서버와 클라이언트는 이 프로토콜을 이용해 정보를 주고 받는다.
- HTML : (Hyper Text Markup Language), www 서비스를 제공하기 위한 표준 언어.
- 자바스크립트 : HTML 웹 페이지의 여러 가지 동적인 기능을 제공하는 스크립트 언어.
- CSS(Style Sheet) : HTML 문서에서 서체나 색상, 정렬 등 세부적인 HTML 페이지의 디자인에 관련된 여러 가지 기능을 제공.
이러한 정적 웹 프로그래밍의 방식은 고정된 정보만 제공하고 정보 수정 시 관리자가 직접 HTML 소스를 수정해야 변경이 되기 때문에 '실시간'으로 변경 사항이 반영되지 않았다.
정적 프로그래밍에서 관리자가 하던 역할을 웹 애플리케이션 서버(WAS)에서 실행되는 애플리케이션이 수행한다. 따라서 실시간 환율 정보가 저장되어 있는 데이터베이스에 클라이언트 요청이 있을 때마다 실시간으로 제공이 가능해졌다.
CGI 방식을 이용, 요청 시마다 process라는 메모리를 생성 후 반환하고 이런 식... -> 인터넷 환경이 발전하고 사용자가 늘어나면서 과부하가 와서 개선하여 나온 것이 JSP, ASP, PHP와 같은 동적 웹 프로그래밍 기술이라고 한다.)
thread 방식으로 실행 -> process 방식은 요청을 받을 때마다 process를 계속 생성했다면 thread 방식은 요청을 받으면 최초 한 번만 환율 조회 기능을 메모리에 로드해놓고 동일한 요청이 들어오면 메모리에 존재하는 환율 조회 기능을 재사용함! (각각의 요청에 대한 기능을 메모리에 따로따로 로드하지 않음)
- 웹 애플리케이션 구성 요소의 기능
- webShop : 웹 애플리케이션의 루트 디렉터리. 다른 웹 애플리케이션 이름과 중복을 허용하지 않으며, 여기에는 JSP HTML 파일이 저장.
- WEB-INF : 웹 애플리케이션에 관한 정보가 저장되는 곳. 이 디렉터리는 외부에서 접근할 수 없다.
- classes : 웹 애플리케이션이 수행하는 서블릿과 다른 일반 클래스들이 위치.
- lib : 웹 애플리케이션에서 사용되는 여러 가지 라이브러리 압축 파일(jar 파일)이 저장되는 곳. DB 연동 드라이버나 프레임워크 기능 관련 jar 파일이 여기에 저장된다. lib 디렉터리의 jar는 클래스패스가 자동으로 설정된다.
- web.xml : 배치 지시자(deployment descriptor)로서 일종의 환경 설정 파일이다. 웹 애플리케이션에 대한 여러 가지 설정을 할 때 사용된다.
컨테이너에서 웹 애플리케이션 실행하기
: 웹 애플리케이션은 단독으로 실행할 수 없어서 톰캣과 같은 웹 컨테이너에서 실행해야 한다.
server.xml에 웹 애플리케이션의 위치를 등록해 놓고 실행할 수 있는데 이때 server.xml에 등록하는 웹 애플리케이션을 컨텍스트(Context)라 부른다.
컨텍스트의 주요 특징
- 웹 애플리케이션당 하나의 컨텍스트가 등록
- 웹 애플리케이션 이름과 같을 수도 있고 다를 수도 있다
- 컨텍스의 이름은 중복될 수 없다
- 웹 애플리케이션의 의미를 가장 잘 나타낼 수 있는 명사형으로 지정
- 대소문자를 구문
- server.xml에 등록
서블릿의 특징
1. 서버쪽에서 실행
2. 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능을 제공
3. thread 방식
4. 자바로 만들어져 객체 지향의 특징을 가짐
5. 컨테이너에서 실행
6. 컨테이너 종류 상관없음 (플랫폼 독립적)
7. 보안 기능을 적용하기 쉬움
8. 웹 브라우저에서 요청 시 기능을 수행
클라이언트 요청 시 public service() 메서드를 먼저 호출 -> protected service() 메서드를 호출 -> request 종류에 따라 doXXX() 메서드를 호출하는 과정
최초 실행 시 init 메서드를 호출하고 새로고침 할 때마다 재사용하기 때문에 doGet 메서드만 호출하는 것을 보자.
로그인 클릭 -> input 태그의 name 속성 값(lee, text)과 쌍으로 전송. -> 서블릿(action="login"이라는 이름의)에서는 전송된 입력 데이터를 받음.
눈으로 보면 Statement를 사용했을 때와 결과는 같지만 DB를 연동할 경우 수행 속도가 좀 더 빠르다는 차이가 있다.
위의 예제에서 connDB()처럼 웹 애플리케이션이 필요할 때마다 DB에 연결해서 작업하는 방식은 단점이 연결에 시간이 많이 걸린다는 점이 있다.
특히 온라인 쇼핑몰의 경우 동시에 수십 명, 많게는 수백 명까지 접속해서 상품 조회, 주문하기 등의 기능을 사용하기 때문에 위의 방법처럼 DB와 연동해 작업해야 한다면 비효율적이다.
그렇기 때문에 웹 애플리케이션이 실행됨과 동시에 DB와의 연동을 미리 설정해두는데 이 기술을 ConnectionPool 이라고 한다.
tomcat의 context.xml 파일에 DB를 연결할 때 필요한 설정들을 미리 넣어둔다