> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/external-procedure-guide/java-external-procedures/executing-java-external-procedures.md).

# Java External Procedure 사용

생성된 Java External Procedure를 사용하여 Java 애플리케이션 프로그램을 작성하는 방법을 설명합니다.

일반적으로 Java를 이용하여 클래스 파일을 생성하고 패키징 과정을 거치면 애플리케이션 프로그램을 개발할 수 있습니다. 또한 데이터베이스에 단순히 Java 객체를 생성함으로써 별도의 컴파일 및 패키징 과정 없이 다양한 용도의 애플리케이션 프로그램으로 작성할 수도 있습니다.

## 기본적인 **Java** 애플리케이션 프로그램

### 개발 방법

사용자는 일반적으로 Java 애플리케이션 프로그램을 개발하는 방법과 마찬가지로 애플리케이션 프로그램을 작성할 수 있습니다.

예를 들면 다음과 같습니다.

```
SQL> CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaExtproc" AS
     public class SimpleMath {
         public static int findMax(int x, int y) { 
             if (x >= y) return x;
             else return y;
         }
     }
     /
```

{% hint style="warning" %}
주의

Java 애플리케이션 프로그램을 개발할 때 주의해야 할 두 가지 사항이 있습니다.

* 정적(static) 전역 변수를 사용할 수 없으며, 사용할 경우 예상치 못한 오동작이 발생할 수 있습니다.
* 사용자 Java 클래스를 PSM 함수로 대응시키기 위해서는 반드시 정적 함수로 선언해야 합니다.
  {% endhint %}

### **Java** 출력 전송

사용자는 **DBMS\_JAVA** 패키지를 사용하여 Java 애플리케이션 프로그램의 출력 내용을 콘솔 화면으로 확인할 수 있습니다.

예를 들면 다음과 같습니다.

```
SQL> CREATE OR REPLACE AND RESOLVE Java SOURCE NAMED "JavaExtproc" AS
     public class SimplePrint {
         public static void printMax(int x, int y) { 
         if (x >= y) System.out.println("Max="+x); 
         else System.out.println("Max="+y);
         }
     }
     /
Java Source 'JavaExtproc' created.

SQL> CREATE OR REPLACE PROCEDURE print_max(x pls_integer, y pls_integer) IS 
     LANGUAGE JAVA NAME 'SimplePrint.printMax(int, int)';
     /
Procedure 'PRINT_MAX' created.

SQL> set serveroutput on
SQL> call dbms_java.set_output(2000); 

PSM called.

SQL> BEGIN print_max(1, 2); END;
     / 
Max=2

PSM completed.

SQL>
```

{% hint style="info" %}
**참고**\
DBMS\_JAVA 패키지에 대한 자세한 내용은 "[Tibero tbPSM 참조 안내서](/tibero-manuals/7.2.6.manuals/tbpsm-reference-guide.md)"를 참고합니다.
{% endhint %}

## Internal JDBC Driver

사용자는 JDBC 인터페이스를 이용하여 애플리케이션 프로그램을 개발할 수 있는 것처럼 Java 객체 내부에 **Internal JDBC Driver**를 사용할 수 있습니다. Java External Procedure는 새롭게 데이터베이스 서버와 연결하여 통신하는 일반적인 형태의 JDBC 프로그램이 아닌 기존 트랜잭션을 이용할 수 있는 Internal JDBC Driver를 사용할 수 있습니다.

### 데이터베이스 서버와 연결

일반적인 JDBC 인터페이스의 연결 과정은 다음과 같습니다.

```
Connection conn = DriverManager.getConnection("jdbc:tibero:localhost:9999:tibero",
                                              "tibero", "tibero");

```

Internal JDBC Driver를 사용하는 방법은 다음과 같습니다.

```
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
```

기존의 JDBC 인터페이스의 방식을 사용하는 경우에는 현재 트랜잭션에 참여하지 못하고 새로운 세션으로 시작하게 됩니다. 그러나 Internal JDBC Driver를 사용하는 경우에는 현재 트랜잭션에 참여하여 아직 커밋되지 않은 내용까지도 커밋하거나 롤백할 수 있습니다.

Internal JDBC Driver를 사용하여 데이터베이스 서버에 연결하고 나면, 일반적인 JDBC 인터페이스를 사용하는 방식 그대로 사용할 수 있습니다.

### 사용 예제

다음은 Internal JDBC Driver를 사용하여 Java 애플리케이션 프로그램을 작성한 예입니다.

```
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "TestInternal" as
import java.sql.*; 
import java.io.*;

public class POManager
{
   public static void addCustomer (int custNo, String custName, String city) 
   throws SQLException
   {
       String sql = "INSERT INTO Customers VALUES (?,?,?)"; 
       try
       {
         Connection conn = DriverManager.getConnection("jdbc:default:connection:");
       
         PreparedStatement pstmt = conn.prepareStatement(sql); 
         pstmt.setInt(1, custNo);
         pstmt.setString(2, custName); 
         pstmt.setString(3, city); 
         pstmt.executeUpdate(); 
         pstmt.close();
       }
       catch (SQLException e) { 
          System.err.println(e.getMessage());
       }
   }
}
```
