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

리눅스와 JAVA

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.gif title02.gif

리눅스에서의 JAVA 사용법

리눅스의 참맛은 서버구축이나 프로그래밍을 리눅스 환경에서 해보면 금방 느낄 수 있을 것입니다.
이러한 환경은 윈도우즈에 비할게 못될 정도로 뛰어납니다.

이곳은 Personal Linuxer라는 제목처럼 개인 PC용으로 리눅스를 쓰고자 하는 이들을 위한 공간이므로
서버로써의 기능 언급은 하지 않겠습니다. 프로그래밍에 관한 전문적인 내용도 다루지 않을 것입니다.

리눅스 환경에서 JAVA를 어떻게 환경 설정해서 사용해야 할지에 대해서만 다루겠습니다.
JAVA 프로그래밍에 관한 내용은 JAVA 전문 사이트를 참조하시길 바랍니다.

icon01.gif title01.gif

gcc는 'GNU C++ Compiler'의 약자로 C나 C++(이하 C)로 만든 소스파일을 Compile하는 프로그램입니다. Java에 대한 코너에 난데없이 C에 관한 내용으로 시작해서 조금은 의아해하리라 생각합니다. Java가 프로그래밍 언어이므로 프로그래밍 언어에 대해 언급한 김에 C를 빼먹고 지나가기가 뭣해서입니다. 사실, Java는 C/C++을 모델로 했기 때문에 C/C++과 매우 비슷하며, 대부분의 문법과 개체 지향 구조가 거의 관련이 있습니다 더불어 현재 프로그래밍 언어의 표준이 되어버린 C를 언급하므로써 이와 비교를 통해 Java를 설명하기 위해서입니다.

  리눅스의 커널은 대부분 C로 구현되어 있습니다. 그러므로 C에 대한 지식만 있다면 사용자도 커널의 구조를 이해할 수 있고 문제점이 생겼을 때 해결할 수도 있습니다. 리눅스용 유틸리티들도 역시 대부분 C로 구현되어 있으며, 소스가 인터넷상에 공개되어 있으므로 마찬가지로 유틸리티에 문제가 생겼을 때도 사용자 개인이 그 문제점을 찾아 고칠 수 있습니다. 하지만 윈도우즈 자체나 윈도우즈용 유틸리티 같은 것은 문제가 생겨나도 고칠 방법이 없으므로, 신 버전을 기다려서 Upgrade를 해야 합니다.

  이쯤되면 왜 Java 코너에서 Java에 대해 언급하기 전에 C에 대해서 먼저 언급하고 있는지 감이 올 것입니다.

  컴퓨터에서 사용되는 파일은 크게 ASCII 형식과 Binary 형식으로 나눌 수 있습니다. ASCII는 사람이 인식할 수 있는 Text로 된 코드로써 이에 대한 표준안을 미국에서 내놓은 것입니다. 즉, ASCII는 American Standard Code for Information Interchange의 약자입니다. 반면에 Binary는 컴퓨터가 인식할 수 있는 이진수로 된 코드입니다.

  확장자가 c나 cpp로 되어 있는 파일은 ASCII 형식의 파일로써 각각 C와 C++ 소스로 되어 있는 파일입니다. 이 파일은 사람만이 인식할 수 있으며, '소스파일'이라고 합니다. 이 소스파일을 컴퓨터가 인식할 수 있는 Binary 형식의 파일로 만들기 위해 Compile하면 확장자가 o로 되어 있는 Binary 형식의 개체파일(object file)을 만듭니다.

소스파일
(name.c / name.cpp)
Compiler
개체파일
(name.o)
소스파일 : 사람이 인식할 수 있는 ASCII 형식의 파일
개체파일 : 컴퓨터가 인식할 수 있는 Binary 형식의 파일

  프로그램을 실행하려면, 그전에 한 단계를 더 거쳐야 합니다. C는 미리 정의된 함수(내장함수)에 대한 개체코드가 들어 있는 함수 라이브러리를 따로 만들어 놓고 있는데, 직접 소스파일을 만들어 Compile한 개체파일에서 사용한 내장함수들은 이러한 라이브러리 함수를 사용하고 있는 것입니다. 즉, 직접 만든 개체파일에 함수 라이브러리에서 가져온 개체코드를 Link해야만 최종 실행파일을 만들 수 있는 것입니다.

개체파일
(name.o)
Linker
실행파일
개체파일 : 소스파일에 대해서만 Compile된 Binary 형식의 파일
실행파일 : 프로그램을 실제로 실행시킬 수 있는 파일

  하지만, 대부분의 C Compiler들은 Compile과 Link의 두 단계 과정을 한 단계에서 하고 있으며, 여기서 소개하고 있는 gcc도 gcc라는 명령 하나만으로 두 단계를 한꺼번에 수행하고 있습니다.

  프로그래밍 언어를 처음 배울때 사용되는 'Hello World'는 1973년 Brian Kernighan이라는 사람이 작성한 'A Tutorial Introduction to the Language B'에서 처음 시작되었다고 합니다. 여기서도 'Hello World'를 출력하는 간단한 소스를 작성해 보는 것으로써 리눅스에서 C를 사용하는 법에 대해 알아보겠습니다.

  우선 사람이 인식할 수 있는 'helloc.c'라는 소스파일을 vi 편집기와 같은 텍스트 편집기를 이용해 아래와 같이 만듭니다.

#include <stdio.h>

main() {
  printf("Hello, World! ");
  return 0;
}

  위에서 만든 'helloc.c'라는 파일은 사람만이 인식할 수 있고 컴퓨터는 인식을 못하므로 컴퓨터가 인식할 수 있는 Binary 파일로 만들기 위해 'gcc'라는 명령을 사용합니다.

