Setting Up Tables

2025. 4. 6. 17:22High Level Programming Language/JDBC Database Access

 

테이블 설정

이 페이지에서는 JDBC 튜토리얼에서 사용되는 모든 테이블과 그 생성 방법에 대해 설명합니다:

  • COFFEES 테이블
  • SUPPLIERS 테이블
  • COF_INVENTORY 테이블
  • MERCH_INVENTORY 테이블
  • COFFEE_HOUSES 테이블
  • DATA_REPOSITORY 테이블
  • 테이블 생성
  • 테이블 데이터 삽입

COFFEES 테이블

COFFEES 테이블은 The Coffee Break에서 판매되는 커피에 대한 정보를 저장합니다:

COF_NAME SUP_ID PRICE SALES TOTAL
Colombian 101 7.99 0 0
French_Roast 49 8.99 0 0
Espresso 150 9.99 0 0
Colombian_Decaf 101 8.99 0 0
French_Roast_Decaf 49 9.99 0 0

각 컬럼에 대한 설명은 다음과 같습니다:

  • COF_NAME: 커피 이름을 저장합니다. 최대 32자의 VARCHAR 타입이며, 각 커피의 이름이 고유하므로 기본 키로 사용됩니다.
  • SUP_ID: 커피 공급업체를 식별하는 숫자를 저장합니다. INTEGER 타입이며, SUPPLIERS 테이블의 SUP_ID를 참조하는 외래 키로 정의되어 있습니다.
  • PRICE: 파운드당 커피 가격을 저장합니다. 소수점을 포함한 값을 저장하기 위해 FLOAT 타입을 사용합니다.
  • SALES: 금주에 판매된 커피의 파운드 수를 저장합니다. INTEGER 타입입니다.
  • TOTAL: 지금까지 판매된 커피의 총 파운드 수를 저장합니다. INTEGER 타입입니다.

 

SUPPLIERS 테이블

SUPPLIERS 테이블은 각 공급업체에 대한 정보를 저장합니다:

SUP_ID SUP_NAME STREET CITY STATE ZIP
101 Acme, Inc. 99 Market Street Groundsville CA 95199
49 Superior Coffee 1 Party Place Mendocino CA 95460
150 The High Ground 100 Coffee Lane Meadows CA 93966

각 컬럼에 대한 설명은 다음과 같습니다:

  • SUP_ID: 커피 공급업체를 식별하는 숫자를 저장합니다. INTEGER 타입이며, 이 테이블의 기본 키입니다.
  • SUP_NAME: 커피 공급업체의 이름을 저장합니다.
  • STREET, CITY, STATE, ZIP: 공급업체의 주소를 저장합니다.

 

COF_INVENTORY 테이블

COF_INVENTORY 테이블은 각 창고에 저장된 커피의 양에 대한 정보를 저장합니다:

WAREHOUSE_ID COF_NAME SUP_ID QUAN DATE_VAL
1234 House_Blend 49 0 2006-04-01
1234 House_Blend_Decaf 49 0 2006-04-01
1234 Colombian 101 0 2006-04-01
1234 French_Roast 49 0 2006-04-01
1234 Espresso 150 0 2006-04-01
1234 Colombian_Decaf 101 0 2006-04-01

각 열에 대한 설명은 다음과 같습니다:

  • WAREHOUSE_ID: 창고를 식별하는 숫자를 저장합니다.
  • COF_NAME: 특정 종류의 커피 이름을 저장합니다.
  • SUP_ID: 공급업체를 식별하는 숫자를 저장합니다.
  • QUAN: 사용 가능한 상품의 수량을 저장합니다.
  • DATE_VAL: 해당 행이 마지막으로 업데이트된 시간을 나타내는 타임스탬프 값을 저장합니다.

MERCH_INVENTORY 테이블

MERCH_INVENTORY 테이블은 비(非)커피 상품의 재고 정보를 저장합니다:

ITEM_ID ITEM_NAME SUP_ID QUAN DATE
00001234 Cup_Large 00456 28 2006-04-01
00001235 Cup_Small 00456 36 2006-04-01
00001236 Saucer 00456 64 2006-04-01
00001287 Carafe 00456 12 2006-04-01
00006931 Carafe 00927 3 2006-04-01
00006935 PotHolder 00927 88 2006-04-01
00006977 Napkin 00927 108 2006-04-01
00006979 Towel 00927 24 2006-04-01
00004488 CofMaker 08732 5 2006-04-01
00004490 CofGrinder 08732 9 2006-04-01
00004495 EspMaker 08732 4 2006-04-01
00006914 Cookbook 00927 12 2006-04-01

