웹 애플리케이션을 배포해보자
배포는 즐거워라
1. 웹애플리케이션은 어디에 개발한 것을 저장하나요?
2. 컨테이너는 웹 애플리케이션 어디에서 어떤 자원을 찾을까요?
3. 웹 애플리케이션 컨텐츠를 어떻게 요청하면 되나요?
어떤 녀석이 어디에 있어야 하나요?
태그 파일은 /WEB-INF/tags 또는 그 하위 디렉토리에 JAR로 배포한 경우 /META-INF/tags 또는 그 하위 디렉토리에 배포 해야 한다등 여기 아닌 다른곳에 태그 파일을 배포하면, 컨테이너는 그냥 무시해버리거나, 정적인 컨텐츠로 서비스 해버리니 조심해야 합니다.
WAR 파일
WAR 파일은 우베 애플리케이션 구조에 대한 이식성이 좋으며, 압축된 스냅샷이라고 보면 됩니다. 젠체 웹 애플리케이션 디렉토리를 jar로 압축하여 확장자를 .war로 바꾼 것입니다. 이렇게 했을 경우 한 가지 문제가 있는데, 컨테이너가 어떻게 웹 애플리케이션의 컨텍스트 즉 이름을 아냐는 거죠
이름을 추출하는 방법은 컨테이너에 따라 다릅니다.톰켓의 경우, WAR파일 이름이 웹 애플리케이션 이름이 됩니다.
WAR파일의 경우 /META-INF?MANIFEST.MF 파일에 라이브러리 의존성을 작성두면, 배포시 컨테이너가 애플리케이션을 실행하기 위해 필요한 라이브러리가 있는지 사전 체크할수 있습니다. 따라서 웹 애플리케이션을 배포하고 난 다음 실행해보니 무슨 무슨 라이브러리가 없어 실행이 안되더라와 같이 늦게 후회하는 경우는 없죠
서블릿 매핑은 실제로는 존재하지 않는 지어낸 것입니다.
1. 정확히 읆까지 일치하는것
<url-pattern>/Beer/SelectBeer.do</url-pattern>
2.디렉토리까지만 일치하는것
<url-pattern>/Beer/*</url-pattern>
3. 확장자만 일치하는 것
<url-pattern>*.do</url-pattern>
환영파일을 선택하는 순서
1. 클라이언트 요청 : http://wmp.kr/MyTestApp/search
2. 컨테이너는 우선 DD서블릿 매핑이란 것을 먼저 봅니다. 여기서 일치하는 것이 없으면 다음으로 <welcome-file-list>의 제일 위에 있는 index.html파일을 가지고 옵니다.
3. 컨테이너는 /MyTestApp/search 디렉토리에 “index.html”파일이 있는 지 체크합니다. 이런파일이 없다면
4. 컨테이너는 <welcome-file-list>의 두번째 <welcom-file> 항목인 default.jsp를가지고
5. zjsxpdlsjsms /MyTestApp/serarch 디렉토리에 “default.jsp”파일이 있는지 케츠합니다. 이런 파일이 있다면 클라이언트에 응답으로 보냅니다.
DD에서 강제로 서블릿 초기화 하기
서블릿은 초최 요청이 들어올때 초기화 된다고 알고 있을겁니다. 첫번쨰 요청한 클라이언트가 클래스 로딩, 인스턴스화, 초기화 와 같은 고통스러운 짐을 져야 한다는 말이죠 이 모든 작업이 컨테이너가 스레드를 하나 할당하여 service() 메소드를 호출하기 전에 모두 일어납니다.
DD <load-on-atsrtup>항목을 사용하면 최초 요청이 올때 초기화 하는 것이 아니라 배포 시점에 서블릿을 로딩할수 있습니다. <load-on-startup>에 0보다 큰 값을 설정하면 컨테이너는 애플리케이션이 배포되는 시점에 서블릿을 초기화 합니다.
배포시 로딩해야 할 서블릿이 여럿인데, 순서를 정하고 싶을때에는 <load-on-startup>값이 이를 제어 할수 있습니다. 먼저 값이 0보다 크다는의미는 배포시 로딩하라는 의미이고 작은것부터 순서대로 로딩을 제어할수 있습니다.
<servlet>
<servlet-name>KathyOne</servlet-name>
<servlet-class>foo.DeployTestOne</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
EJB관련태그를 암기해 봅시다.
J2EE애플리케이션을 배포하는 경우라면 비즈니스 계층에 엔터프라이즈 자바 빈즈를 배포해야만, 웹 컴포넌트에서 EJB를 검색해서 사용할것입니다. EJB 컨테이너 까지 들어있는 완벽한 J2EE 컨테이너로 웹 애플리케이션을 배포하는 경우 DD에서 EJB에 대한 참조를 선언할수 있습니다.
지역빈이란 클라이언트와 동일 JVM상에서 실행하는 빈을 의미합니다.
지역(로컬) 빈에 대한 참조
<ejb-local-ref>
<ejb-ref-name>ejb/Customer</ejb-ref-name>
<ejb-ref-type>Entiry</ejb-ref-type>
<local-home>com.wmp.CustomerHome</local-hom3>
<local>com.wickedlysmart.Customer</local>
</ejb-local-ref>
원격빈이란 클라이언트와 다른 JVM상에서 실행하는 빈을 의미합니다.
원격(리모티)빈에 대한 참조
<ejb-ref>
<ejb-ref-name>ejb/ㅣㅐㅊ미Customer</ejb-ref-name>
<ejb-ref-type>Entiry</ejb-ref-type>
<home>com.wmp.CustomerHome</home>
<remote>com.wickedlysmart.Customer</remote>
</ejb-ref>