[root@localhost /root]# gcc -o helloc helloc.c
[root@localhost /root]# ls -l helloc*
-rwxr-xr-x   1 root     root        11711          수정일 helloc
-rw-r--r--   1 root     root           72          수정일 helloc.c

  gcc 명령에서 '-o' 옵션은 'helloc'처럼 실행파일의 이름을 정해주기 위한 옵션입니다. 제대로 만들어졌는지 ls 명령으로 확인해보면 'helloc.c'라는 파일 외에 새롭게 'helloc'라는 파일이 만들어졌음을 알 수 있습니다. 'helloc'라는 파일은 컴퓨터가 인식할 수 있는 실행파일이으므로 한텀에서 실행시켜보면 결과 값이 출력됩니다.

[root@localhost /root]# ./helloc
Hello, World!

  'helloc' 파일을 실행할때 앞에 적어준 './'은 현재 디렉토리에 있는 파일을 실행시키라는 의미입니다. 'helloc' 파일은 컴퓨터만이 인식할 수 있으므로 텍스트 편집기로 열면 알아볼 수 없는 이상한 글자가 보일 것입니다.

  이로써 간단한 C 프로그래밍에 대한 예제를 살펴보았습니다. 서두에서 말했듯이 이곳은 리눅스 환경에서 C를 Compile하는 방법을 소개하고자 한 것이지 C 프로그래밍에 대한 전문적인 내용을 다루고자 한 것이 아닙니다. C 프로그래밍에 관한 직접적인 내용은 C 전문 사이트를 참조하시길 바랍니다.


icon01.gif title03.gif

  요즘 가장 각광을 받고 있는 프로그램 언어는 아마 Java일 것입니다. 설마 Java에 대해서 들어보지 못한 사람은 없으리라 생각됩니다. Java가 이렇게 뜨고 있는 이유는 여러 가지가 있겠지만 무엇보다도 운영체제에 구애받지 않고 어디서나 쓸 수 있다는 점일 것입니다. Java로 만든다면 윈도우즈용으로 만든 프로그램인지 리눅스용으로 만든 프로그램인지 더 이상 따질 필요가 없는 것입니다.

  이곳은 리눅스에 관한 공간이므로 리눅스에서 Java를 사용하기 위한 내용만 다루겠습니다. 우선 Java를 사용하기 위해서는 Java를 사용할 수 있는 툴(tool)인 JDK가 필요합니다. JDK는 'Java Development Kit'의 약자로 현재 리눅스에서 사용할 수 있는 것으로는 크게 Blackdown에서 만든 것과 IBM에서 만든 것이 있습니다. Blackdown은 예전부터 Sun의 JDK를 Linux로 포팅해 왔으며, 최근에는 Sun의 공식적인 후원하에 공동 개발 진행중입니다. 리눅스용 Blackdown JDK를 다운받기 위해서는 Blackdown 홈페이지인 Java Linux에 접속하면 됩니다.

down.gif
  JDK 내려 받을 수 있는 곳 (Java Linux)

  Java Linux에서 리눅스용 JDK를 내려받은 후 '/usr/local' 디렉토리와 같이 적당한 위치에 압축만 풀면 됩니다. '*.tar.gz'이나 '*.tar.bz2'로 된 파일의 압축을 푸는 자세한 방법은 '한텀' 코너를 참조하세요.

[root@localhost /root]# cd /usr/local
[root@localhost local]# bunzip2 j2sdk-<버전번호>-linux-i386.tar.bz2
[root@localhost local]# tar xvf j2sdk-<버전번호>-linux-i386.tar

  이제 어느 디렉토리위치에서도 JDK의 실행파일을 실행시킬 수 있도록 경로(PATH)를 설정해야 합니다. '/etc/profile' 파일을 텍스트 편집기로 열어서 노란색 글씨 부분을 추가시켜줍니니다.

      ··· 이전 생략 ···
PATH="$PATH:/usr/X11R6/bin:/usr/local/j2sdk<버전번호>/bin"
      ··· 이하 생략 ···

  각각의 PATH는 콜론(:)으로 구분하므로 반드시 콜론(:)을 찍어주고 '/usr/local/j2sdk<버전번호>/bin'를 적어주어야 합니다. 참고로 윈도우즈에서는 세미콜론(;)으로 구분하므로 착오없기 바랍니다.

  하지만 실제로 사용해보면 여기서 설정해준 경로(PATH)가 안 먹습니다. RedHat 기반 리눅스를 'Everything'으로 설치하면 원치 않는 JDK가 설치되기 때문입니다. 실제로 한텀에서 'java -version'이라고 쳐보면 새로 설치한 java보다 낮은 버전이 설치되어 있는 것을 볼 수 있을 것입니니다. 이는 한텀에서 'which java'라고 쳐 봐도 java의 위치가 '/usr/local/j2sdk<버전번호>/bin/java'로 안 되어 있고 '/usr/bin/java'로 되어 있는 것으로 확인할 수도 있습니다.

  물론 새로 설치를 안하고 기본적으로 설치되어 있는 JDK를 그냥 사용해도 되지만, 버전도 낮고, 나중에 Tomcat 등과의 연동을 위해 환경 설정해줄때도 애로 사항이 많기 때문에 RedHat 기반 리눅스에 기본적으로 설치되어 있는 JDK를 삭제해주고 새로 설치할 것을 권합니다. 이는 단순히 '/usr/local/j2sdk<버전번호>/bin' 디렉토리의 파일과 '/usr/bin' 디렉토리 파일을 비교해 보고 '/usr/bin' 디렉토리에 중복된 파일을 찾아서 삭제해 주면 됩니다.

  Java도 프로그래밍 언어이므로 C처럼 ASCII 코드로 만든 소스파일을 Binary 파일로 만들기 위해 Compile의 과정이 필요합니다. 이때 Java에서는 javac를 이용합니다. 이렇게 만들어진 파일을 클래스파일이라고 하며 class란 확장자를 가집니다.