각 컬럼에 대한 설명은 다음과 같습니다:

  • ITEM_ID: 아이템을 식별하는 숫자를 저장합니다.
  • ITEM_NAME: 아이템의 이름을 저장합니다.
  • SUP_ID: 공급업체를 식별하는 숫자를 저장합니다.
  • QUAN: 해당 아이템의 사용 가능한 수량을 저장합니다.
  • DATE: 해당 행이 마지막으로 업데이트된 시간을 나타내는 타임스탬프 값을 저장합니다.

 

 

COFFEE_HOUSES 테이블

COFFEE_HOUSES 테이블은 커피 매장의 위치에 대한 정보를 저장합니다:

STORE_ID CITY COFFEE MERCH TOTAL
10023 Mendocino 3450 2005 5455
33002 Seattle 4699 3109 7808
10040 SF 5386 2841 8227
32001 Portland 3147 3579 6726
10042 SF 2863 1874 4710
10024 Sacramento 1987 2341 4328
10039 Carmel 2691 1121 3812
10041 LA 1533 1007 2540
33005 Olympia 2733 1550 4283
33010 Seattle 3210 2177 5387
10035 SF 1922 1056 2978
10037 LA 2143 1876 4019
10034 San_Jose 1234 1032 2266
32004 Eugene 1356 1112 2468

각 컬럼의 설명은 다음과 같습니다:

  • STORE_ID: 커피 매장을 식별하는 숫자입니다. 이 값은 매장이 위치한 주를 나타내는 역할도 하며, 예를 들어 10으로 시작하면 캘리포니아, 32로 시작하면 오리건, 33은 워싱턴 주를 의미합니다.
  • CITY: 커피 매장이 위치한 도시의 이름입니다.
  • COFFEE: 판매된 커피 양을 나타냅니다.
  • MERCH: 판매된 비커피 상품의 양입니다.
  • TOTAL: 커피와 상품 판매량의 합입니다.

 

DATA_REPOSITORY 테이블

DATA_REPOSITORY 테이블은 The Coffee Break에서 사용하는 문서나 데이터의 URL을 저장합니다.
이 튜토리얼에서 사용하는 populate_tables.sql 스크립트는 이 테이블에 데이터를 추가하지 않습니다.

각 열 설명:

  • DOCUMENT_NAME: URL을 식별하는 문자열입니다.
  • URL: 문서를 참조하는 웹 주소입니다.

 

테이블 생성

Apache Ant나 JDBC API를 사용하여 테이블을 생성할 수 있습니다.

Apache Ant로 테이블 생성하기

튜토리얼 샘플 코드에서 사용되는 테이블을 생성하려면 <JDBC 튜토리얼 디렉토리>에서 다음 명령어를 실행합니다:

ant setup

이 명령은 build.xml 파일에 정의된 여러 Ant 타겟 중 build-tables를 실행합니다:

<target name="build-tables"
  description="Create database tables">
  <sql
    driver="${DB.DRIVER}"
    url="${DB.URL}"
    userid="${DB.USER}"
    password="${DB.PASSWORD}"
    classpathref="CLASSPATH"
    delimiter="${DB.DELIMITER}"
    autocommit="false" onerror="abort">
    <transaction src="./sql/${DB.VENDOR}/create-tables.sql"/>
  </sql>
</target>

각 파라미터 설명:

파라미터 설명
driver JDBC 드라이버의 전체 클래스 이름입니다. Java DB의 경우 org.apache.derby.jdbc.EmbeddedDriver, MySQL은 com.mysql.cj.jdbc.Driver입니다.
url DB 연결을 위한 JDBC URL입니다.
userid DB 사용자 계정입니다.
password 사용자 비밀번호입니다.
classpathref 드라이버 클래스가 포함된 JAR의 전체 경로입니다.
delimiter SQL 문을 구분하는 구분자입니다. 보통 ;를 사용합니다.
autocommit false로 설정하면 모든 SQL 문이 하나의 트랜잭션으로 실행됩니다.
onerror SQL 실행 실패 시 동작 (continue, stop, abort)

 

SQL 파일 예시 (create-tables.sql 일부):

create table SUPPLIERS (
    SUP_ID integer NOT NULL,
    SUP_NAME varchar(40) NOT NULL,
    STREET varchar(40) NOT NULL,
    CITY varchar(20) NOT NULL,
    STATE char(2) NOT NULL,
    ZIP char(5),
    PRIMARY KEY (SUP_ID)
);

