강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

J2EE(Java 2 Enterprise Edition)환경 소개

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.gif title22.gif

김세곤 <sehkone@bawi.org>

2000년 12월 10일

들어가며

J2EE(Java 2 Enterprise Edition)는 썬(Sun)이 내놓은 엔터프라이즈 급 개발 환경이다. 도대체 엔터프라이즈 급의 개발이란 무엇이고, J2EE는 어떤 놈이길래 필자가 이렇게 여러분에게 한바탕 소개를 늘어놓으려 하는 것일까? 결론부터 이야기하자면, J2EE는 참으로 매력적이고 앞으로 개발 환경의 대세가 될 것이므로, 프로그래머라면 꼭 공부해야만 할 것이다.

이 글의 목적은 J2EE에 대한 소개이다. 따라서, J2EE를 통해 실제 개발을 하기 위한 세부적인 내용은 다루지 않는다. J2EE는 매우 방대하고 꽤나 어려워서 처음부터 세부적으로 공부할 수도 없고 한 편의 글이 모든 내용을 포괄할 수도 없는 노릇이다. J2EE에 대한 개념과 앞으로 공부할 방향을 제시하는 것이 이 글의 미션(mission)이 되겠다. 더욱 상세한 이야기는 웹독스(WebDox)가 앞으로 차근차근 글을 올릴 것이므로 기대해도 좋다.

J2EE의 탄생 배경

  엔터프라이즈 급 개발

엔터프라이즈 급 개발을 단어 뜻대로만 풀이하면 기업을 대상으로 하는 개발이란 말이다. 예를 들어 은행 전산망 같은 것이 엔터프라이즈 급 환경이다. 생각해 보자. 은행 전산망을 이용하는 사람은 엄청나게 많다. 은행 운영 측면에서 보면 전세계의 지점망들이 수많은 고객 정보를 실시간으로 공유해야 하고, 고객 측면에서 보면 전세계 지점 중 어느 곳을 이용하든지 간에 똑같은 서비스를 차질 없이 제공 받아야 한다. 이 과정에서 오류가 발생한다면 돈과 연결되어 치명적일 수가 있다. 이런 은행 전산망처럼 수많은 데이터 처리와 작업(transaction)이 동시에 여러 사용자로부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 급 환경이라 일컫는다. 엔터프라이즈 급에서의 개발은 한 대의 컴퓨터에서 운영되는 프로그램을 개발하는 것과는 개념이 매우 다르다. 예전에는 이런 규모의 개발은 정말로 큰 기업들에게만 해당되었지만, 지금은 웹 환경이 많이 보급되어 웹 서비스를 제공하거나 이를 계획하는 중소 규모의 기업들도 엔터프라이즈 급의 개발/서비스 환경을 구축하고 있다. 좀 더 진보적으로 이야기하면 이제 엔터프라이즈 급 개발 환경은 개발 환경의 표준이 되어 가고 있다고까지 할 수 있다. 지금부터 엔터프라이즈 급 개발 환경의 특징과 요구 환경을 알아보도록 하자.

    네트워크 환경

요즘의 개발 환경은 네트워크를 빼놓고 논의할 수가 없다. 자신의 PC에 워드 프로세서를 설치해서 사용하는 것은 네트워크와는 별 상관이 없다. 워드프로세서의 경우처럼, 몇 년 전만 해도 대부분의 개발 환경은 한 대의 PC에서 독립적으로 돌아가는 프로그램을 만들기 위한 것들이었다. 하지만, 요새는 한 사람의 사용자가 독립적으로 프로그램을 사용하기 보다는, 여러 사람들이 동시에 같은 프로그램(혹은 서비스)을 사용하는 경우가 훨씬 많다. 컴퓨터 게임만 해도 그렇다. 스타크래프트를 집에서 CD 틀어 놓고 혼자 사람은 별로 없다. 모두들 네트워크 환경에서 다른 사람과 함께 게임을 즐긴다.

네트워크가 일반 사용자에게 어떤 혜택을 주는지는 인터넷의 위용을 통해 독자 여러분이 이미 잘 알고 있을 것이니 각설하고, 네트워크 환경이 한 대의 컴퓨터 환경과 개발 측면에서 뭐가 다른지에 대해서 말해 보겠다.