소스파일
(name.java)
Compiler (javac)
클래스파일
(name.class)
소스파일 : 사람이 인식할 수 있는 ASCII 형식의 파일
클래스파일 : 컴퓨터가 인식할 수 있는 Binary 형식의 파일

  앞에서 살펴본 C와 같은 대부분의 프로그래밍 언어들은 Compile할때 운영체제의 시스템 환경에 맞게 Binary 파일로 만듭니다. 따라서 윈도우즈에서 Compile하면 리눅스에서는 사용할 수 없게 되는 것입니다. 만약 윈도우즈에서 사용되는 프로그램을 리눅스에서 사용하려면 소스파일 자체가 필요한데 이 또한 특정 운영체제를 반영하는 코드가 삽입 안 되어있을 경우에만 해당됩니다. 한마디로 운영체제에 의존적일 수 밖에 없습니다.

compile1.gif

  Java에는 JVM(Java Virtual Machine)이라는 것이 있고, Binary 형식으로 된 클래스파일은 운영체제에서 실행되기 전에 중간단계로 JVM에서 먼저 받아서 이 클래스파일을 운영체제에서 다룰 수 있게 바꿔줍니다. 이로써 Binary 파일(클래스파일) 자체가 운영체제를 지원할 필요없이 JVM에 맞게만 해주고, 나머지는 JVM이 모든걸 다해주하는 형태입니다. 다시말해서 어떤 운영체제에서 Compile해도 JVM을 통해서 다른 어떤 운영체제에서든지 사용할 수 있는 것입니다. C처럼 각각의 환경에 맞는 운영체제에서 단독으로 실행이 되는 완전한 형태로 Compile된 것과는 달리 Java처럼 중간단계로 Compile된 형태를 특별히 Byte Code라고 하지만, 여기서는 편이상 Byte Code란 말대신 Binary Code로 통일하겠습니다.

compile2.gif

  'Hello, World!'를 출력하는 Java 프로그램을 만들기 위해 우선 사람이 인식할 수 있는 'HelloJava.java'라는 소스파일을 vi 편집기와 같은 텍스트 편집기를 이용해 아래와 같이 만듭니다.

class HelloJava {
  public static void main (String[] arguments) {
    System.out.println("Hello, World!");
  }
}

  위에서 만든 'HelloJava.java'라는 파일은 사람만이 인식할 수 있고 컴퓨터는 인식을 못하므로 컴퓨터가 인식할 수 있는 Binary 파일로 만들기 위해 'javac'라는 명령을 사용합니다.

[root@localhost /root]# javac HelloJava.java
[root@localhost /root]# ls -l HelloJava.*
-rw-r--r--   1 root     root          425          수정일 HelloJava.class
-rw-r--r--   1 root     root          114          수정일 HelloJava.java

  앞에서 살펴본 gcc 명령처럼 javac 명령을 사용하면 Java에서 사용되는 Birnay 파일을 만들 수 있습니다. 제대로 만들어졌는지 ls 명령으로 확인해보면 'HelloJava.java'라는 파일 외에 새롭게 'HelloJava.class'라는 파일이 만들어졌음을 알 수 있습니다. 이때 만들어진 클래스 파일은 gcc에서 만든 Binary 파일의 실행방법과 좀 다릅니다. Binary 파일 단독으로는 실행이 불가능하고 java라는 명령어 뒤에서 이 Binary 파일을 실행시켜야 합니다. 실행시킬 클래스파일은 class란 확장자를 적어주지 말아야 합니다.

[root@localhost /root]# java HelloJava
Hello, World!

  이로써 간단한 Java 프로그래밍에 대한 예제를 살펴보았습니다. 서두에서 말했듯이 이곳은 리눅스 환경에서 Java를 사용하기 위한 방법을 소개하고자 한 것이지 Java 프로그래밍에 대한 전문적인 내용을 다루고자 한 것이 아닙니다. Java 프로그래밍에 관한 직접적인 내용은 Java 전문 사이트를 참조하시길 바랍니다.


icon01.gif title04.gif

  Java Applet은 HTML 문서내에 포함되어 Java 호환 웹브라우저상에서 수행되는 Java 프로그램을 의미합니다. 'JDK 사용하기'나 'gcc 사용하기'에서 만들어 보았던 프로그램들을 Application이라고 하는데 이들을 웹브라우저상에서 실행되도록 만든 형태를 Applet이라고 보면 됩니다.

  Java Applet도 역시 웹브라우저를 통해 실행이 될뿐이지 컴퓨터가 인식해야 하므로 Binary 형식으로 HTML 문서내에 포함시켜야 합니다. 즉, Java를 지원하는 웹브라우저에서만 실행이 됩니다. 현재 가장 많이 쓰이고 있는 웹브라우저인 네스케이프와 인터넷 익스플로러가 모두 Java를 지원해주고 있어서 별 의식없이 쓰고 있을 뿐입니다.

  HTML 문서내에 Java Applet을 삽입시키기 전에 우선 사람이 인식할 수 있는 'HelloApplet.java'라는 소스파일을 vi 편집기와 같은 텍스트 편집기를 이용해 아래와 같이 만듭니다.

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;

public class HelloApplet extends java.applet.Applet implements Runnable {

  Font f = new Font("TimesRoman", Font.BOLD, 48);
  Color colors[] = new Color[50];
  Thread runner;

  public void start() {
    if (runner == null) {
      runner = new Thread(this);
      runner.start();
    }
  }

  public void stop() {
    runner = null;
  }

