JDBC (Java Database Connectivity)
JDBC는 자바 언어를 사용하여 데이터베이스에 연결하고 조작하기 위한 표준 API이다. JDBC는 자바 애플리케이션이 다양한 데이터베이스 시스템에 대해 일관된 방식으로 데이터베이스 작업을 수행할 수 있게 한다.
주요 구성 요소
- JDBC 드라이버: 자바 애플리케이션이 특정 데이터베이스와 통신할 수 있도록 해주는 라이브러리이다.
- JDBC API: 여러 인터페이스와 클래스를 제공하여 데이터베이스와의 연결, SQL 쿼리 실행, 결과 처리 등을 가능하게 한다.
주요 인터페이스 및 클래스
- DriverManager: 드라이버 로드 및 데이터베이스 연결을 관리한다.
- Connection: 데이터베이스와의 연결을 나타낸다.
- Statement: SQL 쿼리를 실행하는 데 사용된다.
- PreparedStatement: 미리 컴파일된 SQL 쿼리를 실행하는 데 사용되며, 보안 및 성능 이점을 제공한다.
- ResultSet: 쿼리 결과를 저장하고 이를 처리하는 데 사용된다.
주요 기능
- 연결 설정: DriverManager를 사용하여 데이터베이스에 연결한다.
- SQL 쿼리 실행: Statement, PreparedStatement를 사용하여 SQL 쿼리를 실행한다.
- 트랜잭션 관리: JDBC는 데이터베이스 트랜잭션을 명시적으로 관리할 수 있게 한다.
- 예외 처리: SQL 예외를 적절히 처리하여 안정성을 확보한다.
예제 코드
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/database_name";
String user = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, user, password)) {
String query = "SELECT * FROM table_name WHERE column_name = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, "value");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println("Column Value: " + rs.getString("column_name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
데이터 모델링
데이터 모델링은 데이터베이스를 설계하기 위해 데이터를 구조화하고 표현하는 과정이다. 이 과정에서는 데이터가 어떻게 저장되고, 접근되고, 관리될지를 정의한다. 데이터 모델링은 데이터베이스 설계의 기초가 되며, 데이터의 논리적 구조와 관계를 명확히 하는 데 중점을 둔다.
생명주기
- 요구사항 수집 및 분석
- 설계
- 개념적 모델링
- 논리적 모델링
- 물리적 모델링
- 구현
- 운영
- 감시 및 개선
개념적 모델링
개념적 모델링은 사용자 요구사항을 반영하여 데이터베이스의 개념적 구조를 정의하는 단계이다. 이 단계에서는 주로 ER 다이어그램을 사용하여 엔터티, 속성, 관계를 시각적으로 표현한다.
- 엔터티: 데이터베이스에서 관리해야 할 대상이다. 예) 학생, 강좌
- 속성: 엔터티가 가지는 특성이다. 예) 학생의 이름, 나이
- 관계: 엔터티 간의 연관성이다. 예) 학생이 강좌를 수강
논리적 모델링
논리적 모델링은 개념적 모델을 기반으로 논리적 모델을 설계하는 단계이다. 이 단계에서는 ER 다이어그램을 관계형 모델로 변환하고, 정규화를 통해 데이터의 중복과 이상현상을 제거한다.
- 테이블: 엔터티를 관계형 데이터베이스의 테이블로 변환한다.
- 열: 속성을 테이블의 열로 변환한다.
- 키: 기본키와 외래키를 정의한다.
- 정규화: 정규화 과정을 통해 데이터 구조를 최적화한다.
물리적 모델링
물리적 모델링은 논리적 모델을 특정 DBMS에 맞게 물리적 구조로 변환하는 단계이다. 이 단계에서는 데이터의 실제 저장 구조와 접근 방법을 정의한다.
ER 모델 (Entity-Relationship Model)
ER 모델은 데이터베이스 설계의 개념적 모델링 단계에서 사용되는 모델이다. 이는 데이터베이스의 논리적 구조를 시각적으로 표현하는 데 도움을 주며, 엔터티, 속성, 관계를 사용하여 데이터베이스의 스키마를 나타낸다.
개체와 개체 타입
- 개체: 데이터베이스에서 저장하고 관리해야 할 실세계의 객체를 나타낸다. 예) 학생, 강좌, 도서
- 개체 타입: 유사한 개체들의 집합을 정의하며, 개체들이 공통적으로 가지는 속성을 포함한다. 예) 학생(학생ID, 이름, 나이)
속성
속성은 개체가 가지는 특성을 나타내며, 개체 타입의 일부분으로 정의된다. 각 속성은 특정 개체에 대해 고유한 값을 가진다.
- 기본 속성: 더 이상 나눌 수 없는 속성이다. 예) 학생의 이름, 나이
- 복합 속성: 여러 하위 속성으로 구성된 속성이다. 예) 주소 (도시, 도로명, 우편번호)
- 단일값 속성: 하나의 값만 가지는 속성이다. 예) 학생ID
- 다중값 속성: 여러 값을 가질 수 있는 속성이다. 예) 전화번호 (학생이 여러 개의 전화번호를 가질 수 있음)
- 유도 속성: 다른 속성으로부터 계산되는 속성이다.
관계와 관계 타입
- 관계: 두 개 이상의 개체 간의 연관성을 나타낸다. 예) 학생이 강좌를 수강함 (학생과 강좌 간의 관계)
- 관계 타입: 유사한 관계들의 집합을 정의한다. 예) 수강 관계 (학생-수강-강좌)
관계의 종류
- 일대일 관계: 하나의 개체가 하나의 개체와만 연관되는 관계이다.
- 일대다 관계: 하나의 개체가 여러 개의 개체와 연관되는 관계이다.
- 다대다 관계: 여러 개의 개체가 여러 개의 개체와 연관되는 관계이다.
약한 개체 타입
약한 개체 타입은 독립적으로 존재할 수 없고, 다른 개체 타입에 의해 식별되어야 하는 개체 타입이다. 약한 개체 타입은 자신의 고유한 키 속성을 가지지 않으며, 다른 개체 타입의 키 속성에 의존한다. 예) 주문 항목(주문 개체에 종속됨)
식별자
식별자는 개체 타입의 각 개체를 고유하게 식별하는 속성 또는 속성들의 집합이다. 약한 개체 타입의 식별자는 관련된 강한 개체 타입의 키 속성과 약한 개체 타입의 고유한 속성으로 구성된다. 예) 주문 항목의 식별자 (주문ID + 항목번호)
이상현상 (Anomalies)
이상현상은 데이터베이스 테이블에 중복된 데이터가 존재할 때 발생하며, 데이터 삽입, 갱신, 삭제 과정에서 비효율적이거나 일관성이 깨지는 문제를 말한다. 데이터베이스 정규화를 통해 해결할 수 있다.
- 삽입 이상 삽입 이상은 새로운 데이터를 삽입할 때 불필요한 데이터도 함께 삽입해야 하거나, 삽입 자체가 불가능한 상황을 말한다.
- 예) 학생 테이블에 학생 정보와 수강 강좌 정보가 함께 저장되어 있는 경우, 수강 강좌가 없는 학생의 정보를 삽입할 수 없다.
- 갱신 이상 갱신 이상은 데이터를 갱신할 때 데이터베이스의 일관성이 깨질 수 있는 상황을 말한다. 동일한 데이터가 여러 장소에 중복 저장되어 있을 때 발생한다.
- 예) 한 학생이 여러 강좌를 수강하고 있는 경우, 주소 변경 시 모든 레코드의 주소를 갱신해야 한다.
- 삭제 이상 삭제 이상은 데이터를 삭제할 때 의도하지 않은 데이터도 함께 삭제되는 현상을 말한다.
- 예) 한 학생이 수강 강좌를 삭제할 때, 학생 정보도 함께 삭제될 수 있다.
함수 종속성 (Functional Dependency)
함수 종속성은 데이터베이스에서 하나의 속성이 다른 속성에 의해 결정되는 관계를 의미한다.
- 결정자: 다른 속성의 값을 결정하는 속성
- 종속자: 결정자에 의해 값이 결정되는 속성
함수 종속성은 A→B로 표현되며, 이는 A가 B를 함수적으로 결정한다는 의미이다. 예) 학생 테이블에서 학생ID는 학생이름과 주소를 결정한다.
완전 함수 종속성
기본키 전체에 종속된 경우를 말한다. 기본키의 모든 속성이 종속자를 결정하는 데 필요하다.
예) 수강 기록에서 (학생ID, 강좌ID) → 성적은 완전 함수 종속성이다.
부분 함수 종속성
합성키의 일부에만 종속된 경우를 말한다. 이는 제2정규형에서 제거되어야 한다.
예) 수강 기록에서 학생ID → 학생이름은 부분 함수 종속성이다. 학생이름은 학생ID에만 종속되어 결정되며, 강좌ID는 필요하지 않다.
이행적 함수 종속성 (Transitive Dependency)
이행적 함수 종속성은 A→B이고 B→C일 때, A→C가 성립하는 경우를 말한다. 이는 제3정규형에서 제거되어야 한다.
예) 직원 테이블에서 직원ID → 부서ID이고 부서ID → 부서이름이면, 직원ID → 부서이름은 이행적 함수 종속성이다. 부서ID를 거쳐 부서이름이 결정되므로 이행적 종속성이 존재한다.
정규화 (Normalization)
정규화는 데이터베이스의 설계 과정에서 데이터를 구조화하여 데이터의 중복을 최소화하고 이상현상을 방지하기 위한 과정이다. 정규화를 통해 데이터의 무결성과 일관성을 유지할 수 있다. 각 정규형은 특정한 함수 종속성을 제거하여 데이터베이스를 최적화한다.
제1정규형
제1정규형은 모든 속성이 원자값을 가져야 한다. 즉, 각 칼럼에는 하나의 값만 포함되어야 한다.
- 비정규화된 테이블학생ID학생이름강좌
1 홍길동 수학, 영어 2 이순신 과학, 역사 - 제1정규형 테이블학생ID학생이름강좌
1 홍길동 수학 1 홍길동 영어 2 이순신 과학 2 이순신 역사
제2정규형
제2정규형은 제1정규형을 만족하고, 기본키가 아닌 모든 속성이 기본키 전체에 완전 함수적 종속을 가져야 한다. 부분 함수 종속성을 제거한다.
예시
- 제1정규형 테이블학생ID강좌ID학생이름성적
1 101 홍길동 A 1 102 홍길동 B 2 101 이순신 A - 제2정규형 테이블
- 학생 테이블학생ID학생이름
1 홍길동 2 이순신 - 수강 테이블학생ID강좌ID성적
1 101 A 1 102 B 2 101 A
- 학생 테이블학생ID학생이름
제3정규형
제2정규형을 만족하고, 이행적 함수 종속성이 없어야 한다. 즉, 기본키가 아닌 모든 속성이 기본키에 직접 종속되어야 한다.
- 제2정규형 테이블학생ID강좌ID교수이름교수ID
1 101 김교수 1001 1 102 박교수 1002 2 101 김교수 1001 - 제3정규형 테이블
- 학생 수강 테이블학생ID강좌ID
1 101 1 102 2 101 - 강좌 테이블강좌ID교수ID
101 1001 102 1002 - 교수 테이블교수ID교수이름
1001 김교수 1002 박교수
- 학생 수강 테이블학생ID강좌ID
BCNF
제3정규형을 만족하면서, 모든 결정자가 후보키여야 한다. 결정자가 후보키가 아닌 경우 이를 제거한다.
예시
- 제3정규형 테이블강좌ID교수ID교수이름
101 1001 김교수 102 1002 박교수 - BCNF 테이블
- 강좌 테이블강좌ID교수ID
101 1001 102 1002 - 교수 테이블교수ID교수이름
1001 김교수 1002 박교수
- 강좌 테이블강좌ID교수ID
무손실 분해
무손실 분해는 정규화 과정에서 테이블을 분해할 때 데이터베이스의 손실 없이 원래의 데이터를 정확히 복구할 수 있도록 하는 분해 방법이다.
무손실 분해의 조건
- 원래 테이블을 분해한 후 다시 조인했을 때, 원래의 데이터를 완벽하게 복구할 수 있어야 한다.
- 분해된 테이블들 간에 공통 속성(키 속성)이 존재해야 한다.
예시
- 원래 테이블학생ID학생이름강좌ID강좌이름
1 홍길동 101 수학 2 이순신 102 과학 - 무손실 분해된 테이블
- 학생 테이블학생ID학생이름
1 홍길동 2 이순신 - 수강 테이블학생ID강좌ID
1 101 2 102 - 강좌 테이블강좌ID강좌이름
101 수학 102 과학
- 학생 테이블학생ID학생이름
두 테이블을 학생ID와 강좌ID를 기준으로 조인하면 원래의 테이블을 복구할 수 있으므로 무손실 분해이다.
트랜잭션
트랜잭션은 DBMS에서 데이터를 다루는 논리적인 작업의 단위이다. 데이터베이스에서 장애가 발생할 경우 데이터를 복구하는 작업의 단위가 되며, 여러 작업이 동시에 같은 데이터를 다룰 때 이 작업을 서로 분리하는 단위가 된다.
예시
DBMS에 1번과 2번의 SQL문을 하나의 수행 단위로 알리기 위해 START TRANSACTION 문과 COMMIT 문을 사용하여 트랜잭션의 시작과 끝을 표시한다.
START TRANSACTION;
UPDATE Account SET balance = balance - 10000 WHERE name = '박지성';
UPDATE Account SET balance = balance + 10000 WHERE name = '김연아';
COMMIT;
트랜잭션의 성질 (ACID 성질)
- 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 않아야 한다.
- 일관성(Consistency): 트랜잭션을 수행하기 전이나 수행한 후에도 데이터베이스는 항상 일관된 상태를 유지해야 한다.
- 고립성(Isolation): 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 한다.
- 지속성(Durability): 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.
원자성
트랜잭션이 원자처럼 더 이상 쪼개지지 않는 하나의 프로그램 단위로 동작해야 한다는 의미이다. 일부만 수행되는 일이 없도록 전부 수행하거나 아예 수행하지 않아야 한다. 트랜잭션 중간에 작업이 잘못되거나 중단되면 회복 알고리즘을 이용해서 변경한 내용을 취소하고 이전 상태로 복구한다. ROLLBACK은 트랜잭션을 취소하는 명령어이다.
일관성
트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 한다는 의미이다. 테이블이 생성될 때 CREATE 문과 ALTER 문의 무결성 제약조건을 통해 명시된다. 예) 계좌이체 트랜잭션의 일관성 조건은 A계좌 + B계좌 = 20만원이다.
고립성
여러 트랜잭션이 동시에 수행될 때 상호 간섭이나 데이터 충돌이 일어나지 않는 현상이다. 수행 중인 트랜잭션이 완료될 때까지 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음을 의미한다. 격리성의 보장을 위해 여러 트랜잭션이 동시에 수행되더라도 마치 순서대로 하나씩 수행되는 것처럼 정확하고 일관된 결과를 얻을 수 있도록 하는 기능이 필요하다.
지속성
트랜잭션이 정상적으로 완료되면 변경된 내용이 반드시 데이터베이스에 반영되어야 한다. 트랜잭션이 수행을 완료하면 변경한 내용을 데이터베이스에 반영하고, 실패 상태에서는 작업한 내용을 취소한다.
트랜잭션과 DBMS
DBMS는 트랜잭션이 원자성, 일관성, 고립성, 지속성을 유지할 수 있도록 지원한다. 원자성과 지속성을 유지하기 위해 회복(복구) 관리자 프로그램을 작동시킨다. DBMS는 일관성을 유지하기 위해 무결성 제약조건을 활용하고, 고립성을 유지하기 위해 동시성 제어 알고리즘을 작동시킨다.
동시성 제어
동시성 제어는 데이터베이스에서 여러 트랜잭션이 동시에 수행될 때 데이터의 일관성을 유지하기 위해 트랜잭션의 데이터 접근을 제어하는 기능이다.
갱신 손실 문제
갱신 손실은 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생한다. 이는 데이터베이스에서 절대로 발생하면 안 되는 현상이다.
락
락은 트랜잭션이 데이터에 대한 접근을 제어하기 위해 사용하는 메커니즘이다. 한 트랜잭션이 먼저 접근한 데이터에 대해 연산이 끝날 때까지는 다른 트랜잭션이 그 데이터에 접근하지 못하도록 상호 배제한다. 락의 유형에는 공유락과 배타락이 있다.
오손 읽기
오손 읽기는 읽기 작업을 하는 트랜잭션이 쓰기 작업을 하는 트랜잭션이 작업한 중간 데이터를 읽기 때문에 발생하는 문제이다. 작업 중인 트랜잭션이 작업을 철회하면 읽은 데이터가 무효가 되어 잘못된 결과를 도출하게 된다.
반복 불가능 읽기
반복 불가능 읽기는 트랜잭션이 데이터를 읽고 다른 트랜잭션이 데이터를 갱신한 후 다시 데이터를 읽을 때 발생하는 문제이다. 두 번째 읽기에서 이전의 결과와 다른 결과가 나올 수 있다.
유령 데이터 읽기
유령 데이터 읽기는 트랜잭션이 데이터를 읽고 다른 트랜잭션이 데이터를 삽입한 후 다시 데이터를 읽을 때 발생하는 문제이다. 두 번째 읽기에서 이전에 없던 데이터가 나타나는 현상이다.
회복
회복은 데이터베이스에 장애가 발생했을 때 데이터베이스를 장애가 발생하기 전의 일관성 있는 상태로 되돌리는 DBMS의 기능이다. 회복 관리는 트랜잭션의 특성을 보장하고, 데이터베이스를 일관된 상태로 유지하기 위해 필수적인 기능이다.
로그 파일과 회복
DBMS는 트랜잭션이 종료되었는지 여부를 판단하여 종료된 트랜잭션은 재실행(REDO)을, 중단된 트랜잭션은 취소(UNDO)를 진행한다.
트랜잭션의 재실행(REDO)
트랜잭션이 완료되었음을 로그 파일을 통해 확인하고, 변경 내용을 다시 데이터베이스에 기록하는 과정이다.
트랜잭션의 취소(UNDO)
트랜잭션이 완료되지 않았음을 로그 파일을 통해 확인하고, 변경 내용을 원상 복구하는 과정이다.
'전공 > 데이터베이스' 카테고리의 다른 글
[DB] Schema, Index, SQL Injection (0) | 2024.09.29 |
---|---|
[DB] 대용량 트래픽에서 DB 관리 (Connection Pool) (0) | 2024.09.29 |