네트워크 환경의 개발에서 대해서 이야기하자면 빼놓을 수 없는 것이 서버/클라이언트 개념이다. 여러분이 윈도우에서 MS 워드를 사용하는 경우를 생각해 보자. MS 워드를 실행시키면 MS 워드가 실행되어 프로세스가 생성된다. 이 프로세스는 MS 워드의 모든 동작을 처리하고 사용자의 요구를 수행한다. 하나의 프로세스가 워드 작업을 위한 모든 일을 다 담당하는 것이다(엄밀하게 말하면, 복수 개의 프로세스가 생기지만 모두가 MS 워드에 종속된 프로세스들이다). 이번에는 야후를 방문해서 사이트를 검색하는 과정을 생각해 보자. 여러분이 야후를 방문하기 위해서는 웹 브라우저를 실행시켜야 한다. 넷스케이프나 익스플로러와 같은 웹 브라우저는 실행되면 여러분의 PC 내에서 프로세스로 존재하게 된다. 이 프로세스는 단지 야후 사이트와 네트워크 접속을 하여 데이터를 주고 받는 일을 하게 된다. 실제 여러분이 야후 홈페이지에 검색어를 입력한 후 나타나는 검색 결과는 브라우저 프로세스가 만들어 내는 것이 아니라 야후 컴퓨터의 검색 프로세스가 만들어서 브라우저 프로세스에 전달하는 것이다. 이와 같이 일련의 작업이 한 쪽 프로세스가 모두 담당하지 않고 복수 개의 다른 프로세스가 합작해서 행해지는 환경이 바로 서버/클라이언트 환경이다.

서버/클라이언트 환경에서는 야후처럼 실제 작업을 수행하는 쪽을 서버라 부르고, 브라우저처럼 사용자 측에서 서버와 교통할 수 있도록 해 주는 쪽을 클라이언트라고 부른다. 서버/클라이언트 환경에서는 실제 서비스를 제공하는 쪽과 서비스를 받는 쪽이 모두 한 컴퓨터 내에 있지 않을 수 있기 때문에 서버와 클라이언트를 별도의 프로그램으로 개발해야 한다. MS 워드는 하나의 프로그램이지만 야후에서 사이트를 검색하는 경우에서는 야후 쪽 프로그램과 브라우저 프로그램이 별도로 존재하는 것을 생각해 보면 쉽게 개념을 정립할 수 있다.

서버/클라이언트 환경에서는 전체 서비스의 작업 중에서 어디까지 서버가 담당하고 어디까지 클라이언트가 담당할 것이냐를 구분짓는 것이 매우 중요한데, 가장 대표적인 서버/클라이언트 환경인 웹 서비스의 경우에는 모든 데이터 처리는 서버가 담당하고 브라우저가 서버에 서비스를 요청하고 결과를 받는 일만을 담당하는 형식이 일반적이다. 이 때문에 웹 서비스를 제공하는 경우에는 서버 쪽의 프로그램을 개발하는 것이 전체 개발의 대부분이 된다(클라이언트는 넷스케이프나 익스플로러와 같은 브라우저를 쓰면 된다). 클라이언트가 좀 더 많은 일을 하도록 하는 경우라고 해도 여전히 가장 어려운 개발 작업은 서버 쪽이다. 서버는 많은 클라이언트의 요구를 동시에 오차없이 처리해야 하기 때문이다.

네트워크 기반 개발과 서버/클라이언트 개념에 대해서는 이쯤하고, 어쨌거나 엔터프라이즈 급 개발은 네트워크를 기반으로 하는 서버/클라이언트 개발이 그 기본이 된다는 사실을 알아두자.

    분산 환경