create table COFFEES (
    COF_NAME varchar(32) NOT NULL,
    SUP_ID int NOT NULL,
    PRICE numeric(10,2) NOT NULL,
    SALES integer NOT NULL,
    TOTAL integer NOT NULL,
    PRIMARY KEY (COF_NAME),
    FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID)
);

참고: build.xml에는 drop-tables 타겟도 포함되어 있어 기존 테이블을 삭제한 후 다시 생성할 수 있습니다.

 

JDBC API로 테이블 생성하기

예시: SUPPLIERS 테이블 생성 메서드

public void createTable() throws SQLException {
  String createString =
    "create table SUPPLIERS (SUP_ID integer NOT NULL, " +
    "SUP_NAME varchar(40) NOT NULL, STREET varchar(40) NOT NULL, " +
    "CITY varchar(20) NOT NULL, STATE char(2) NOT NULL, ZIP char(5), " +
    "PRIMARY KEY (SUP_ID))";
  try (Statement stmt = con.createStatement()) {
    stmt.executeUpdate(createString);
  } catch (SQLException e) {
    JDBCTutorialUtilities.printSQLException(e);
  }
}

COFFEES 테이블도 유사한 방식으로 생성합니다:

public void createTable() throws SQLException {
  String createString =
    "create table COFFEES (COF_NAME varchar(32) NOT NULL, " +
    "SUP_ID int NOT NULL, PRICE numeric(10,2) NOT NULL, " +
    "SALES integer NOT NULL, TOTAL integer NOT NULL, " +
    "PRIMARY KEY (COF_NAME), " +
    "FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID))";
  try (Statement stmt = con.createStatement()) {
    stmt.executeUpdate(createString);
  } catch (SQLException e) {
    JDBCTutorialUtilities.printSQLException(e);
  }
}

주의: COFFEESSUPPLIERS를 참조하므로 SUPPLIERS 테이블을 먼저 생성해야 합니다.

 

테이블 데이터 삽입

Apache Ant로 데이터 삽입하기

ant setup 명령은 테이블을 생성할 뿐 아니라, populate-tables.sql 스크립트를 실행해 데이터를 삽입합니다. 해당 SQL 파일의 예시는 다음과 같습니다:

insert into SUPPLIERS values(49, 'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', '95460');
insert into SUPPLIERS values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199');
insert into SUPPLIERS values(150, 'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', '93966');

insert into COFFEES values('Colombian', 00101, 7.99, 0, 0);
insert into COFFEES values('French_Roast', 00049, 8.99, 0, 0);
insert into COFFEES values('Espresso', 00150, 9.99, 0, 0);
insert into COFFEES values('Colombian_Decaf', 00101, 8.99, 0, 0);
insert into COFFEES values('French_Roast_Decaf', 00049, 9.99, 0, 0);

 

 

JDBC API로 데이터 삽입하기

SUPPLIERS 테이블 데이터 삽입:

public void populateTable() throws SQLException {
  try (Statement stmt = con.createStatement()) {
    stmt.executeUpdate("insert into SUPPLIERS values(49, 'Superior Coffee', '1 Party Place', 'Mendocino', 'CA', '95460')");
    stmt.executeUpdate("insert into SUPPLIERS values(101, 'Acme, Inc.', '99 Market Street', 'Groundsville', 'CA', '95199')");
    stmt.executeUpdate("insert into SUPPLIERS values(150, 'The High Ground', '100 Coffee Lane', 'Meadows', 'CA', '93966')");
  } catch (SQLException e) {
    JDBCTutorialUtilities.printSQLException(e);
  }
}

COFFEES 테이블 데이터 삽입:

public void populateTable() throws SQLException {
  try (Statement stmt = con.createStatement()) {
    stmt.executeUpdate("insert into COFFEES values('Colombian', 00101, 7.99, 0, 0)");
    stmt.executeUpdate("insert into COFFEES values('French_Roast', 00049, 8.99, 0, 0)");
    stmt.executeUpdate("insert into COFFEES values('Espresso', 00150, 9.99, 0, 0)");
    stmt.executeUpdate("insert into COFFEES values('Colombian_Decaf', 00101, 8.99, 0, 0)");
    stmt.executeUpdate("insert into COFFEES values('French_Roast_Decaf', 00049, 9.99, 0, 0)");
  } catch (SQLException e) {
    JDBCTutorialUtilities.printSQLException(e);
  }
}

출처 : https://docs.oracle.com/javase/tutorial/jdbc/basics/tables.html