  public void run() {
    float c = 0;
    for (int i = 0; i < colors.length; i++) {
      colors[i] = Color.getHSBColor(c, (float)1.0, (float)1.0);
      c += .02;
    }

    int i = 0;
    Thread thisThread = Thread.currentThread();
    while (runner == thisThread) {
      setForeground(colors[i]);
      repaint();
      i++;
      try {
        Thread.sleep(200);
      } catch (InterruptedException e) { }
      if (i == colors.length)
        i = 0;
    }
  }

  public void paint(Graphics screen) {
    screen.setFont(f);
    screen.drawString("Hello, World!", 15, 50);
  }
}

  소스의 내용이 다소 깁니다. 하지만 이곳은 단지 Java Applet을 사용하는 방법을 알려주는 공간이지 Java Applet의 문법 구조를 파악하기 위한 공간이 아닙니다. 'JDK 사용하기'나 'gcc 사용하기'에서 만들어 보았던 것처럼 HTML로도 충분히 만들 수 있는, 단순히 'Hello, World!'만을 웹페이지에 출력하는 Java Applet을 만든다면 Java Applet의 참맛을 느끼기 어려울 것 같아 색이 변하는 Java Applet 소스를 보인 것입니다.

  위에서 만든 'HelloApplet.java'라는 파일은 사람만이 인식할 수 있고 컴퓨터는 인식을 못하므로 컴퓨터가 인식할 수 있는 Binary 파일인 클래스파일로 만들기 위해 'javac'라는 명령을 사용합니다.

[root@localhost /root]# javac HelloApplet.java
[root@localhost /root]# ls -l HelloJava.*
-rw-r--r--   1 root     root         1388          수정일 HelloApplet.class
-rw-r--r--   1 root     root          996          수정일 HelloApplet.java

  제대로 만들어졌는지 ls 명령으로 확인해보면 HelloApplet.java라는 파일 외에 새롭게 HelloApplet.class라는 파일이 만들어졌음을 알 수 있습니다. HelloApplet.class라는 파일을 HTML 문서내에 삽입시키기 위해서는 <applet>이란 태그를 사용하여 삽입시킬 클래스파일명을 code라는 속성에 적어주면 됩니다.

<applet code="HelloApplet.class" width="342" height="68">
</applet>

 

  JDK에는 appletviewer라 하여 Java Applet을 실행시켜주는 실행파일이 있습니다. appletviewer는 HTML 문서내에서 <applet>에 해당하는 태그만 실행시켜주는 프로그램입니다. 위에서 만들어준 <applet> 태그의 내용이 'HelloApplet.html'에 삽입되어 있을때 실행시키려면 아래와 같이 한텀에서 실행시키면 됩니다.

[root@localhost /root]# appletviewer HelloApplet.html

 
icon01.gif title05.gif

  흔히들 Java Script는 Java와 다르다고들 합니다. 실제로 Java는 프로그래밍 언어인데 비해 Java Script는 말그대로 스크립트 언어이고, 단지 스크립트 문법으로 Java 문법을 사용할 뿐입니다. 프로그래밍 언어는 컴퓨터가 인식할 수 있는 코드로 된 Binary 형태로 Compile해서 사용해야 하는데 비해 스크립트는 사람이 인식할 수 있는 ACII 코드 형태를 그대로 사용하는 언어입니다.

  하지만 저는 Java Script도 하나의 Java로 보고 있습니다. Java Script 역시 기본적으로 Java의 문법구조를 거의 그대로 사용하기 때문입니다. 스크립트에서 Java의 문법을 사용한다기 보다는 저는 오히려 Java가 스크립트 형태로도 쓰인다고 보고 싶습니다. 그만큼 Java가 여러 형태로 충분히 사용될 수 있음을 보여주는 한 예라고 생각합니다.

  나중에 설명하겠지만, Java Script를 Java와 다른 걸로 본다면 JSP 역시 Java라고 할 수 없는 것입니다. JSP 역시 Compile 없이 소스 그대로 서버에서 쓰이기 때문입니다. 하지만 JSP는 Java의 일종으로 보는 견해가 더 많습니다. 그런데 유독 Java Script만 Java와 다른 걸로 본다면 모순이지 않냐고 생각합니다. 둘다 Compile 없이 소스 그대로 쓰지만 Java Script는 웹브라우저에서, JSP는 JSP엔진에서 해석되어서 실행됩니다.

  Java Script는 컴퓨터가 인식할 수 있는 Binary 형식이 아님에도 불구하고 실행이 되는 이유는 웹브라우저에서 Java Script를 지원하기 때문입니다. 요즘 대부분의 웹브라우저는 자체적으로 Java Script로 쓰여진 코드를 컴퓨터가 인식할 수 있게 해석하여 실행시켜줍니다.

  Java Script는 <script> 태그를 사용하며, 속성으로 language="JavaScript"라고 하면 됩니다. 보통 Java Script에 쓰이는 <script> 태그는 <head>와 </head> 태그 사이에 두는 것이 일반입니다. 사실 어디에 두어도 상관없지만 Java Script가 미처 해석되기 전에 실행되는 것을 막기 위해서입니다. 보통 웹브라우저에서는 html 문서를 읽을때 <head>와 </head> 태그에 있는 정보들부터 읽어들입니다.

  HTML 문서내에 <script>와 </script> 태그를 만들어주고 이 사이에 Java Script에서 쓸 소스를 HTML 코딩하듯이 적어주면 됩니다. 아래는 'Hello, World!'란 문구가 우에서 좌로 스크롤되는 예제를 위한 소스입니다.

<script language="JavaScript">
  var msg = "Hello, World!"
  var timer_id = null
  var running_flag = false
  var waiting_time = 100

  for(i = 0; i < 40; i++)
    msg = " " + msg

  function scrollHello() {
    document.myform.Hello.value = msg.substring(0, 39)
    msg = msg.substring(1, msg.length) + msg.substring(0, 1)
    timer_id = setTimeout("scrollHello()", waiting_time)
    running_flag = true
  }

  function stopHello() {
    if(running_flag)
      clearTimeout(timer_id)
    running_flag = false
  }

  function startHello() {
    stopHello()
    scrollHello()
  }