모든 컴퓨터가 네트워크로 서로 연결되기 시작하면서 물리적으로 떨어져 있는 다른 컴퓨터의 자원을 빈번하게 사용하게 되었다. 한 대의 컴퓨터가 모든 일을 다 관장하는 것은 하드웨어의 한계상 무리가 있기 마련이므로 여러 대의 컴퓨터를 동시에 사용하여 자원을 효과적으로 활용하고자 하는 것은 당연한 발상이다. 분산 환경은 상당히 넓은 개념으로서 한 회사가 고객에게 웹 서비스를 제공하기 위해 사이트를 구성하면서 웹 서버와 데이터베이스 서버를 물리적으로 다른 기계에 설치하는 것도 넓은 의미에서 보면 이에 해당한다. 이런 식으로 역할을 구분해서 따로 떼어 놓는 식 말고도 같은 역할을 여러 기계에서 수행하도록 하는 경우도 있다. 예를 들어, 웹 서버에 부하가 많이 걸려서 몇 대의 웹 서버로 웹 사이트를 구성하는 것도 일종의 분산 환경이다. 그러나, 좁은 의미에서 우리가 주목하려고 하는 분산 환경이란 프로그래밍의 관점에서 어떤 데이터를 조작하거나 함수를 수행하는 일을 내 쪽에서 모두 처리하지 않고 원격지의 것들을 사용할 수 있는 환경을 말한다.

네트워크 기반 하에 물리적으로 산재한 시스템 자원을 유기적으로 활용하기 위해서는 산재한 자원을 제어/사용하는 프로그램들 간에 원활한 의사 소통이 필요한데, 이에 대한 많은 기술 중 우리의 시선을 집중시키고 있는 것이 분산 객체 기술이다. 분산 객체 기술에서는 산재한 자원을 객체 지향(object-oriented) 개념을 적용시켜 분산 객체로 만들어 놓고 이들 사이의 의사 소통 규약(일종의 프로토콜)을 정의한다.

네트워크가 기반이 엔터프라이즈 급 환경에서는 분산 자원에 대한 효과적인 활용이 중요한 이슈가 되기 때문에 어떤 방식으로든 분산 환경에 대한 인프라가 갖추어져 있어야 한다.

    웹 환경

오늘날의 사용자 표준 인터페이스는 웹이라고 해도 과언이 아니다. 서버는 웹 브라우저를 통해 HTML 문서 양식을 보내주는 표면적인 일 외에도 웹 프로토콜을 효과적으로 지원할 수 있어야 한다. 웹은 매우 많은 사용자가 동시에 서버에 접속하는 형태로서 많은 부하를 서버가 제대로 감당해야 하는 것은 물론이고, HTTP가 사용자의 세션을 지속적으로 유지하지 않는 단점을 서버 쪽에서 극복할 수 있어야 한다.

오늘날 엔터프라이즈 급 환경은 폐쇄적인 서버/클라이언트 환경으로부터 개방적인 웹 환경으로 급속하게 탈바꿈하고 있다.

  엔터프라이즈 급 환경의 조건

    분산 객체 지원

엔터프라이즈 환경은 분산 환경을 기반으로 한다는 사실은 앞에서 언급하였다. 따라서, 분산 환경을 얼마나 효과적으로 지원하고 있느냐가 엔터프라이즈 환경의 질적 수준을 판가름하게 된다. 이 때문에, 오늘날 많은 엔터프라이즈 환경은 분산 환경의 최신 기술인 분산 객체 기술을 채택하고 있다.

    자원 관리

엔터프라이즈 환경은 수많은 하드웨어와 소프트웨어로 구성된다. 그리고, 많은 데이터가 동시에 처리되고 수많은 작업이 수행된다. 따라서, 엔터프라이즈 환경에서 구동되는 프로그램은 자원 관리를 효과적으로 수행해야만 한다. 시스템의 자원은 한정되어 있기 때문에 사용자가 시스템의 한계보다 더 많은 자원을 요구하면 적절하게 자원을 배분해서 모든 사용자가 골고루 자원을 사용할 수 있도록 해 주어야 한다. 뿐만 아니라, 동시에 여러 사용자가 같은 자원을 요구할 때 자원의 동시성, 항상성 등에 문제가 발생하지 않도록 해야 한다. 예를 들어, 은행 전산망을 이용해서 고객이 일정 금액을 인출하고 나면, 그 고객의 계좌에는 인출한 금액만큼이 잔고에서 빠져야 한다. 그리고, 잔고에 인출 내용이 반영되기 전까지는 다른 인출이 시도되는 것을 막아야 한다. 동시에 복수 개의 계좌 인출이 시도될 수 있다면 잔고보다 많은 금액을 다른 계좌로 빼돌리는 경우가 발생할 수도 있다.

