JAVA 2 JDBC 프로그래밍 2001.11.29 Sookyoung Park
JDBC 프로그래밍 목차 SQL 기본 JDBC 기초 클래스들 2-tier/3-tier 모델과 트랜잭션 JDBC 응용 프로그램
SQL 기본 SQL(Structured Query Lanuage) 역할 SEQUEL(Structured Englih QUEry Language)에 연유 역할 데이터 정의: DDL(Data Definition Language) 데이터 조작: DML(Data Manipulation Language) 제어기능
DDL(Data Definition Language) SQL 기본 - DDL DDL(Data Definition Language) 테이블: SQL이 기본적으로 처리하는 대상 기본 테이블 DDL 문장에 의해 만들어진 테이블 이름을 가지고 있으며 독자적으로 존재 가능 뷰 DDL 문장으로 만들어지지만, 기본 테이블로부터 유도되는 가상 테이블 임시 테이블 질의문 처리 과정의 결과로 만들어지는 테이블 SQL 에서 사용할 수 있는 DDL 문장 CREATE TABLE, DROP TABLE, ALTER TABLE CREATE INDEX, DROP INDEX
Create Table 문장 기본 테이블 생성 형태 SQL이 지원하는 데이터 타입 예제 SQL 기본 - DDL Create Table 문장 기본 테이블 생성 형태 SQL이 지원하는 데이터 타입 INTEGER, SMALLINT, FLOAT(n), DECIMAL(i,j), CHAR(n), VARCHAR(n), DATE, TIME 예제 CREATE TABLE 기본_테이블_이름 (열_이름 데이터_타입 [NOT NULL] {, 열_이름 데이터_타입 [NOT NULL]}*); create table orders (order_num integer, cost integer, quantity integer);
Drop Table 문장 생성된 기본 테이블 제거 형태 예 DROP TABLE 기본_테이블_이름; SQL 기본 - DDL Drop Table 문장 생성된 기본 테이블 제거 형태 예 DROP TABLE 기본_테이블_이름; drop table orders;
Alter Table 문장 생성된 테이블에 새로운 열 추가 형태 예 ALTER TABLE 테이블_이름 SQL 기본 - DDL Alter Table 문장 생성된 테이블에 새로운 열 추가 형태 예 ALTER TABLE 테이블_이름 ADD 열_이름 데이터_타입; alter table orders add address varchar(60);
Create Index 문장 데이터베이스 성능 향상 형태 예 CREATE [UNIQUE] INDEX 인덱스_이름 SQL 기본 - DDL Create Index 문장 데이터베이스 성능 향상 형태 예 CREATE [UNIQUE] INDEX 인덱스_이름 ON 기본_테이블 (열_이름 [ASC|DESC] {, 열_이름 [ASC|DESC]}*) [CLUSTER]; create index cost_index on orders(cost);
Drop Index 문장 인덱스 제거 형태 예 DROP INDEX 인덱스_이름; drop index cost_index; SQL 기본 - DDL Drop Index 문장 인덱스 제거 형태 예 DROP INDEX 인덱스_이름; drop index cost_index;
DML(Data Manipulation Language) SQL 기본 - DML DML(Data Manipulation Language) Select 문장 Insert 문장 Delete 문장 Update 문장
Select 문장(1/2) Select 문장 형태 예 데이터 검색 검색결과: 테이블 SQL 기본 - DML Select 문장(1/2) Select 문장 데이터 검색 검색결과: 테이블 형태 예 SELECT [ALL|DISTINCT] 열_리스트 FROM 테이블_리스트 [WHERE 조건] [GROUP BY 열_리스트] [HAVING 조건] [ORDER BY 열_리스트 [ASC|DESC}}; select order.*, items.* from orders, items where orders.order_num = items.order_num order by orders.cost desc;
Select 문장(2/2) ※ SQL에서 제공하는 집단함수(aggregation function) SQL 기본 - DML Select 문장(2/2) ※ SQL에서 제공하는 집단함수(aggregation function) 테이블의 한 열의 값 집합에 적용 COUNT, SUM, AVG, MAX, MIN ※ LIKE문(정규 문법 표현) ‘%’는 어떤 길이의 어느 문자와도 매치 ‘_’는 어느 한 문자와 매치 select count(*) from orders where cost > 500; select * from orders where address like ‘서울%’;
Insert 문장 Insert 문장 형태 예 기존 테이블에 행을 삽입 INSERT SQL 기본 - DML Insert 문장 Insert 문장 기존 테이블에 행을 삽입 형태 예 INSERT INTO 테이블[(열_이름 {[, 열_이름]}*] VALUES (값_리스트); insert into orders (order_num, cost, quantity) values (200, 300, 20);
Delete 문장 Delete 문장 형태 예 기존 테이블의 행을 삭제 DELETE FROM 테이블 [WHERE 조건]; SQL 기본 - DML Delete 문장 Delete 문장 기존 테이블의 행을 삭제 형태 예 DELETE FROM 테이블 [WHERE 조건]; delete from items where order_num = 100;
Update 문장 Update 문장 형태 예 기존 레코드의 열 값을 변경 UPDATE 테이블 SQL 기본 - DML Update 문장 Update 문장 기존 레코드의 열 값을 변경 형태 예 UPDATE 테이블 SET 열_이름 = 산술식 {, 열_이름 = 산술식}* [WHERE 조건]; update items set price = price * 1.1 where cost > 100;
JDBC란? CLI(Cell Level Interface) JDBC MS사의 ODBC(대표적인 CLI), JDBC도 CLI의 일종 DBMS에 접근하기 위한 C 언어 API함수 각 DBMS마다 다르고 사용방법도 다르다 JDBC 자바 언어를 통해서 DBMS와 무관하게 어디서든 사용 가능한 API 응용 프로그램 JDBC API JDBC 드라이버 Oracle MySQL [그림 11-1] JDBC 프로그램 구조
JDBC 프로그램 작성(1/2) DBMS 드라이버 설치 JDBC 기초- JDBC 프로그램 작성 JDBC 프로그램 작성(1/2) DBMS MySQL: 오픈 소스로 개발되고 있는 DBMS(http://mysql.com) ORACLE 드라이버 설치 MySQL을 위한 mm 드라이버 http://mmmysql.sourceforge.net : mm.mysql-2.x.x-src.jar 앞축풀기 C:\> jar xvf mm.mysql-2.x.x.-src.jar 압축을 풀었을때 나타나는 mysql.jar 파일을 CLASSPATH에 추가하거나, <JDK>/jre/lib/ext 디렉토리에 복사 Oracle을 위한 thin 드라이버 classes111.zip 파일을 CLASSPATH에 추가 예 CLASSPATH .;C:\jdk1.4\lib
JDBC 프로그램 작성(2/2) JDBC 응용 프로그램 작성 단계 (1) JDBC 드라이버를 로드한다 (2) DBMS에 컨넥션을 연다 (3) SQL을 전송한다 (4) 결과를 처리한다 (5) 컨넥션을 닫는다
(1) JDBC 드라이버를 로드한다 MySQL에서 mm 드라이버를 로드하는 경우 ODBC 브리지를 로드하는 경우 JDBC 기초 - JDBC 프로그램 작성 (1) JDBC 드라이버를 로드한다 MySQL에서 mm 드라이버를 로드하는 경우 ODBC 브리지를 로드하는 경우 MS-SQL에서 Jturbo 드라이버를 로드하는 경우 Oracle에서 thin 드라이버를 로드하는 경우 ※ Class.forName()를 이용해서 DriverManager에 드라이버 자신을 등록 Class.forName(“org.gjt.mm.mysql.Driver”).newInstance(); Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Class.forName(“com.ashna.jturbo.driver.Driver”).newInstance(); Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
(2) DBMS에 컨넥션을 연다 DriverManager의 getConnection()메소드를 이용 JDBC 기초 - JDBC 프로그램 작성 (2) DBMS에 컨넥션을 연다 DriverManager의 getConnection()메소드를 이용 데이터베이스 위치를 기술하기 위한 URL jdbc:<subprotocol><subname> Jdbc:mysql://[hostname][:port]/dbname[?param1=value1][¶m2=value2]… MySQL에서 mm 드라이버를 사용하는 경우 Oracle에서 thin 드라이버를 사용하는 경우 String url = “jdbc:mysql://localhost:3306/contacts”; Connection con = DriverManager.getConnection(url, “user-id”, “password”); String url = “jdbc:oracle:thin:@cs.sookmyung.ac.kr:1521:DB_LAB”; Connection con = DriverManager.getConnection(url, “user-id”, “password”);
드라이버 매니저와 드라이버 그림 11-2 HelloJdbc DriverManager jdbc:A jdbc:mysql getConnection() DriverManager jdbc:A jdbc:mysql jdbc:B Driver Oracle MySQL DBMS
(3) SQL을 전송한다 Statement 객체 이용 전송시 사용되는 메소드 JDBC 기초 - JDBC 프로그램 작성 (3) SQL을 전송한다 Statement 객체 이용 Statement stmt = con.createStatement(); 전송시 사용되는 메소드 executeQuery() SELECT 문인 경우 리턴값은 SELECT 문장 수행 결과값으로 ResultSet 이라는 타입으로 리턴된다 executeUpdate() Table의 내용 변경시(INSERT, UPDATE, DELETE) 리턴값은 SQL 문장이 수행됨으로 변경된 레코드의 수가 리턴된다
Connection, Statement, ResultSet의 관계 그림 11-3 DriverManager Connection Connection Connection Statement Statement Statement Statement Result Result Result
(4) 결과를 처리한다(1/2) executeQuery()를 이용해서 나온 결과 그림 11-4 JDBC 기초 - JDBC 프로그램 작성 (4) 결과를 처리한다(1/2) executeQuery()를 이용해서 나온 결과 그림 11-4 getXXX(); rs.next(); row ResultSet
JDBC 기초 - JDBC 프로그램 작성 (4) 결과를 처리한다(2/2) 예제 ResultSet에서 커서의 위치를 첫 번째 행(row)에 이동시키기 위해서는 처음에 한번 next() 메소드를 호출해야 한다. next()의 리턴값: true, false getXXX(): 필드이름 기술 or 인덱스값 사용(1부터 시작) SQL의 데이터 타입과 자바의 데이터 타입을 맞추기 위해 사용 p. 681의 표 참고 String query = “select name, phone from friends”; ResultSet rs = stmt.executeQeury(query); while (rs.next()){ String name = rs.getString(“name”); String phone = rs.getString(“phone”); System.out.println(name + “ | “ + phone); }
JDBC 기초 - JDBC 프로그램 작성 (5) 컨넥션을 닫는다 작업이 끝난 경우 ResultSet, Statement, Connection의 close() 메소드를 호출. 예 rs.close(); stmt.close(); con.close();
DB에서 데이터를 검색하는 프로그램 사용하는 DBMS: Oracle 테이블: friends JDBC 기초 - JDBC 프로그램 작성 DB에서 데이터를 검색하는 프로그램 사용하는 DBMS: Oracle 테이블: friends SQL> desc friends; Name Null? Type ------------------------------- -------- ---- NAME VARCHAR2(8) PHONE VARCHAR2(13) EMAIL VARCHAR2(35) COMPANY VARCHAR2(30) SQL> select * from friends; NAME PHONE EMAIL COMPANY -------- ------------- ----------------------------------- ------------------------------ 홍길동 011-123-4567 hong@honggildongsw.com (주)홍길동 소프트 김개똥 016-234-5678 kimkd@honggildongsw.com (주)홍길동 소프트 홍길숙 016-239-5690 hks@some.co.kr
HelloJdbc.java JDBC 기초 - JDBC 프로그램 작성 import java.sql.*; public class HelloJdbc { String id, passwd; public HelloJdbc(String id, String passwd) { // id, passwd를 매개변수로 받아서 global 변수에 저장 // JDBC 드라이버를 로드 (DriverManager에 등록) } public void getData() { // DBMS에 connection 열기 // SQL 전송(Statement 생성, SELECT 문장 실행) // 결과처리(ResultSet), connection 닫기 public static void main(String args[]) { HelloJdbc hj = new HelloJdbc("sookyoung", "sookyoung"); hj.getData();
HelloJdbc.java JDBC 기초 - JDBC 프로그램 작성 public HelloJdbc(String id, String passwd) { this.id = id; this.passwd = passwd; try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); } catch (Exception e) { e.printStackTrace(); }
HelloJdbc.java JDBC 기초 - JDBC 프로그램 작성 public void getData() { try { String url = "jdbc:oracle:thin:@cs.sookmyung.ac.kr:1521:DB_LAB"; Connection con = DriverManager.getConnection(url, id, passwd); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from friends"); while(rs.next()) { String name = rs.getString(1); String phone = rs.getString(2); String email = rs.getString(3); String company = rs.getString(4); System.out.println(name + " \t| " + phone + " \t| " + email + " \t| " + company); stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); }
InsertData.java JDBC 기초 - JDBC 프로그램 작성 import java.sql.*; public class InsertData { String id, passwd; public InsertData(String id, String passwd) { // id, passwd를 매개변수로 받아서 global 변수에 저장 // JDBC 드라이버를 로드 (DriverManager에 등록) } public void insert(String name, String phone, String email, String company){ // DBMS에 connection 열기 // SQL 전송(Statement 생성, INSERT 문장 실행), connection 닫기 public static void main(String args[]) { if(args.length < 4) { System.out.println("사용법: java InsertData <이름>" + " <전화번호> <E-mail> <회사>"); System.exit(1); InsertData id= new InsertData("sookyoung", "sookyoung"); id.insert(args[0], args[1], args[2], args[3]);
InsertData.java JDBC 기초 - JDBC 프로그램 작성 public InsertData(String id, String passwd) { this.id = id; this.passwd = passwd; try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); } catch (Exception e) { e.printStackTrace(); }
InsertData.java JDBC 기초 - JDBC 프로그램 작성 public void insert(String name, String phone, String email, String company){ try { String url = "jdbc:oracle:thin:@cs.sookmyung.ac.kr:1521:DB_LAB"; Connection con = DriverManager.getConnection(url, id, passwd); Statement stmt = con.createStatement(); String sql = "insert into friends values('" + name + "', '" + phone + "', '" + email + "', '" + company + "')"; stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); }
클래스들 DriverManager 클래스 Statement 인터페이스 ResultSet 인터페이스 PreparedStatement CallableStatement
DriverManager 클래스(1/2) 프로그램에서 등록하는 방법 환경에서 등록하는 방법 Oracle에서의 예 클래스들 DriverManager 클래스(1/2) 프로그램에서 등록하는 방법 Oracle에서의 예 환경에서 등록하는 방법 Class.forName(“my.sql.Driver”) Class.forName(“oracle.jdbc.driver.OracleDriver”) jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
DriverManager 클래스(2/2) 메소드 static Connection getConnection(String url) 클래스들 DriverManager 클래스(2/2) 메소드 static Connection getConnection(String url) static Connection getConnection(String url, Properties info) static Connection getConnection(String url, String user, String password) static cvoid registerDriver(Driver driver) JDBC 드라이버를 등록 static void setLoginTimeout(int seconds) 드라이버가 데이터베이스에 연결하기 위해 기다릴 수 있는 최대 시간을 설정(단위: 초) static void setLogWriter(PrintWriter out) JDBC 드라이버가 작동되는 작업 내용을 트레이스해서 출력
Statement 인터페이스 SQL 문장을 실행하고 결과를 얻어오기 위해서 사용 클래스들 Statement 인터페이스 SQL 문장을 실행하고 결과를 얻어오기 위해서 사용 하나의 Statement에는 하나의 ResultSet만 사용 메소드 ResultSet executeQuery(String sql): 결과값(테이블 형태) 리턴 int executeUpdate(String sql): 변경되는 레코드의 수 리턴 void setFetchSize(int rows) 데이터베이스에서 결과값으로 가져오는 레코드의 수를 JDBC 드라이버에 알려준다 void setMaxFieldSize(int max) 열(column)의 크기를 주어진 바이트 크기로 제한한다 void setMaxRows(int max) ResultSet이 주어진 수의 레코드만 포함할 수 있도록 제한한다 void setQueryTimeout(int seconds) SQL 문장이 수행되는데 걸리는 최대 시간을 주어진 시간으로 설정
ResultSet 인터페이스(1/3) 데이터 테이블에 접근해서 값을 추출할 수 있는 기능 제공 클래스들 ResultSet 인터페이스(1/3) 데이터 테이블에 접근해서 값을 추출할 수 있는 기능 제공 현재 데이터 행(row)을 가리키는 커서(cursor)를 가지고 있다. next() 메소드 호출 첫번째 행을 가리킴(처음) 다음 행으로 커서 이동. 메소드 Array getArray(int I): SQL Array값을 얻는다. (JDBC 2.0) Array getArray(String colName) InputStream getAsciiStream(int columnIndex) InputStream getAsciiStream(String columnName) BigDecimal getBigDecimal(int columnIndex) BigDecimal getBigDecimal(String columnName) InputStream getBinaryStream(int columnIndex) InputStream getBinaryStream(String columnName)
ResultSet 인터페이스(2/3) Bolb getBlob(int i) Blob getBlob(String colName) 클래스들 ResultSet 인터페이스(2/3) Bolb getBlob(int i) Blob getBlob(String colName) <type> getXXX(int columnIndex) <type> getXXX(String columnName) Reader getCharacterStream(int columnIndex) Reader getCharacterStream(String columnName) Clob getClob(int I) Clob getClob(String colName) ResultSetMetaData getMetaData() ResultSet의 컬럼 속성, 타입, 수를 알 수 있는 ResultSetMetaData를 얻는다
ResultSet 인터페이스(3/3) ResultSet에서 값을 변경하는 메소드(JDBC 2.0에서 제공) 클래스들 ResultSet 인터페이스(3/3) boolean next() 커서를 다음 행으로 이동, 더 이상 행이 없으면 false를 리턴 boolean previous() 커서를 이전 행으로 이동, 더 이상 행이 없으면 false를 리턴 void refreshRow 현재 행을 최신 데이터로 변경 boolean relative(int rows) 현재 행을 중심으로 앞뒤로 이동 rows값이 양수인 경우에는 앞으로 이동 rows값이 음수인 경우에는 뒤로 이동 ResultSet에서 값을 변경하는 메소드(JDBC 2.0에서 제공) void updateXXX(int columnIndex, <type> x) 컬럼의 데이터를 x값으로 변경 vod updateXXX (String columnName, <type> x)
PreparedStatement(1/4) 클래스들 PreparedStatement(1/4) 미리 컴파일된 SQL을 사용 PreparedStatement에 포함된 SQL 문장은 IN 파라미터를 받을 수 있는 곳을 “?”로 표시 사용예 Connection con = DriverManager.getConnection(); PreparedStatement pstmt = con.prepareStatement( “UPDATE talbe4 SET m = ? WHERE x = ?”);
PreparedStatement(2/4) 클래스들 PreparedStatement(2/4) PreparedStatement를 실행하기 전에 setXXX() 메소드를 이용해서 IN 파라미터 채워주기 pstmt.setString(1, “Hi”); for (int i = 0; i < 10; i++) { pstmt.setInt(2, i); int rowCount = pstmt.executeUpdate(); }
PreparedStatement(3/4) 클래스들 PreparedStatement(3/4) IN 파라미터에 자바 입력 스트림 설정 SQL 문장이 수행되면서, JDBC 드라이버가 반복적으로 입력 스트림의 내용을 읽어서 PreparedStatement의 실제 IN 파라미터에 값을 전달 입력 스트림을 연결하기 위해 JDBC에서 제공하는 3가지 메소드 setBinaryStream() setAsciiStream() setUnicodeStream()
PreparedStatement(4/4) 클래스들 PreparedStatement(4/4) IN 파라미터에 자바 입력 스트림 설정 예 java.io.File file = new java.io.File(“/tmp/data”); int fileLength = file.length(); java.io.InputStream fin = new java.io.FileInputStream(file); java.sql.PreparedSTatement pstmt = con.prepareStatement( “UPDATE Table5 SET stuff = ? WHERE index = 4”); pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();
CallableStatement(1/2) 클래스들 CallableStatement(1/2) PreparedStatement로부터 상속 저장된 SQL 프로시져를 호출하기 위해 사용 형태 prepareCall() 메소드 이용 {call precedure_name [(?, ?, …) ] } {? = call precedure_name [(?, ?, …) ] } {call precedure_name } {call precedure_name [(?, ?, …) ] } {? = call precedure_name [(?, ?, …) ] } {call precedure_name } Connection con = DriverManager.getConnection(); CallableStatement cstmt = con.prepareCall(“{ call getTestData(?, ?) }” );
CallableStatement(2/2) 클래스들 CallableStatement(2/2) setXXX() IN 파라미터를 CallableStatement 전달 만약 저장된 프로시듀어가 OUT 파라미터를 리턴한다면 CallableStatement가 실행되기 전에 registerOutParameter() 메소드를 이용해서 사전에 등록 INOUT 파라미터 사용가능 IN 파라미터 타입으로 setXXX() 메소드를 이용해서 CallableStatement에 값을 전달 OUT 파라미터 형식으로 내장된 프로시듀어의 결과를 리턴받아올 수도 있다.
2-tier와 3-tier 모델 2-tier Java Applet or Applicaton DBMS JDBC 자바 애플릿이나 애플리케이션이 데이터베이스에 직접 접근하는 것 <그림 11-5> DBMS Java Applet or Applicaton JDBC
2-tier와 3-tier 모델 3-tier Java Applet or Applicaton 미들웨어 JDBC DBMS DBMS 클라이언트는 서비스를 위한 미들티어(middle-tier)에 명령어를 보내고 미들티어가 데이터베이스에 접근하는 방법 로드 밸런싱(load balancing), 캐싱 기능 등을 제공 <그림 11-6> Java Applet or Applicaton 미들웨어 JDBC DBMS RMI 호출 CORMA 호출 CGI 호출 DBMS
트랜잭션 하나 이상의 SQL 문장으로 구성되어 실행 되면서 전체가 커밋(commit)되던가 롤백(rollback)된다 2-tier/3-tier 모델과 트랜잭션 트랜잭션 하나 이상의 SQL 문장으로 구성되어 실행 되면서 전체가 커밋(commit)되던가 롤백(rollback)된다 auto-commit 모드 변경시 Connection 클래스의 setAutoCommit(boolean mode) 메소드 이용 아이솔레이션 레벨(isolation level) 기술 Coonection 클래스의 setTransactionIsolation(int level)메소드 이용 레벨 TRANSACTION_READ_UNCOMMITED: dirty read 허용 TRANSACTION_READ_COMMITED: 트랜잭션이 종료될 때까지 행(row) 읽기가 블락(block)된다 TRANSACTION_REPEATABLE_READ: 행(row)에 대해 반복적으로 읽혀진 데이터가 원래 데이터와 일치 TRANSACTION_SERIALIZABLE: 모든 읽기가 트랜잭션이 종료될 때까지 블락(block)된다 TRANSACTION_NONE: 트랜잭션이 지원되지 않는다.
JDBC 응용 프로그램 Oracle과 JDBC를 이용하는 동문회 주소록 프로그램 테이블이름: cs JDBC 응용 프로그램 SQL> create table cs 2 (num varchar(8), 3 name varchar(10), 4 phone varchar(16), 5 company varchar(20), 6 email varchar(30)); Table created. SQL> desc cs; Name Null? Type ------------------------------- -------- ---- NUM VARCHAR2(8) NAME VARCHAR2(10) PHONE VARCHAR2(16) COMPANY VARCHAR2(20) EMAIL VARCHAR2(30)
JDBC 응용 프로그램 - Source JDBC 응용 프로그램 import java.sql.*; public class Alumni extends Frame implements ActionListener { public Alumni () { // GUI 인터페이스 구성하는 부분 } private void init() { // 드라이버 등록, DBMS에 connection 열기, Statement 생성} public void initialize() { // 각 컴포넌트 초기화 } private void destroy() {// 윈도우 종료시 호출되어 statement와 connection을 닫음.} public void setEditable(int n) { // 각 컴포넌트 설정 } public void setEnable(int n) { // 각 Button 컴포넌트 액션에 따라서 호출되어 설정 } public void clear() { // 각 TextField 컴포넌트에 있어서 setText(“”): refresh } public void actionPerformed(ActionEvent e) { // 각 Button 컴포넌트의 Action에 따른 기능 } public static void main(String args[]) { Alumni alumni = new Alumni(); alumni.setSize(600, 300); alumni.setVisible(true);