</script>

  <script>와 </script> 태그 사이에 정의 해준 Java Script를 실행시키기 위해 <body>에 onLoad="startHello()"라는 속성을 주어서 startHello() 함수를 불러 들이고, 적당한 위치에 <form> 태그를 사용해서 실행시킵니다.

<body onLoad="startHello()">

<form name="myform">
  <input type="text" name="Hello" size="15">
</form>

  아래는 실제로 HTML 문서에 삽입된 Java Script가 실행되는 모습을 보여주는 예입니다.


icon01.gif title06.gif

  지금까지는 개인 PC 컴퓨터에서 사용되는 Java 프로그래밍 사용법에 대해서 알아보았습니다. 리눅스는 서버 기능이 막강한 운영체제이기 때문에 서버에서 Java를 사용하는 방법을 언급하지 않을 수 없습니다.

  현재 Java를 서버에 활용하기 위해 Java Servlet과 JSP라는 형태로 활발히 개발중입니다. Java를 사용하기 위해서는 JDK와 같은 툴이 필요한데, 여기에 서버측에서 사용되는 Java인 Java Servlet과 JSP를 사용하려면 Servlet/JSP Engine이 필요합니다. 이러한 기능을 지원하는 프로그램은 많이 있지만, 리눅스 사용자라면 Tomcat이 가장 좋은 프로그램이라고 생각합니다. 리눅스에서 가장 많은 사용자를 확보하고 있는 웹서버 프로그램은 Apache입니다. Tomcat은 Apache를 개발한 개발자들이 Jakarta 프로젝트 일환으로 개발 진행중이므로 다른 어떤 Servlet/JSP Engine 보다 Apache를 잘 지원하며, 연동이 잘 됩니다. Jakarta는 Java 기반의 보다 포괄적인 플랫폼을 제공하기 위한 프로젝트이고 Tomcat은 Jakarta 프로젝트에 속한 작은 프로젝트입니다.

  Tomcat은 The Jakarta Project 홈페이지에서 무료로 다운받을 수 있습니다. Servlet/JSP Engine만 쓴다면 Tomcat만 다운받으면 되겠지만, Apache와 연동을 하려면 'mod_jserv_tomcat.so'이라는 module 파일도 같이 다운 받아야 합니다.

down.gif
  Tomcat 내려 받을 수 있는 곳 (The Jakarta Project)

  The Jakarta Project에서 리눅스용 Tomcat을 내려받은 후 '/usr/local' 디렉토리와 같이 적당한 위치에 압축을 풉니다. '*.tar.gz'로 된 파일의 압축을 푸는 자세한 방법은 '한텀' 코너를 참조하세요.

[root@localhost /root]# cd /usr/local
[root@localhost local]# gunzip jakarta-tomcat<버전번호>.tar.gz
[root@localhost local]# tar xvf jakarta-tomcat<버전번호>.tar

  JDK에서 Tomcat의 라이브러리 파일을 쓸 수 있도록 CLASSPATH를 지정해주어야 합니다. Java와 Tomcat의 홈디렉토리도 지정해주어야 합니다. '/etc/profile' 파일을 텍스트 편집기로 열어서 아래의 내용을 추가시켜줍니니다.

      ··· 이전 생략 ···
JAVA_HOME=/usr/local/j2sdk<버전번호>
TOMCAT_HOME=/usr/local/jakarta-tomcat<버전번호>
PATH="$PATH:/usr/X11R6/bin:/usr/local/j2sdk<버전번호>/bin"
CLASSPATH=".:/usr/local/j2sdk<버전번호>/lib/tools.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/ant.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/jasper.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/jaxp.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/parser.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/servlet.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/test"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/lib/webserver.jar"
CLASSPATH="$CLASSPATH:/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT/WEB-INF/classes"
      ··· 이하 생략 ···

  위에서 aqua색으로 되어 있는 PATH 부분은 JDK를 설치할때 정해주었던 경로입니다. JDK를 설치하는 방법은 'JDK 사용하기'를 참조하시기 바랍니다. 여기서는 JDK가 '/usr/local'에 설치되어 있다는 가정하에 설명하겠습니다.

  CLASSPATH는 '/usr/local/j2sdk<버전번호>/lib' 디렉토리에 있는 'tools.jar' 파일과 '/usr/local/jakarta-tomcat<버전번호>/lib' 디렉토리에 있는 모든 파일에 대해서 적어줍니다. Tomcat의 버전에 따라 CLASSPATH의 내용이 좀 다를 수 있습니다. '.'은 현재 디렉토리를 의미합니다. 노란색부분은 Tomcat에서 사용할 클래스 파일을 JDK로 만들때 경로를 잡아주기 위한 CLASSPATH 경로입니다. 여기서 각각의 CLASSPATH를 한줄씩 나눠서 적었는데 이는 내용이 너무 많아서 보기 쉽게 하기 위해서 사용한 것이고 CLASSPATH 역시 콜론(:)으로 구분합니다.

  Java Servlet으로 사용할 소스파일을 Compile하기 위해서는 'servlet.jar'란 파일이 필요합니다. 이 파일은 Tomcat을 설치하게 되면 '/usr/local/jakarta-tomcat<버전번호>/lib' 디렉토리에 있으며, '/usr/local/j2sdk<버전번호>/jre/lib/ext' 디렉토리로 복사하면 됩니다.

  Tomcat을 이용해서 Servlet과 JSP가 지원되는 웹서버를 사용하기 위해서는 우선 Tomcat을 실행시켜야 합니다. 한텀에서 아래와 같이 쳐주면 됩니다.