이와 같은 자원 관리는 실제 비즈니스 로직과는 크게 관계가 없다. 만일, 개발자가 소프트웨어를 개발하면서 복잡한 자원 관리에 일일이 신경을 써야 한다면 실제 비즈니스 로직 구현은 제대로 시도도 못 할 공산이 크다. 제대로 된 엔터프라이즈 환경이라면 자원 관리는 시스템 수준에서 해결할 수 있어야 한다.

    컴포넌트의 지원

소프트웨어 개발 방법론은 여러 각도로 발전해 왔는데, 현재 효과적인 방법으로 산업 현장에서 가장 많이 채택하고 있는 것이 컴포넌트 기반 개발이다. 전체 프로그램의 구성을 독립적인 부분(컴포넌트)으로 나누어서 개발한 후에 이것을 유기적으로 합치는 것이 컴포넌트 기반 개발이다. 그리고, 이 컴포넌트는 다른 개발에서 재사용할 수 있어야 한다.

제대로 된 엔터프라이즈 환경이라면 컴포넌트 기반 개발을 지원하고, 컴포넌트로 구성된 소프트웨어를 가동시킬 수 있어야 한다.

  J2EE를 통한 엔터프라이즈 급 개발

지금까지 장황하게 엔터프라이즈 급 환경이 무엇이고 제대로 된 엔터프라이즈 환경이 어떤 것들을 요구하는지 늘어 놓았는데, 이런 요구 사항을 충족시키는 자바 환경이 바로 J2EE(Java 2 Enterprise Edition)이다. J2EE는 분산 객체, 효율적 자원 관리, 컴포넌트 기반 개발 등을 자바 환경에서 사용할 수 있도록 하는 표준 규약이다.

J2EE는 독립적인 것이 아니라 여러가지 구성 요소들의 집합이다. 우선, 분산 객체와 컴포넌트 기반 개발은 RMI-IIOP를 사용하는 EJB(Enteprise JavaBeans)로 지원한다. 그리고 효율적 자원 관리는 EJB 컨테이너 혹은 웹 애플리케이션 서버가 JTA, JDBC를 사용해서 담당한다. 또, 웹 환경은 서블릿과 JSP가 맡는다. J2EE의 구성 요소에 대해서 다음 절에서 좀 더 알아보자.

J2EE의 구성

  J2EE의 구성 요소

J2EE는 다음의 것들로 구성된다.

  • EJB(Enterprise JavaBeans)

  • 서블릿(Servlet)/JSP(Java ServerPages)

  • JDBC

  • JNDI(Java Naming and Directory Interface)

  • JavaMail

  • JMS(Java Message Service)

  • JTA(Java Transaction API)

  • JAF(JavaBeans Activation Framework)

  • RMI-IIOP

  • JavaIDL

우선 구성 요소가 너무 많아서 기가 질릴 지도 모르겠다. J2EE 기반에서 엔터프라이즈 급 개발을 하기 위해서 위의 것들을 모두 공부해야 한다면 공부하느라 세월을 다 보낼 지도 모르겠다는 걱정부터 앞설 것이다. 다행히도 위의 것을 모두 공부할 필요는 없다. 개발하고자 하는 것이 어떤 것이냐에 따라서 필요한 것을 공부하면 된다. 하지만, 각각의 것들이 도대체 어디에 쓰는 것인지에 대해서 알고는 있어야 한다. 그래야, 필요할 때 뭘 공부해야 하는지는 결정할 수 있을테니 말이다. 위의 요소 중에서도 앞의 세 가지, 즉 EJB, 서블릿/JSP, JDBC는 J2EE의 핵심 요소로서 J2EE 기반의 개발을 시도하려는 개발자는 제대로 공부해야 하는 내용이다. 특히, 진정한 엔터프라이즈 급의 개발이라면 EJB 사용이 핵심이 되므로, J2EE의 가장 핵심적인 요소는 EJB라고 해도 틀리지 않다.

  EJB(Enterprise JavaBeans)

