https://sundaland.tistory.com/273
[ ▶ JDBC ]
JDBC API는 특히 관계형 데이터페이스에 저장된 데이터를 포함하여 모든 종류의 표 형식 데이터를 액세스할 수 있는 자바 API이다.
JDBC는 아래 세 가지 프로그래밍 활동을 관리하는 자바 애플리케이션을 작성하는데 도움이 된다.
- Data Source(데이터베이스)에 연결
- 데이터베이스에 쿼리와 업데이트 문을 전송
- 쿼리에 대한 응답으로 데이터베이스에서 받은 결과를 검색하고 처리
▼ 위 세 가지 프로그래밍 활동을 간단하게 보여주는 예시
public void connectToAndQueryDatabase(String username, String password) {
Connection con = DriverManager.getConnection(
"jdbc:myDriver:myDatabase",
username,
password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}
}
데이터베이스 드라이버에 연결하고, 데이터베이스에 로그인하기 위해 DriverManger 객체를 인스턴스화하면, SQL 언어쿼리를 데이터베이스에 전달하는 Statement 객체를 인스턴스화하고, 쿼리 결과를 검색하는 ResultSet 객체를 인스턴스화한 다음, 간단한 while 루프를 실행하여 그 결과를 검색하고 표시한다.
[ ▷ JDBC Product Componets ]
JDBC는 네 개의 컴포넌트를 가지고 있다.
- JDBC API는 자바 프로그래밍 언어에서 관계형 데이터에 대한 프로그래밍 방식 액세스를 제공한다. JDBC API를 사용하면 애플리케이션은 SQL 문을 실행하고, 결과를 검색하고, 변경 사항을 기본 데이터 소스로 다시 전파할 수 있습니다. JDBC API는 분산된 이기종 환경에서 여러 데이터 소스와 상호 작용할 수도 있다. JDBC API는 자바 플롯폼의 일부로, 자바 SE 및 자카르타를 포함한다. JDBC 4.0 API는 두 개의 패키지로 나누어진다.
- JDBC DriverManager 클래스는 자바 애플리케이션을 JDBC 드라이버에 연결할 수 있는 객체를 정의한다. 전통적으로 JDBC 아키텍처의 중추였다. 이는 매우 작고 간단한다. 표준 확장 패키지 javax.naming 및 javax.sql을 사용하면 Java Naming and Directroy Interface(JNDI) 명명 서비스에 등록된 DataSource 객체를 사용하여 데이터 소스와 연결을 설정할 수 있다. 두 연결 메커니즘을 모두 사용할 수 있지만 가능한 경우 DataSource 객체를 사용하는 것이 좋다.
- JDBC Test Suite (드라이버 테스트 모음)은 JDBC 드라이버가 프로그램을 실행할지 여부를 결정하는데 도움이 된다. 이러한 테스트는 포괄적이거나 철저하지는 않지만 JDBC API의 많은 중요한 기능을 실행한다.
- JDBC-ODBC Bridge, 자바 소트프웨어 브릿지는 ODBC 드라이버를 통해 JDBC 액세서를 제공한다. 이 드라이버를 사용하는 각 클라이언트 머신에 ODBC 바이너리 코드를 로드해야 한다. 결과적으로 ODBC 드라이버는 클라이언트 설치가 큰 문제가 아닌 기업 네트워크나 3계층 아키텍처에서 자바로 작성된 애플리케이션 서버 코드에 가장 적합하다.
이 Trail은 네 가지 JDBC 구성 요소 중 처음 두가지를 사용하여 데이터베이스에 연결한 다음 SQl 명령을 사용하여 테스트 관계형 데이터베이스와 통신하는 자바 프로그램을 빌드한다.
마지막 두 가지 구성 요소는 특수 환경에서 앱 애플리케이션을 테스트하거나 ODBC 인식 DBMS와 통신하는데 사용된다.
[ ▷ JDBC Architecture ]
데이터베이스 액세스를 위한 2계층과 3계층 처리 모델을 모두 지원한다.
2계층 모델에서는 자바 애플릿이나 애플리케이션이 데이터 소스와 직접 통신할 수 있는 JDBC 드라이버가 필요하다. 사용자의 명령은 데이터베이스나 다른 데이터 소스로 전달되며, 해당 명령의 결과는 사용자에게 다시 전송됩니다. 데이터 소스는 네트워크를 통해 사용자가 연결된 다른 머신에 위치할 수 있다. 이를 클라이언트/서버 구성이라고 하며, 사용자의 머신을 클라이언트로, 데이터 소스를 포함하는 머신을 서버로 지칭한다.
3계층 모델에서는 명령이 서비스의 "중간 계층"으로 전송되고, 중간 계층이 해당 명령을 데이터 소스로 전송합니다. 데이터 소스는 명령을 처리하고 결과를 중간 계층으로 보내며, 중간 계층은 이를 사용자에게 전송한다. MIS 이사들은 중간 계층이 기업 데이터에 대한 액세스 및 업데티으 유형을 제어할 수 있게 해주기 때문에 3계층 모델은 매우 매력적으로 생각된다.
또한 애플리케이션의 배포를 단순화할 수 있다. 그리고 대부분의 경우 3계층 아키텍쳐는 성능상의 이점을 제공할 수 있다.
최근까지 중간 계층은 빠른 성능을 제공하는 C나 C++와 같은 언어로 작성되는 경우가 많았다. 그러나 자바 바이트코드를 효율적인 기계 전용 코드로 변환하는 최적화 컴파일러와 Enterprise JavaEans와 같은 기술의 도입으로 자바 플랫폼은 중간 계층 개발의 표준 플랫폼으로 빠르게 자리 잡고 있다.
기업들이 서버 코드를 작성하는데 자바 프로그래밍 언어를 점점 더 많이 사용함에 따라 JDBC API는 3계층 아키텍처의 중간 계층에서 점점 더 많이 사용되고 있다. JDBC를 서버 기술로 만드는 몇 가지 기능은 열결 폴링, 분산 트랜잭션 및 비연결형 로우셋을 지원한다. 또한 JDBC API는 자바 중간 계층에서 데이터 소스에 액세스할 수 있게 해준다.
[ ▷ 관계형 데이터베이스 ]
데이터베이스는 정보를 저장하여 이를 검색할 수 있는 수단이다. 간단하게 말하자면, 정보를 행과 열로 구성된 테이블 형태로 제공하는 것이다. 테이블은 같은 유형의 객체(행) 모음이라는 의미에서 관계(relation)라고 한다. 테이블의 데이터는 공통(common) 키나 개념에 따라 관련될 수 있으며, 테이블에서 관련 데이터를 검색할 수 있는 능력이 관계형 데이터베이스라는 용어의 기초가된다.
DBMS는 데이터가 저장, 유지 및 검색되는 방식을 처리한다. 관계형 데이터베이스는 RDBMS가 이러한 작업을 수행한다.
[ ▷ 무결성 원칙 ]
관계형 테이블은 데이터를 정확하게 유지하고 항상 접근 가능하도록 하기 위해 특정 무결성 규칙을 따른다.
관계형 테이블의 행은 모두 고유해야한다. 행이 중복되면 두 개의 선택 중 어느 것이 올바른 것인지 해결하는데 문제가 발생할 수 있다. 대부분의 DBMS에서는 사용자가 중복 행을 허용하지 않도록 지정할 수 있으며, 그렇게 지정하면 DBMS는 기존 행을 복제하는 행의 추가를 방지한다.
전통적인 관계형 모델의 두 번째 무결성 규칙은 열 값이 반복 그룹 또는 배열이 되어서는 안된다.
데이터 무결성의 세번째 측면은 null 값의 개념과 관련이 있다. 데이터베이스의 null 값을 사용하여 데이터가 누락되었음을 나타냄으로서 데이터가 없을 수 있는 상황을 처리한다. null 값은 공백이나 0과 같지 않다.
공백은 다른 공백과 같고, 0은 다른 0과 같지만, 두 개의 null 값은 같지 않다고 간주된다.
테이블의 각 행이 다를 때, 하나 이상의 열을 사용하여 특정 행을 식별할 수 있다. 이러한 고유한 열 또는 열 그룹을 기본 키라고 한다. 기본 키의 일부은 열은 null일 수 없다. null 값이 되면 해당 기본 키는 더 이상 완전한 식별자가 아니게 된다.
이 규칙을 엔티티 무결성이락 한다.
[ ▷ SELECT 문 ]
SQL은 관계형 데이터베이스와 함께 사용하도록 설계된 언어이다. 모든 RDBMS에서 표준으로 간주되고 사용되는 기본 SQL 명령 세트가 있다. 예를 들어 모든 RDBMS는 SELECT 문을 사용한다.
SELECT 문(쿼리)는 테이블에서 정보를 가져오는데 사용된다. 이 쿼리문은 하나 이상의 열 제목, 선택할 하나 이상의 테이블 및 선택에 대한 몇 가지 기준을 지정한다. RDMS는 명시된 요구 사항을 충족하는 열 엔트리들의 행들을 반환한다.
▼ 회사 차량을 소유한 직원의 이름과 성을 가져오는 SELECT 문
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number IS NOT NULL
▼ 모든 열을 선택하여 가져오는 SELECT 문
SELECT *
FROM Employees
[ ▷ WHERE 문 ]
SELECT 쿼리에서 WHERE 절은 값은 선택하기 위한 기준을 제공한다.
▼ Last_Name 열이 Washington 문자열로 시작하는 행에서만 값이 선택되는 SELECT 문
SELECT First_Name, Last_Name
FROM Employees
WHERE Last_Name LIKE 'Washington%'
LIKE 키워드는 문자열을 비교하는데 사용되며, 와일드카드를 포함한 패턴을 사용할 수 있는 기능을 제공한다.
해당 WHERE 문의 Washington 끝에 있는 % 기호는 Washington 문자열과 그 뒤에 0개 이상의 추가 문자가 포함된 모든 값을 만족시킨다는 것을 위미한다.
WHERE Last_Name LIKE 'Ba_man'
LIKE 절에서 사용되는 또 다른 와일드카드는 밑줄(_)로, 이는 임의의 한 문자를 나타낸다.
▼ 숫자를 비교하기 위해 등호를 사용하는 WHERE 문
SELECT First_Name, Last_Name
FROM Employees
WHERE Car_Number = 12
SELECT First_Name, Last_Name
FROM Employees
WHERE Employee_Number > 10005
SELECT First_Name, Last_Name
FROM Employees
WHERE Employee_Number < 10100 AND Car_Number IS NULL
WHERE 절은 여러 조건과 일부 DBMS에서는 중첩 조건을 사용하여 다소 복잡해 질 수 있다.
[ ▷ JOIN 문 ]
관계형 데이터베이스의 특징 중 하나는 조인이라고 불리는 방법으로 여러 테이블에서 데이터를 가져올 수 있다는 것이다.
두 테이블을 서로 연관시키기 위해서는 두 테이블 모두에 나타나는 하나의 열이 있어야 한다. 이열은 한 테이블에서는 기본 키이고 다른 테이블에서는 외래 키라고 한다. 만약 하나가 테이블에서 삭제된다면, 참조 무결성을 유지하기 위해 다른 테이블에서도 삭제해야 한다.
외래 키는 null이거나 참조하는 테이블의 기존 기본 키 값과 같아야 한다. 이는 null 일 수 없는 기본 키와는 다른다.
SELECT Employees.First_Name, Employees.Last_Name,
Cars.Make, Cars.Model, Cars.Year
FROM Employees, Cars
WHERE Employees.Car_Number = Cars.Car_Number
INNER JOIN
두 테이블 간의 공통된 값을 기준으로 데이터를 결합한다. 공통된 갑이 있는 행만 결과에 포함된다.
즉, 두 테이블 모두에 존재하는 공통된 값만 반환된다. 없으면 해당 행은 결과에 포함되지 않는다.
SELECT
e.Employee_ID,
e.First_Name,
e.Last_Name,
e.Date_Of_Birth,
e.Car_Number,
p.Project_ID,
p.Project_Name
FROM
Employees e
JOIN
Projects p
ON
e.Employee_ID = p.Employee_ID;
SELECT
p.Project_ID,
p.Project_Name,
e.First_Name,
e.Last_Name
FROM
Projects p
JOIN
Employees e
ON
p.Employee_ID = e.Employee_ID;
LEFT JOIN
LEFT OUTER JOIN이라고도 하며 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 결합한다. 오른쪽 테이블에 일치하는 값이 없으면 'NULL'이 채워진다.
즉, 왼쪽 테이블의 모든 행이 결과에 포함되며, 오른쪽 테이블에서 일치하는 값이 있으면 그 값이 포함된다.
SELECT
e.Employee_ID,
e.First_Name,
e.Last_Name,
e.Date_Of_Birth,
e.Car_Number,
p.Project_ID,
p.Project_Name
FROM
Employees e
LEFT JOIN
Projects p
ON
e.Employee_ID = p.Employee_ID;
SELECT
p.Project_ID,
p.Project_Name,
p.Employee_ID,
e.First_Name,
e.Last_Name,
e.Date_Of_Birth,
e.Car_Number
FROM
Projects p
LEFT JOIN
Employees e
ON
p.Employee_ID = e.Employee_ID;
[ ▷ Commom SQL Commans ]
SQL 명령어는 여러 카테고리로 나눌 수 있으며, 주요한 두 가지는 데이터 조작 언어 (DML) 명령어와 데이터 정의 언어 (DCL)명령어이다.
DML 명령어는 데이터를 조회하거나 수정하여 최신 상태로 유지하는데 사용된다. DDL 명령어는 테이블 및 뷰, 인덱스와 같은 다른 데이터베이스 객체를 생성하거나 변경한다.
SELECT
데이터 베이스에서 데이터를 조회하고 표시하는데 사용된다. SELECT 절은 결과 집합에 포함할 열을 지정한다. 애플리케이션에서 사용되는 SQL 명령어의 대다수는 SELECT 문이다.
INSERT
테이블에 새로운 행을 추가한다. INSERT는 새로 생성된 데이터를 채우거나 이미 존재하는 테이블에 새로운 행을 추가하는데 사용된다.
INSERT INTO Employees (First_Name, Last_Name, Date_Of_Birth, Car_Number)
VALUES ('John', 'Doe', '1985-06-15', 3);
INSERT INTO Employees (First_Name, Last_Name, Date_Of_Birth, Car_Number)
VALUES
('Jane', 'Smith', '1990-07-22', 4),
('Emily', 'Jones', '1978-12-11', 5),
('Michael', 'Brown', '1983-04-08', NULL);
DELETE
테이블에서 지정된 행 또는 행 집합을 제거한다.
▼ 특정 row 삭제
DELETE FROM Employees
WHERE Employee_ID = 3;
DELETE FROM Employees
WHERE Last_Name = 'Smith';
▼ 여러 조건을 사용한 row 삭제
DELETE FROM Employees
WHERE Car_Number IS NULL;
DELETE FROM Employees
WHERE Date_Of_Birth < '1980-01-01';
UPDATE
테이블의 열 또는 열 그룹의 기존 값을 변경한다.
▼ 특정 열 업데이트
UPDATE Employees
SET First_Name = 'Michael', Last_Name = 'Johnson'
WHERE Employee_ID = 3;
UPDATE Employees
SET Car_Number = 10
WHERE Last_Name = 'Doe';
▼ 여러 열을 업데이트
UPDATE Employees
SET First_Name = 'Emily', Date_Of_Birth = '1985-05-15'
WHERE Employee_ID = 2;
UPDATE Employees
SET Last_Name = 'Young'
WHERE Date_Of_Birth > '1990-01-01';
▼ 계산된 값을 사용하여 업데이트
UPDATE Employees
SET Car_Number = Car_Number + 1
WHERE Car_Number IS NOT NULL;
CREATE TABLE
사용자가 제공한 열 이름으로 테이블을 생성한다. 사용자는 각 열에 대한 데이터 유형도 지정해야 한다. 데이터 유형은 RDBMS마다 다르므로 사용자는 특정 데이터베이스에서 사용되는 데이터 유형을 설정하기 위해 메타데이터를 사용할 필요가 있다.
CREATE TABLE Employees (
Employee_ID INT AUTO_INCREMENT PRIMARY KEY,
First_Name VARCHAR(50),
Last_Name VARCHAR(50),
Date_Of_Birth DATE,
Car_Number INT
);
DROP TABLE
모든 행을 삭제하고 데이터베이스에서 테이블 정의를 제거한다. JDBC API 구현은 SQL92, Transitional Level에 따라 DROP TABLE 명령어를 지원해야 한다. 그러나 CASCADE 및 RESTRICT 옵션 지원은 선택 사항이다.
또한 삭제되는 테이블을 참조하는 뷰 또는 무결성 제약 조건이 정의된 경우 DROP TABLE의 동작은 구현에 따라 달라진다.
DROP TABLE Employees;
DROP TABLE Employees, Cars;
# CASCADE 옵션은 데이터베이스에서 DROP TABLE, DELETE, UPDATE 명령어를 사용할 떄 관련된 데이터도 함께 자동으로 처리되도록 하는 옵션이다. MySQL에서는 기본적으로는 CASCADE 옵션이 DROP TABBLE 명령어에 직접적으로 지원되지 않지만, 외래 키 제역 조건을 사용할 때 DELETE, UPDATE 명령어와 함께 사용될 수 있다.
CREATE TABLE Employees (
Employee_ID INT AUTO_INCREMENT PRIMARY KEY,
First_Name VARCHAR(50),
Last_Name VARCHAR(50),
Date_Of_Birth DATE,
Car_Number INT
);
CREATE TABLE Projects (
Project_ID INT AUTO_INCREMENT PRIMARY KEY,
Project_Name VARCHAR(100),
Employee_ID INT,
FOREIGN KEY (Employee_ID) REFERENCES Employees(Employee_ID)
);
DROP TABLE Projects;
DROP TABLE Employees;
Employess 테이블을 삭제하려면 먼저 Projects 테이블을 삭제해야한다.
ALTER TABLE
테이블에서 열을 추가하거나 제거한다. 또한 테이블 제약 조건을 추가허가나 삭제하고 열 속성을 변경한다.
▼ 테이블에 새로운 열 추가
ALTER TABLE Employees
ADD COLUMN Email VARCHAR(100);
▼ 열의 데이터 타입 변경
ALTER TABLE Employees
MODIFY COLUMN Last_Name VARCHAR(100);
▼ 열 이름 변경
ALTER TABLE Employees
CHANGE COLUMN Car_Number Vehicle_Number INT;
▼ 열 삭제
ALTER TABLE Employees
DROP COLUMN Date_Of_Birth;
▼ 기본 키 추가
ALTER TABLE Employees
ADD PRIMARY KEY (Employee_ID);
▼ 외래 키 추가
ALTER TABLE Projects
ADD CONSTRAINT fk_employee
FOREIGN KEY (Employee_ID) REFERENCES Employees(Employee_ID) ON DELETE CASCADE;
▼ 열의 기본값 설정
ALTER TABLE Employees
ALTER COLUMN Car_Number SET DEFAULT 0;
▼ 테이블 이름 변경
ALTER TABLE Employees
RENAME TO Staff;
▼ 외래 키 제약 조건 삭제
ALTER TABLE Projects
DROP FOREIGN KEY fk_employee;
▼ 기본 키 제약 조건 삭제
ALTER TABLE Employees
DROP PRIMARY KEY;
[ ▷ Result Sets and Cursors ]
쿼리의 조건을 만족하는 행들을 Result Sets라고 한다. 결과 집합에 반환되는 행의 수는 0, 1 또는 그 이상일 수 있다. 사용자는 Resultset의 데이터를 한번에 한 행씩 접근할 수 있으며, 커서는 이를 수행하는 수단을 제공한다. 커서는 Resultset의 행들을 포함하는 파일 안의 포인터로 생각할 수 있으며, 현재 접근 중인 행을 추적할 수 있다. 커서는 사용자가 Resultset의 각 행을 위에서 아래로 처리할 수 있게 하며, 따라서 반복 처리에 사용할 수 있다. 대부분의 DBMS는 Resultset이 생성될 때 커서를 자동으로 생성한다.
[ ▷ 트랜잭션 (Transactions) ]
한 사용자가 데이터베이스의 데이터를 접근하고 있을 때, 다른 사용자도 동시에 같은 데이터에 접근할 수 있다.
DBMS는 여러 사용자가 동시에 데이터베이스에 접근할 수 있도록 하면서도 데이터 일관성를 유지하기 위해 트랜잭션을 사용한다.
트랜잭션은 하나 이상의 SQL 문으로 구성된 논리적 작업 단위이다. 트랜잭션은 데이터 일관성이니 데이터 동시성에 문제가 있는지 여부에 따라 커밋(Commit) 또는 롤백(Rollback)으로 끝난다. 커밋 문은 트랜잭션의 SQL 문에 의한 변경을 영구적으로 적용하며, 롤백 문은 트랜잭션의 SQL 문에 의한 모든 변경을 취소한다.
락(Lock)은 두 트랜잭션이 동시에 동일한 데이터를 조작하는 것을 금지하는 매커니즘이다. 예를 들어, 테이블 락은 해당 테이블에 커밋되지 않은 트랜잭션이 있는 경우 테이블이 삭제되는 것을 방지한다.
일부 DBMS에서는 테이블 락이 테이블의 모든 행을 잠구기도 한다. 행 락은 두 트랜잭션이 동일한 행을 수정하는 것을 방지하거나, 한 트랜잭션이 아직 행을 수정 중하는 것을 방지하거나, 한 트랜잭션이 아직 행을 수정 중일 때 다른 트랜잭션이 해당 행을 선택하는 것을 방지한다.
[ ▷ 저장 프로시저 (Stored Procedure) ]
이름으로 호출할 수 있는 SQL 문 그룹이다. 특정 작업을 수행하는 실행 가능한 코드, 작은 프로그램으로, 함수나 메서드를 호출하는 것과 같은 방식으로 호출할 수 있다. 전통적으로 저장 프로시저는 DBMS별 프로그래밍 언어로 작성되었다. 최신 데이터베이스 제품들은 자바 프로그래밍 언어와 JDBC API를 사용하여 저장 프로시저를 작성할 수 있게 한다.
자바 프로그래밍 언어로 작성된 저장 프로시저는 DBMS간에 바이트코드로 이식 가능하다. 저장 프로시저가 작성되면, 이를 지원하는 DBMS는 이를 데이터베이스에 저장하기 때문에 저장 프로시저를 사용하고 재사용할 수 있다.
[ ▷ 메타데이터 ]
데이터베이스는 사용자 데이터를 저장할 뿐만이 아니라 데이터베이스 자체에 대한 정보도 저장한다. 대부분의 DBMS는 데이터베이스의 테이블, 각 테이블의 열 이름, 기본 키, 외래 키, 저장 프로시저 등을 나열하는 시스템 테이블 집합을 가지고 있다. 각 DBMS는 테이블 레이아웃과 데이터베이스 기능에 대한 정보를 얻기 위한 자체 기능을 가지고 있다.
JDBC는 드라이버 작성자가 드라이버 및 또는 드라이버가 작성된 DBMS에 대한 정보를 반환하도록 구현해야하는 DatabaseMetaData 인터페이스를 제공한다.
많은 메서드가 드라이버가 특정 기능을 지원하는지 여부를 반환한다. 이 인터페이스는 사용자와 도구가 메타데이터를 얻기 위한 표준화된 방법을 제공한다.
일반적으로 도구 및 드라이버를 작성하는 개발자가 메타데이터에 가장 관심을 가질 가능성이 높다.
[ ▷ 데이터베이스 스키마 ]
데이터베이스의 구조를 정의하는 청사진이다. 스키마는 데이터베이스 내의 데이터가 어떻게 조직되고 저장되는 지를 설명한다. 구체적으로 테이블 구조, 제약 조건, 관계, 인덱스를 포함하고 있다.
'자바 튜토리얼' 카테고리의 다른 글
Collections [1] (0) | 2024.07.19 |
---|---|
제너릭 (Generics) [4] (0) | 2024.07.18 |
제너릭 (Generics) [3] (0) | 2024.07.17 |
제너릭 (Generics) [2] (0) | 2024.07.16 |
제너릭 (Generics) [1] (0) | 2024.07.16 |