[root@localhost /root]# cd /usr/local/jakarta-tomcat<버전번호>/bin
[root@localhost bin]# ./startup.sh

  웹서버는 일반적으로 80 포트를 사용합니다. 하지만, Tomcat은 기존에 사용중인 웹서버와의 충돌을 피하기 위해 8080 포트를 사용합니다. 그러므로 제대로 실행이 되는지 확인을 하기 위해서는 네스케이프의 URL 입력란에 'http://localhost:8080'이라고 쳐주어야 합니다. 그러면 Tomcat설치시에 제공하는 index 화면이 보일 것입니다. 'http://localhost'는 웹서버를 운영 안 하고 있는 사용자의 로컬 컴퓨터의 홈페이지를 볼 때 사용하는 URL입니다.

  Tomcat을 설치후 기본적으로 제공되는 Servlet과 JSP의 샘플을 보려면 네스케이프의 URL 입력란에 아래와 같이 쳐주면 됩니다.

http://localhost:8080/examples/servlets
http://localhost:8080/examples/jsp

  이로써 Tomcat 설치가 모두 끝났습니다. 하지만, 이는 웹서비스로 Apache를 기본값으로 쓰고, 8080 포트로 접속할때만 Tomcat을 쓰겠다는 것입니다. 물론, Tomcat의 포트 번호를 80으로 고쳐서 기본 웹서버로 바꿀 수도 있지만, 그렇게 하면 Apache가 가지는 뛰어난 웹서비스 기능을 쓰지 않겠다는 것이 되므로 이보다는 기본 웹서버로는 Apache로 쓰고, Tomcat을 Apache에 연동시키는 것이 더 좋은 방법입니다. Tomcat을 Apache에 연동시키기 전에 먼저 Tomcat의 실행을 중지시키겠습니다.

[root@localhost /root]# cd /usr/local/jakarta-tomcat<버전번호>/bin
[root@localhost bin]# ./shutdown.sh

  Tomcat을 Apache와 연동시키려면 Tomcat을 다운받은 The Jakarta Project에서 리눅스용 'mod_jserv_tomcat.so'이라는 module 파일도 같이 다운 받아야 합니다. 이 파일을 '/usr/lib/apache' 디렉토리에 옮겨주고 '/usr/local/jakarta-tomcat<버전번호>/conf/tomcat.conf' 파일에서 이 module 파일의 위치를 고쳐 주어야 합니다.

      ··· 이전 생략 ···
LoadModule jserv_module modules/mod_jserv_tomcat.so
      ··· 이하 생략 ···

  '/usr/local/jakarta-tomcat<버전번호>/conf/tomcat.conf' 파일에는 'mod_jserv.so' 파일의 위치가 'libexec' 디렉토리로 되어 있지만, 실제로 여기서는 'mod_jserv.so' 파일이 아닌 'mod_jserv_tomcat.so' 파일을 '/usr/lib/apache' 디렉토리에 옮겨주었습니다. Tomcat 3.1.X 이전 버전에는 'mod_jserv.so'을 사용했지만, Tomcat 3.1.X 이후 버전부턴 'mod_jserv_tomcat.so'을 권합니다. '/usr/lib/apache' 디렉토리는 '/etc/httpd/modules'에서 symbolic link되어 있으므로 위의 노란색글씨로 되어 있는 부분처럼 원래 적혀 있던 'libexec'을 'modules'로 고쳐주어야 합니다. 이는 RedHat 기반 리눅스에 기본적으로 설치되어 있는 Apache의 경로가 Apache 홈페이지에서 제공하는 Apache의 경로와 다르기 때문입니다.

  위에서 고쳐준 '/usr/local/jakarta-tomcat<버전번호>/conf/tomcat.conf' 파일이 Apache의 환경설정에 적용되도록 텍스트 편집기로 '/etc/httpd/conf/httpd.conf' 파일을 열어서 아래의 내용을 파일끝에 삽입시켜야 합니다.

Include /usr/local/jakarta-tomcat<버전번호>/conf/tomcat.conf

  새로 고쳐준 내용이 적용되도록 Apache를 재실행합니다. 리눅스 운영체제 자체를 재실행시켜도 됩니다.

[root@localhost /root]# cd /etc/rc.d/init.d
[root@localhost bin]# ./httpd restart

  Servlet/JSP Engine을 사용하려면 Tomcat을 단독으로 쓸때처럼 실행시키면 됩니다.

[root@localhost /root]# cd /usr/local/jakarta-tomcat<버전번호>/bin
[root@localhost bin]# ./startup.sh

  이제 Tomcat이 Apache에 연동되었으므로 더 이상 'http://localhost:8080'처럼 8080 포트로 접속하겠다는 것을 적어둘 필요없이 'http://localhost'라고만 적어도 됩니다. 즉, Servlet과 JSP의 샘플을 볼때 네스케이프의 URL 입력란에 ':8080'없이 아래와 같이 쳐주기만 하면 됩니다.

http://localhost/examples/servlets
http://localhost/examples/jsp

  Tomcat을 Apache에 연동시킨 후에도 Servlet/JSP Engine을 중지시키는 방법은 단독으로 Tomcat을 실행시켰을때와 같이 중지시키면 됩니다.