EJB는 컴포넌트 기반 분산 객체 기술이다. EJB는 엔터프라이즈 급 개발에서 데이터 추상화와 비즈니스 로직에 대한 부분을 담당하는 매우 핵심적인 요소이다. 사실 데이터 추상화와 비즈니스 로직은 개발의 대부분이다.

데이터 추상화는 엔티티 빈(Entity Bean)이 담당하고, 비즈니스 로직은 세션 빈(Session Bean)이 담당하는데 이 빈들은 모두 분산 객체 기술을 그 바탕에 두고 있다. EJB는 1.1 버전부터 RMI-IIOP를 통해 CORBA를 지원하고 있고, 2.0에 이르러서는 JMS를 통해 비동기적인 빈즈를 만들 수 있게 되었다.

EJB는 워낙 중요하고 내용이 많으므로, 자세한 설명은 다음 기회로 미루자.

  서블릿/JSP

서블릿과 JSP는 J2EE 환경에서 웹 인터페이스 부분을 맡는다. 이미 서블릿과 JSP에 대해서는 독자 여러분이 많이 들어 보았을 것이다. J2EE 환경을 고려하지 않는다면 서블릿과 JSP는 자바빈즈(JavaBeans)를 사용해서 비즈니스 로직을 처리하지만, J2EE 환경에서는 자바빈즈 대신에 EJB를 사용해서 비즈니스 로직을 처리한다. 즉, 서블릿과 JSP는 빈즈를 사용하여 웹 방문자에게 무언가를 보여주는 부분을 담당하는 것이다.

서블릿과 JSP에 대해서는 웹독스에 여러 문서가 있으므로 참조하기 바란다.

  JDBC

데이터베이스는 종류마다 특성이 다르기 때문에 호환성을 유지하기 어려웠다. 이를 극복하기 위해서 데이터베이스와 프로그램 사이의 표준 프로토콜을 만들어 사용하는 방식이 등장하였는데 ODBC가 그 대표적인 예이다. JDBC는 자바에서 데이터베이스를 조작하는 표준 방식이다. 데이터베이스 종류에 상관없이 똑같은 코드로 데이터베이스를 조작할 수 있다.

J2EE 환경에서 데이터베이스 조작은 JDBC를 통해 수행한다. 다만, 데이터베이스의 데이터를 자바 언어로서 추상화하는 것은 EJB의 엔티티 빈(Entity Bean)이 담당하는데, EJB 컨테이너(혹은 웹 애플리케이션 서버)가 엔티티 빈과 데이터베이스와의 데이터 항상성(persistency)를 유지하는데에도 내부적으로 JDBC를 사용한다.

  JNDI, JavaMail, JMS, JTA, JAF, RMI-IIOP, JavaIDL

JNDI는 종류가 다른 컴퓨팅 자원을 효과적으로 이름 붙여 사용할 수 있도록 해 준다. 데이터베이스 접속의 경우에는 DriverManager를 사용하게 되면 데이터베이스 URL, 사용자 이름, 비밀번호 등을 직접 코드 속에 넣어야 했다. 물론, 데이터베이스 접속 정보를 다른 객체를 사용하여 추상화할 수도 있지만, JNDI를 사용하면 이것들이 보다 더 표준적인 방법으로 가능해진다. JNDI를 사용하면 모든 컴퓨터 자원에 이름을 붙여서 사용할 수 있다. EJB를 사용할 때에도 각각의 EJB에 JNDI 이름을 붙여서 사용하게 된다. JNDI도 제대로 공부하려고 하면 쉽지 않지만, EJB를 사용하는 수준이라면 몇 가지만 알아두어도 된다.

JavaMail은 메일 주고 받기를 자바 환경에서 보다 객체 지향적으로 구현할 수 있도록 해 준다. JavaMail이 가장 많이 쓰이는 용도는 프로그램에서 메일을 자동으로 보내도록 하는 경우인데, 이 정도를 위해서라면 역시 JavaMail에 대해 빠삭하게 알지 않아도 충분한다.

