---
title: "Java EE 정리 01"
date: "2019-02-25"
tags: ["Java EE","Servlet"]
status: archived
verified: false
---

---

## Java EE의 등장 배경

![01](/md/legacy-assets/javaEe/01/01.webp)

* Oracle은 데이터 저장, 처리 그러나 화면을 만들 수 없음
* 데이터를 저장할 수 없는 **Java SE와 DB**를 이용하여 **데스크탑 Application**을 만들 수 있었음.
     * CS프로그램을 설치, 유지보수를 위해선 출장이 필수적이었다.
     * **지리적 문제점이 존재**
* Web의 발달로 지리적 문제를 해결할 수 있는 **Java EE 등장**
     * **클라이언트는 Web Browser를 통해서 업무 처리된 HTML만 전달받음**
     * **직접 가서 문제점을 해결하는 지리적 문제를 해결**

## Java EE(Enterprise Edition)

* **기업에서 사용하는 업무용 프로그램을 작성하기에 알맞은 Java 개발버전**
     * 업무를 Module로 구분하여 작성
     * 모듈로 만들게 되면 결합도가 낮아짐
     * 업무를 모듈로 개발하기 적합한 기술 이었던 **EJB(Enterprise Java Bean)**
* **Jave EE는 EJB, Servlet, JSP 등의 기능을 제공**
     * **Servlet, JSP는 Web에서 서비스하는 기능**
          * 동적인 HTML을 생성가능
               * 개인화 서비스가능
          * .war로 묶여서 Web Container(필수)로 배포
     * **EJB의 단점은 무겁고 서비스를 하기 위해서 별도의 프로그램이 필요(EJB Server)**
          * .ear 파일로 묶여져서 EJB Server로 배포
          * Session Bean, Entity Bean, Message Driven Bean으로 구분
               * Session Bean - DB를 사용하지 않는 업무를 처리할 때 
               * Entity Bean - DB를 사용하는 업무를 처리할 때
               * Message Driven Bean - Message를 보내서 수신한 클라이언트가 업무 처리를 하도록 만든 Bean(분산처리용)
          * **무거운 EJB를 단순화한게 Spring Framework**
* **Container에서 서비스 된다.**
* **WAS : Web Application Server**
     * **Java EE의 모든 Spec을 서비스할 수 있는 프로그램**
     * weblogic(BEA)이란 SW가 대표적인 WAS 프로그램
          * 그 외 websphere(IBM), JBoss(), 제우스(TMAX), OC4J(Oracle), ... 
          * 톰캣은 EJB를 지원 안하기 때문에 WAS가 아닌 Web Container
* **Web Container : Java EE 중 Servlet/ JSP만 서비스할 수 있는 프로그램**
     * **Web Browser의 요청을 받아,  Servlet과 JSP가 요청되면 Servlet/JSP를 HTML로 변환하여 응답하는 프로그램**
          * Web Container는 웹서버의 기능을 갖고 있다.
     * ApacheTomcat가 대표적인 Web Container

![02](/md/legacy-assets/javaEe/01/02.webp)


## Servlet

* **CGI(Common Gateway Interface)의 일종**
     * **일반 언어에서 웹서비스가 가능하도록 공통규약을 정의해 놓은 것**
     * 느리다
* **Java의 CGI는 Servlet**
     * 속도 개선한 **FAST CGI**
* **HTML과 언어가 혼합되어 복잡도가 상승한다.**
     * 디자이너와 개발자의 업무구분이 안되는 단점이 존재.
     * 개발 속도가 느려 개발 기간이늘어난다.
* 개발자를 생산하는 시간이 오래 걸린다.
* **Thread로 처리하기 때문에 안정적**
     * **접속자가 많아도 안정적인 서비스가능**
     * **대규모 시스템에서 주로 도입**
     * **웹 컨테이너가 필요(Tomcat)**