[root@localhost /root]# cd /usr/local/jakarta-tomcat<버전번호>/bin
[root@localhost bin]# ./shutdown.sh

  html 문서는 Apache가 있는 디렉토리에, Servlet과 JSP 문서는 Tomcat이 있는 디렉토리에 나눠서 사용해야 합니다. 이러다 보면 작업하는데 오히려 불편합니다. Tomcat이 Apache에 연동이 되었지만, 단독으로 8080 포트로도 접속이 가능합니다. 그러므로 차라리 모든 작업을 Tomcat이 있는 디렉토리에서 하고 8080 포트로 테스트한 후 나중에 html 문서와 Servlet/JSP 문서를 해당 디렉토리로 나눠주는 것을 더 권하고 싶습니다. 웹서버를 운영하지 않고 단지 공부를 위해서 사용한다면 8080 포트로만 사용는 것도 좋은 방법입니다. 뒤에 다룰 Servlet과 JSP의 예제는 8080 포트로 설명하겠습니다. 보다 간단한 방법은 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT' 디렉토리밑에 'jsp'와 같이 적당한 디렉토리를 만들고 이 디렉토리에 모든 웹문서 (HTML, Servlet/JSP 문서 등)를 모아놓고 이 디렉토리에 대한 symbolic link를 '/var/www/html'(레드햇 리눅스 6.X 이전의 경우에는 '/home/httpd/html')에 만드는 것도 좋은 방법입니다. 물론 반대로 symbolic link를 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT'에 만들어도 됩니다.

[root@localhost /root]# cd /var/www/html
[root@localhost html]# ln -s /usr/local/jakarta-tomcat<버전번호>/webapps/ROOT/jsp jsp

  이것도 싫다면 아예 Apache의 DocumentRoot의 위치를 Tomcat이 있는 위치로 바꿔주는 방법도 있습니다. '/etc/httpd/conf/httpd.conf' 파일을 텍스트 편집기로 열어서 노란색 부분처럼 Tomcat의 DocumentRoot로 바꿔줍니다. 리눅스의 환경 설정은 사용자가 만들어 가는 것이지 이거다 하는 정해진 규칙이 없기 때문에 이외에도 여러 방법이 더 있을 수 있습니다.

      ··· 이전 생략 ···
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT"
      ··· 이하 생략 ···

  마지막으로 한가지 더 설정해줄 것이 있습니다. 웹페이지 기본문서를 JSP 파일로 만들어주는 일입니다. '/etc/httpd/conf/httpd.conf' 파일을 텍스트 편집기로 열어서 'index.jsp' 파일도 기본 문서로 사용될 수 있게 아래의 노란색 부분을 추가 시켜줍니다. 물론 첫 시작 페이지가 JSP 파일이 아니라면 구지 이렇게 고쳐줄 필요는 없습니다.

      ··· 이전 생략 ···
# DirectoryIndex: Name of the file or files to use as a pre-written HTML
# directory index. Separate multiple entries with spaces.
#
DirectoryIndex index.html index.htm index.shtml index.cgi index.jsp
      ··· 이하 생략 ···

icon01.gif title07.gif

  Java Servlet은 웹서버에서 실행되는 Binary 파일입니다. 즉, Java Applet이 웹서버에서 사용되는 형태를 Java Servlet이라고 보면 됩니다. 보다 정확하게 말하면 Java Servlet도 일종의 CGI이며, 기존 CGI의 여러 단점들을 보완하여 Java로 만든 것이 바로 Java Servlet입니다.

  웹에서 쓰이는 일반적인 문서는 Client의 컴퓨터로 모든 내용이 다운받아진 후 Client의 웹브라우저를 통해서 실행이 됩니다. 하지만, Java Servlet 문서는 서버에 있는 Servlet Engine에 의해 실행되고 결과값만 Client의 컴퓨터로 다운로드 되어집니다.

Client









일반
문서
 

Servlet
Engine

Servlet
문서

  Java Applet은 Client의 웹브라우저?통해서 실행이 되므로 웹브라우저가 Java를 지원해야 하며, 지원하는 웹브라우저라도 Java를 얼마만큼 지원하는냐에 따라서 사용의 제한이 있습니다. 하지만 Java Servlet은 서버에서 실행되므로 Client의 웹브라우저가 Java를 지원하는지, 또 얼마만큼 지원하는지 고려하지 않아도 됩니다. Java Servlet은 모든걸 실행하고나서 결과값만 HTML 형식으로 Client의 컴퓨터로 전송하므로 실행시킬 Binary 파일까지 다운로드 받아야 하는 Java Applet보다 상대적으로 속도가 더 빠릅니다.

  물론 Java Servlet을 웹서버에서 사용하기 위해서는 컴퓨터가 인식할 수 있는 Binary 형식으로 Compile해주어야 합니다. 그리고, Java Servlet을 지원해주는 Servlet Engine이 서버에 설치되어 있어야 합니다. 여기서는 Servlet Engine으로 Tomcat을 사용하겠습니다.

  사용자의 이름을 받아서 'Hello, World!'란 문구에서 'World!' 대신 사용자의 이름이 출력되는 예제를 Java Servlet으로 만들어보겠습니다. 우선 사용자의 이름을 입력받을 'HelloServlet.html'이라는 HTML 문서를 텍스트 편집기를 이용해 아래와 같이 만듭니다.

<html>
<head>
<title>Personal Linuxer</title>
</head>
<body>
<p>이름이 무엇입니까?</p>
<form method="get" action="servlet/HelloServlet">
  <input type="text" name="name">
  <input type="submit">
</form>
</body>
</html>

  <form> 태그를 이용해서 사용자의 이름을 입력받고 action 속성으로 HelloServlet이라는 Java Servlet을 실행시키는 HTML 코드입니다. 여기서 실행을 위해 사용하는 파일은 HelloServlet.class라는 클래스파일을 사용하지만 class란 확장자는 생략해 주어야 합니다. Tomcat을 '/usr/local'에 설치하였다면 위에서 만든 'HelloServlet.html'이라는 파일을 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT' 디렉토리에 위치시키고, 네스케이프(모질라)의 URL 입력란에 'http://localhost:8080/HelloServlet.html'이라고 치면 아래와 같은 화면이 뜹니다.

