데이터베이스부터 JDBC까지
데이터베이스
일반적으로 컴퓨터 시스템에 전자 방식으로 저장된 구조화된 정보 또는 데이터의 체계적인 집합을 의미한다.
보통 데이터베이스 관리 시스템 DBMS에 의해 제어된다.
오늘날 운용되는 가장 공통적인 유형의 데이터베이스는 일련의 행과 열로 모델링되며, 이는 프로세싱과 데이터 쿼리 작업을 더 효율적으로 실행하기 위함이다. 이로써 데이터를 쉽게 엑세스, 관리, 수정, 업데이트, 제어를 체계적으로 수행할 수 있다. - Oracle 공식문서
데이터베이스가 나오기 전의 시스템 : 파일 처리 시스템
폴더별로 묶어 데이터를 개별 관리하는 시스템인데, 사용하고자 하는 애플리케이션이 직접적으로 데이터를 관리하기 떄문에
- 데이터 종속의 문제
- 데이터가 특정 사용자, OS만 사용될 수 있는 제한이 생긴다.
- 데이터 중복의 문제
- 애플리케이션별로 데이터를 생성해야 하기 때문에, 동일한 데이터가 여러번 생길 수 있는 문제가 있다.
- 데이터가 중복되면 일관성이 떨어지는 문제가 발생한다.
- 무결성 훼손의 문제
- 동시성 문제
- 파일 처리 시스템에서 다수의 사용자가 동시 접근하면 데이터 관리의 일관성이 떨어진다.
DBMS
데이터베이스 관리 시스템(Database Management System)
데이터를 지속적으로 관리하고 보호하는 것을 주 목적으로 한다.
저장된 데이터의 구성, 저장, 관리와 사용을 위한 소프트웨어 패키지를 말한다.
DBMS는 다음과 같은 구조로 이뤄졌다.
필수 기능
- 데이터 정의Definition 기능
- 다양한 응용 프로그램과 DB가 서로 인터페이스 할 수 있는 수단 제공.
- 하나의 저장된 DB를 기초로 여러 사용자와 응용 프로그램의 다양한 데이터 요구를 지원할 수 있도록 DB 구조를 정의하는 기능 제공
- 데이터 조작Manipulation 기능
- 사용자와 DB간의 인터페이스를 위한 수단을 제공, B에 저장된 데이터의 CRUD 등과 같은 DB의 연산 처리하는 기능
- 데이터 제어Control 기능
- 공용으로 관리되는 DB의 내용을 정확하고 안전하게 유지할 수 있도록 하는 3가지 제어 기능을 제공
- 데이터의 삽입, 삭제 등 DB 변경 시에 데이터의 무결성 및 일관성 유지 가능
- 권한이 부여된 사용자만이 허용된 데이터에 접근할 수 있도록 접근 권한 검사 기능
- 여러 사용자가 DB에 동시에 접근할 수 있도록 동시성 제어 가능
- 공용으로 관리되는 DB의 내용을 정확하고 안전하게 유지할 수 있도록 하는 3가지 제어 기능을 제공
데이터 베이스 무결성
데이터의 입력이나 변경등을 제한하여 데이터의 안정성을 저해하는 요소를 막는것.
- Entity Integrity
- 테이블에 있는 모든 행들이 유일한 식별자를 가질 것을 요구한다.
- Domain Integrity
- 한 컬럼에 대해 NULL의 허용 여부와 타당한 데이터 값들을 지정한다.
- 자료형, 규칙과, 제약, 값 범위등을 제한함
- Referential Integrity
- 기본 키와 참조 키 간의 관계가 항상 유지 됨을 보장함.
- 참조되는 테이블의 행을 이를 참조하는 참조키가 존재하는 한 삭제될 수 없고 기본 키도 변경될 수 없다.
데이터 무결성 강화
테이블
관계형 데이터베이스에서 세로줄과 가로줄의 모델을 이용하여 정렬된 데이터의 집합이다.
테이블 내의 데이터는 물리적으로 데이터베이스에 저장되지는 않는다. 뷰 또는 관계형 테이블이지만 이들의 데이터는 쿼리 시간에 계산된다.
데이터베이스안에 실제 데이터가 저장되는 형태, 파일에 데이터를 저장할 때 어떤 구조로 저장할지 결정하는 틀이다.
레코드
데이터베이스에서 하나의 단위로 취급되는 자료의 집합.
하나의 레코드는 table에서 가로 방향으로 한 줄을 나타낸다. row또는 tuple이라고도 한다.
한 건의 자료를 구성하는 레코드를 엔티티라고 한다. 각각의 레코드를 다른 레코드와 구별하기 위해 키값을 사용하기도 한다.
세로는 열(column), 필드(field), 속성(attribute) 라고 한다.
스키마
테이블의 구조와 관련된 정보를 스키마 Schema 라고 한다.
- 개체의 특성을 나타내는 속성
- 속성들의 집합으로 이뤄진 개체
- 개체 사이에 존재하는 관계에 대한 정의
- 이들이 유지해야 할 제약조건들을 기술
스키마의 특징
Data Dictionary에 저장됨
(데이터 사전 : 시스템 전체에서 나타내는 데이터 항목들에 대한 정보를 지정한 중앙 저장소, 이 정보에는 항목을 참조하는데 사용되는 식별자, 항목에 대한 엔티티의 구성요소, 항목이 저장되는 곳, 항목을 참조하는 곳 등을 포함)
시간에 따라 불변
데이터의 구조적 특성을 의미함
사용자의 관점에 따라
개념 스키마, 내부스키마, 외부 스키마로 나눔
- 개념 스키마
- 조직체 전체를 관장하는 입장에서 DB를 정의한 것
- 특징
- 데이터베이스의 전체적인 논리적 구조를 의미함
- 데이터베이스에 실제로 어떤 데이터가 저장되어있고, 관계는 어떻게 되는지
- 개체간의 관계와 제약조건 명시
- 데이터 베이스당 하나만 존재
- 내부 스키마
- 물리적인 저장장치 입장에서 DB가 저장되는 방법을 기술한 것
- 구체적으로 개념 스키마를 디스크 기억장치에 물리적으로 구현하기 위한 방법을 기술한 것.
- 실제로 저장될 내부 레코드 형식.
- 외부 스키마
- 사용자가 개인의 입장에서 필요한 데이터베이스의 논리적 구조를 정의한 것
- 특징
- 실세계에 존재하는 데이터들을 어떤 형식 구조 배치 화면을 통해 사용자에게 보여줄 것인가
- 전체 데이터 베이스의 한 논리적 부분 (서브 스키마라고도 함)
- 같은 데이터베이스에 대해서도 서로 다른 관점을 정의할 수 있도록 허용
주요키와 인덱스
주요키(Primaray Key)
테이블에 저장한 레코드를 사용하려면 각 레코드를 구별하는 방법이 필요하다.
수십만개, 수백만개에의 레코드에서 미리 특정 값을 이용해서 정렬해 놓으면 더 빠르게 레코드를 찾을 수 있다.
인덱스(Index)
인덱스는 데이터의 순서를 미리 정렬해서 저장할 때 사용한다.
말 그래도 색인이고, 무언가를 빠르게 찾기 위한 수단으로 보면 된다.
레코드의 특정 칼럼을 사용해서 레코드를 쉽게 찾을 수 있도록 미리 정리된 표를 만들어 두는 방법이다 .
Index를 걸면 Index를 거는 컬럼을 기준으로 새로운 자료구조를 생성하여 별도의 디스크 공간에 저장한다.
tuple을 빠르게 찾기 위해 B-tree 같은 자료구조를 생성하여 별도의 저장공간에 저장한다.
그래서 Index를 통해 데이터 검색 속도를 향상시킨다. 인덱스는
DBMS 실행 순서
JDBC의 구조
사용법
SQL
데이터를 조작하고 정의하고 엑세스하기 위해 거의 모든 관계형 데이터베이스에서 사용되는 프로그래밍 언어. SQL은 1970년대 IBM에서 처음 개발되었음.
예제)
MySQL에서 데이터베이스를 생성하는 쿼리
(DBMS는 운영체제와 별도로 자신만의 사용자 계정을 가지고 있다. MS SQL의 경우 )
create database minseong default character set utf8;
데이터베이스를 추가한 뒤에는 MySQL에서 사용할 사용자를 추가한다. 사용자를 추가하기 위해서는 다음과 같은 순서로 명령을 실행하면 된다.
CREATE USER 'minseong'@'localhost' IDENTIFIED by 'pw';
GRANT ALL PRIVILEGES ON minseong.* TO 'minesong'@'localhost';
CREATE USER 쿼리를 통해 새로운 계정을 생성한다.
구조는 아래와 같다.
create user '[계정]'@'[호ㅓ스트]' identified by '[암호]'
권한 목록이 all privileges이면 모든 권한을 부여한다. 특정 권한만 부여하고 싶다면 다음과 같이 개별 권한 목록을 지정하면 된다.
grant select, insert, update, delete, create, drop on minseong.* to 'minseong'@%;
권한 부여 대상을 전체로 하고 싶으면 *를 지정하면 된다.
SQL의 기초
Structured Query Language의 약자로 데이터베이스로부터 데이터를 조회하고 삭제하는 등의 작업을 수행할 때 사용하는 언어
표준 SQL의 주요 타입
SQL 타입 | 설명 |
CHAR | 확정길이의 문자열 저장. 표준의 경우 255글자까지만 저장 가능 |
VARCHAR | 가변길이의 문자열 저장. 표준의 경우 255글자까지만 저장 가능 |
LONG VARCHAR | 긴 가변 길이의 문자열 저장. |
NUMERIC | 숫자를 저장 |
DECIMAL | 십진수 저장 |
INTEGER | 정수 저장 |
TIMESTAMP | 날짜와 시간을 저장 |
TIME | 시간을 저장 |
DATE | 날짜를 저장 |
CLOB | 대량의 문자열 저장 |
BLOB | 대량의 이진 데이터 저장 |
(표준 SQL 타입이 존재하지만, 표준 SQL 뿐만 아니라, 자체적으로 확장 타입을 추가적으로 제공한다.)
간단하게 예제를 통해 쿼리를 알아보자.
테이블 생성 쿼리
create table TABLENAME (
COL_NAME1 COL_TYPE(LEN1),
COL_NAME2 COL_TYPE(LEN2),
...
)
- TABLENAME : 테이블 식벽할 때 사용할 이름
- COL_NAME : 각 칼럼의 이름
- COL_TYPE : 각 칼럼에 저장된 값의 타입
- LEN : 저장될 값의 최대 길이
*(InnoDB 엔진을 사용해야 트랜잭션이 올바르게 처리된다.)
테이블 삽입 쿼리
insert into [테이블이름([칼럼1], [칼럼2], ... ) values ([값1], [값2] ... )
데이터 조회 쿼리
where 혹은 like를 통해 조건을 줄 수 있다.
select * from MEMBER where NAME = "민성";
select * from MEMBER where NAME like "%민성";
*Like 검색 시 주의 사항.
편리하지만 매우 느리다. 특히 문자열 양쪽의 %는 full scan을 유도한다.
데이터 쿼리 조회 - 정렬
데이터 쿼리 조회 - 집합
데이터 수정 쿼리
데이터 삭제 쿼리
조인 Join
두 개 이상의 테이블에서 관련 있는 데이터를 읽어올 때 사용한다.
조인의 기본 형식은 아래와 같다.
select A, 칼럼1, 칼럼2, B, 칼럼3, B 칼럼4
from [테이블1] as A, [테이블2] as B
where A.[칼럼x] = B.[칼럼y]
위 쿼리는 테이블1의 컬럼 x와 테이블2의 컬럼y와 같이 같은 레코드를 하나의 행으로 읽어온다.
JCBC
Java Database Connectivity의 약자이다.
다양한 데이터베이스와 상호작용할 수 있도록 해주는 Java API이다.
JDBC의 목적
Java EE 기술을 사용해서 만든 일부 엔터프라이즈 응용 프로그램이 있다.
이러한 앱은 애플리케이션 별 정보를 저장하기 위해 데이터베이스와 상호작용 해야 한다.
JDBC의 구성 요소
1. JDBC API : 데이터베이스와의 쉬운 통신에 도움이 되는 다양한 클래스, 메서드 및 인터페이스를 제공한다. 또한 Java SE 및 Java EE 플랫폼을 포함하는 두개의 패키지를 제공하여 WORA 가 가능하다.
2. JDBC Driver Manager : 웹 어플리케이션에서 데이터베이스 특정 드라이버를 로드함. 이 드라이버 관리자는 데이터베이스와의 연결을 설정함.
3. JDBC Test Suite : JDBC 드라이버가 수행하는 CRUD와 같은 작업을 테스트 하는데 쓰임
4. JDBC-ODBC Bridge Drivers : 데이터베이스 드라이버를 데이터베이스에 연결함. 이 브릿지 드라이버는 JDBC 메서드 호출을 ODBC 메서드 호출로 변홚마. ODBC 특정에 엑세스 하기 위해 원시 라이브러리가 있는 패키지를 사용함.
*ODBC : Open DataBase Connectivity. 데이터베이스를 엑세스 하기 위한 표준 개방형 응용 프로그램 인터페이스이다. MS사에서 개발하였고, 데이터베이스에 접근하기 위한 소프트웨어 표준 규격으로. 프로그램 내에 ODBC 문장을 사용하면 여러 종류의 데이터베이스에 접근할 수 있다.
ODBC에 정해진 순서에 따라 프로그램을 쓰면 접속처의 데이터베이스가 어떠한 DBMS에 관리되고 있는지 의식할 필요 없이 접근할 수 있음.
JDBC가 연결되는 과정
1. 드라이버 로드
커넥션 풀( DBCP)
참고
https://www.oracle.com/kr/database/what-is-database/
http://wiki.hash.kr/index.php/%EB%A0%88%EC%BD%94%EB%93%9C
https://lucy-the-marketer.kr/ko/growth/what-is-database/
https://jwprogramming.tistory.com/47