* **Java SE에서 제공하는 모든 클래스를 쓸 수 있다.**
* Java EE에서 배포하는 `servlet-api.jar`가 존재해야 Servlet 개발이 가능
     * tomcat에 포함되어 있다.

![03](/md/legacy-assets/javaEe/01/03.webp)

* **주 사용 package는 javax.servlet, javax.servlet.http**

![04](/md/legacy-assets/javaEe/01/04.webp)

## Servlet 작성법

1. Servlet파일을 생성, 작성
2. 배포(Web Container)
3. 일반 경로에 존재하는 앱을 웹 서비스가 가능하도록 Web Container(Server.xml)에 등록
4. 제작되어 배포된 Servlet을 브라우저에서 호출할 수 있도록 DD(web.xml)에 등록
5. Web Container 실행
6. Web Browser를 열고 url을 입력하여 Servlet을 요청

## Servlet 작성법 1

![05](/md/legacy-assets/javaEe/01/05.webp)

```java
// 1.HttpServlet을 상속받는다.
public class Test extends HttpServlet {

    // 2.요청방식에 따른 처리할 method를 Override
    // tomcat(컨테이너)이 요청방식에 따라 doGet()이나 doPost()를 호출

    // get방식
    // -url 쿼리스트링으로 데이터 전달(0~255자까지 소용량 데이터,보안 안됨)
    // -a태그 이동, location.href로 이동, meta태그로 이동, form태그 method가 GET일 때
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        // HttpServletRequest req - 요청 처리
        // HttpServletResponse resp - 응답 처리
    }

    // post방식
    // -http 헤더로 정보를 전달(보안)
    // -form태그의 method가 POST일 때
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        // 3. 응답방식을 설정한다.(MIME Types 설정)
        // -접속자에게 제공할 서비스의 형태를 설정(Container의 역할)
        // -거의 대부분 HTML을 응답해줌
        resp.setContentType("text/html"); // 만들어지는게 HTML
       
        // 4. 응답하기위한 출력스트림 얻기
        PrintWriter out = resp.getWriter();

        // 5. 응답할 내용을 생성
        out.println("<html>....");
        out.flush();
    }
}
```

## Servlet 작성법 2

* **배포(Web Container)**
  * **Java Resources에 있는 내용들이 배포하면 classes로 들어가게 된다.**
* 자바로 웹서비스를 하기 위한 폴더 구조
     * **DD(Deployment Descriptor) == web.xml**

![06](/md/legacy-assets/javaEe/01/06.webp)

## Servlet 작성법 3

* **일반 경로에 존재하는 앱을 웹 서비스가 가능하도록 Web Container(Server.xml)에 등록**
* **server.xml**
     * Context의 path - 브라우저에서 호출할 경로

```html
<Host appBase="webapps" autoDeploy="true" name="localhost"  unpackWARs="true">
...
<Context docBase="html_prj" path="/html_prj" reloadable="true"  source="org.eclipse.jst.jee.server:html_prj"/></Host>
```

## Servlet 작성법 4

* **제작되어 배포된 Servlet을 브라우저에서 호출할 수 있도록 DD(web.xml)에 등록**

```html
<servlet>
    <servlet-name>객체명</servlet-name>
    <servlet-class>[객체화할 서블릿클래스(패키지명까지 기입)]</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>객체명</servlet-name>
    <url-pattern>[서블릿을 브라우저에 호출할이름]</url-pattern>
</servlet-mapping>
```

## Servlet 작성법 5

* **Web Container 실행**
  * Tomcat bin안에 있는 startup.bat을 실행(Windows)

![07](/md/legacy-assets/javaEe/01/07.webp)

## Servlet 작성법 6

* **Web Browser를 열고 url을 입력하여 Servlet을 요청(GET)**

```
localhost:8080/[Server.xml에 정의된 Path]/[DD에 정의된 url 패턴]
```

* **eclipse를 사용하면 2~6작업은 자동으로 수행된다..**