servlet1.gif

  이제 'HelloServlet.html' 파일에서 입력한 사용자 이름에 맞게 'Hello, World!'를 출력하는 Java Servlet을 위한 'HelloServlet.java'라는 소스파일을 텍스트 편집기를 이용해 아래와 같이 만듭니다.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    String name = req.getParameter("name");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Personal Linuxer</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("Hello, " + name);
    out.println("</body></html>");
  }
}

  위에서 만든 'HelloServlet.java'라는 파일은 사람만이 인식할 수 있고 컴퓨터는 인식을 못하므로 컴퓨터가 인식할 수 있는 Binary 파일인 클래스파일로 만들기 위해 'javac'라는 명령을 사용합니다.

[root@localhost classes]# javac HelloServlet.java
[root@localhost classes]# ls -l HelloServlet.*
-rw-r--r--   1 root     root         1123          수정일 HelloServlet.class
-rw-r--r--   1 root     root          587          수정일 HelloServlet.java

  제대로 만들어졌는지 ls 명령으로 확인해보면 HelloServlet.java라는 파일 외에 새롭게 HelloServlet.class라는 파일이 만들어졌음을 알 수 있습니다. 위에서 만든 'HelloServlet.class'란 파일을 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT/WEB-INF/classes' 디렉토리에 위치시키고, HelloServlet.html'이란 파일을 불러온 네스케이프(모질라)에서 사용자 입력값으로 'yb2u'을 입력하면 아래와 같은 결과가 나옵니다.

servlet2.gif

  실제로 Java Servlet이 실행되는 예제를 사용해보길 원하면 아래를 클릭하세요.

exec.gif
  Java Servlet 예제 실행하기

icon01.gif title08.gif

  JSP는 'Java Server Page'의 약자로 서버에서 실행되는 서버측 Script입니다. Java Script를 서버에서 실행되게끔 만든 형태라고 생각하면 됩니다. 물론 사용법은 좀 틀립니다. 우선 겉모습부터 <%와 %>를 사용해서 이 안에 Java 구문을 적어서 사용합니다.

  JSP는 Java Servlet을 보다 쉽게 사용하기 위해 Compile을 하지 않고 바로 소스 코드상태에서 사용할 수 있도록 Java Servlet을 발전시킨 형태입니다. 서버측에 설치되어 있는 JSP Engine이 JSP 소스를 분석해서 Java Servlet에서 사용되는 클래스파일 형태로 Compile을 대신해줍니다. 그리고 이 클래스파일이 다시 Servlet Engine에 의해 서버에서 실행이 되는 것입니다. 그러므로 Servlet/JSP Engine이 서버에 설치되어 있어야 합니다. 여기서는 Servlet/JSP Engine으로 Tomcat을 사용하겠습니다.

  JSP는 단순히 Servlet에서 사용되는 클래스파일로 Compile하는 과정만 거치지 않게 수정된 것이 아니라 구문자체도 훨씬 사용하기 쉬워졌습니다. Java Servlet은 Java 코드 속에 HTML 코드를 넣어야 하는 단점이 있는데, JSP는 HTML 문서내에 Java 코드를 넣는 형식으로 된 서버측 Script입니다. 앞에서 살펴본 Java Servlet에서는 <html>라는 태그를 하나 삽입시키는데에도 'out.println("<html>");'와 같이 긴 구문이 필요합니다. 또한 약간의 수정을 할려고 해도 매번 새로 Compile해야 하는 번거로움이 있습니다.

  'Hello, World!'란 문구를 사용자가 원하는 횟수만큼 출력시키는 예제를 JSP로 만들어보겠습니다. 우선 사용자가 원하는 횟수를 입력받는 'HelloJSP.html'이라는 HTML 문서를 텍스트 편집기를 이용해 아래와 같이 만듭니다.

<html>
<head>
<title>Personal Linuxer</title>
</head>
<body>
<p>'Hello, World!' 출력 횟수는?</p>
<form method="get" action="HelloJSP.jsp">
  <input type="text" size="2" name="numtimes">
  <input type="submit">
</form>
</body>
</html>

  <form> 태그를 이용해서 사용자가 원하는 횟수를 입력받고 action 속성으로 HelloJSP.jsp라는 JSP 파일을 실행시키는 HTML 코드입니다. Tomcat을 '/usr/local'에 설치하였다면 위에서 만든 'HelloJSP.html'이란 파일을 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT' 디렉토리에 위치시키고, 네스케이프(모질라)의 URL 입력란에 'http://localhost:8080/HelloJSP.html'이라고 치면 아래와 같은 화면이 뜹니다.

jsp1.gif

  이제 'HelloJSP.html' 파일에서 입력한 횟수에 맞게 'Hello, World!'를 출력하는 JSP 파일인 'HelloJSP.jsp'라는 소스파일을 텍스트 편집기를 이용해 아래와 같이 만듭니다.

<%@ page language="java" %>
<html>
<head>
<title>Personal Linuxer</title>
</head>
<body>
<%
  int numTimes = Integer.parseInt(request.getParameter("numtimes"));
  for (int i = 0; i < numTimes; i++) {
%>
    Hello, World!<br>
<%
  }
%>
</body>
</html>

  위에서 만든 'HelloJSP.jsp'라는 파일을 '/usr/local/jakarta-tomcat<버전번호>/webapps/ROOT' 디렉토리에 위치시키고, HelloJSP.html'이란 파일을 불러온 네스케이프(모질라)에서 횟수 입력값으로 '5'를 입력하면 아래와 같은 결과가 나옵니다.

jsp2.gif

관련자료

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

공지사항


뉴스광장


  • 현재 회원수 :  60,035 명
  • 현재 강좌수 :  35,798 개
  • 현재 접속자 :  111 명