JMS는 point-to-point 메시징을 가능하게 해 주는 API이다. EJB 2.0에서는 JMS를 이용하여 비동기적 EJB를 만들 수 있도록 하고 있다. 메시징 관련 프로그램을 개발하려고 한다면 아주 유용하다.

JTA는 복잡한 작업(transactions)을 효과적으로 관리하는데 사용된다. 예를 들어, A, B, C 세 개의 작업이 연속적으로 행해지다가 C 작업을 수행하는 도중 예외가 발생했다고 하면 A와 B 두 작업을 모두 취소하고 싶은 경우가 있는데 JTA를 사용하면 이런 일들이 가능하다. EJB 컨테이너는 내부적으로 JTA를 사용하여 컨테이너가 알아서 이런 일들을 해 주고 있다. 아주 세밀하게 작업을 조절해야 한다면 JTA를 사용하여 손쉽게 목적을 달성할 수 있다.

JAF, RMI-IIOP, JavaIDL 등은 개발자가 빈번하게 사용해야 하는 요소는 아니지만 다른 것들에 꼭 필요한 요소들이다. JAF는 JavaMail을 사용하기 위해서 필요하고, RMI-IIOP와 JavaIDL은 분산 객체의 기반 프로토콜을 다루는 놈들이다. 따라서, 이것들 자체에 대한 지식은 애플리케이션 레벨에서는 그다지 필요한 것은 아니다.

J2EE의 많은 구성 요소들은 서로가 유기적인 관계를 형성한다. 애플리케이션을 제작하려는 개발자들이 이 모든 것을 알 필요는 없으며, 앞서 예로 든 EJB, 서블릿/JSP, JDBC에 대해서 충분히 알고 나머지 것들은 개념 정도만 이해해도 된다.

J2EE를 위한 환경

J2EE 환경의 엔터프라이즈 급의 개발에서는 EJB를 사용하여 컴포넌트 기반 분산 객체를 만드는 일이 대부분의 작업이다. 사용자 인터페이스 부분은 어떤 것들이라도 가능하다. 독립 자바 애플리케이션, 서블릿, JSP, 애플릿 등 자바 언어로 만들 수 있는 모든 프로그램에서 EJB를 사용할 수 있다.

따라서, J2EE 환경은 EJB를 구동할 수 있는 EJB 컨테이너와 사용자 인터페이스 부분을 지원하는 요소를 포괄하고 있어야 한다. 이런 것들을 우리는 J2EE 웹 애플리케이션 서버라고 부르는데, 대부분의 웹 애플리케이션 서버가 J2EE의 대부분의 스펙을 다 지원하고 있다.

상업용으로는 BEA의 WebLogic, IBM의 WebSphere를 비롯해서 아주 많은 비싼 제품들이 있으며, 비상업용으로 무료이면서 상업용으로 사용하는 경우에는 시스템의 규모에 상관없이 풀 라이센스가 1500달러 수준인 Orion Server가 있다. 공개용으로는 jBoss가 가장 알려졌는데, jBoss는 톰캣과 연동할 수 있다.

따라서, J2EE 환경을 테스트하려면 J2EE 웹 애플리케이션 서버, JDK(Java 2 Standard Edition), JDBC 드라이버, 데이터베이스를 갖추면 된다. 환경 구축에 대해서는 다른 글을 통해 소개하도록 하겠다.

마치며

이미 J2EE 환경은 엔터프라이즈 급 개발의 선두 주자로 급부상하였다. 따라서, 많은 개발자들은 서블릿과 JSP로 웹 사이트를 구축하는 것에 만족하지 말고 EJB를 사용하여 진정한 엔터프라이즈 급 개발자로서 역랑을 확보해야 한다. 웹독스는 앞으로 EJB와 J2EE에 대해서 꾸준히 글을 올리도록 하겠다.

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,034 명
  • 현재 강좌수 :  35,791 개
  • 현재 접속자 :  87 명