다수의 웹 어플리케이션이 회원 정보, 게시글 내용, 컨텐츠 데이터 등을 저장하기 위해 데이터베이스
를 사용한다. 웹 프로그래밍에서 데이터베이스를 다루는 것은 반드시 익혀야 할 기술 중의 하나이다. 웹 프로그래밍은 데이터베이스 프로그래밍이 반이라고 할 정도로 거의 모든 JSP 페이지가 데이터베이스와 통신한다. 자바에서는 JDBC API를 이용해서 데이터베이스 프로그래밍을 하게 되는데, 이 장에서는 웹 프로그래밍을 하는 데 있어 최소한 알아야 하는 JDBC API 사용법을 익혀보록 하겠다.
우리가 흔히 '데이터베이스(Database)'라고 부르는 것의 주요 목적은 데이터를 저장했다가 필요할 때에 사용하는 것이다. 데이터베이스를 관리하는 시스템을 DBMS(Database Management System)
이라고 부르며 주로 사용하는 DBMS로는 오라클, MySQL, MS SQL 서버 등이 있다.
데이터베이스는 데이터를 지속적으로 관리하고 보호하는 것을 주목적으로 하기 때문에, DBMS는 데이터를 안정적으로 보관할 수 있는 다양한 기능을 제공하고 있다. 예를 들어, 데이터베이스를 백업하는 기능이 이에 해당한다. 데이터의 손실이 발생하면 안 되기 때문에 DBMS는 트랜잭션(Transaction)을 보장하여 데이터의 신뢰성을 높여주기도 한다. 이외에도 DBMS는 여러 가지 기능을 제공하고 있는데, 몇 가지 중요한 기능들을 정리하면 다음과 같다.
웹 어플리케이션을 구축할 때 주로 사용하는 데이터베이스는 관계형 데이터베이스(Relational DBMS)
이다. 널리 사용하고 있는 오라클, MySQL, MS SQL 등은 모두 관계형 데이터베이스다.
RDBMS에서 데이터를 저장하는 장소를 테이블(table)
이라고 한다. 테이블은 어떤 데이터를 저장하면 그 데이터의 길이는 최대 몇 글자인지 등의 정보를 갖고 있는데, 이처럼 테이블의 구조와 관련된 정보를 테이블 '스키마'
라고 부른다.
테이블의 구조는 각각의 정보를 저장하는 칼럼과 칼럼 타입 그리고 각 칼럼의 길이로 구성된다. 예를 들어, 회원 정보를 저장하는 테이블의 스키마는 다음과 같은 구조를 갖는다.
자바 언어를 보면 'int val = 10;'과 같은 코드를 사용하여 변수를 저장한다. 여기서 int는 값의 타입을 나타내고 val은 변수의 이름을 나타내는 것처럼, 테이블 스키마에서도 저장되는 데이터를 구분하기 위해 칼럼 이름
을 사용하고 각 칼럼에 저장되는 값의 종류를 구분하기 위해서 칼럼 타입
을 사용한다. 칼럼 타입은 SQL 타입이다. 자바의 변수 타입이 저장 가능한 값의 범위가 있듯이 테이블에 저장되는 값의 길이에도 제약이 있다.
스키마는 하나의 데이터에 대한 구조를 나타낸다.
예를 들어, 위의 그림의 스키마는 '회원 정보' 데이터에 대한 구조를 보여주고 있다. 여기서 'MEMBERID, PASSWORD, NAME, EMAIL'의 칼럼 데이터 모음을 '레코드(record)'
라고 부른다.
위의 그림에서 보듯이 하나의 테이블은 여러 개의 레코드로 구성된다. 각 레코드는 테이블의 스키마에 정의된 칼럼에 해당하는 값을 갖는다. 이 레코드, 칼럼, 그리고 테이블을 사용해서 데이터를 저장하고 조회하는 작업을 수행하는 것이 바로 데이터베이스 프로그래밍이다.
테이블에 저장한 레코드를 사용하려면 각 레코드를 구별하는 방법이 필요하다. 예를 들어, 전체 레코드 중에서 특정한 레코드를 한 개만 읽어 와야 한다고 해보자. 이때 각 레코드를 구분하는 방법이 존재하지 않으면 처음부터 끝까지 모든 레코드를 검색해야만 한다. 레코드 수가 수십에서 수백 개라면 빠르게 찾을 수 있겠지만, 수십만에서 수백만 개라면 한 개의 레코드를 찾는 데 많은 시간이 걸린다.
레코드를 미리 특정 값을 이용해서 정렬해 놓으면 좀 더 빠르게 레코드를 찾을 수 있을 것이다. 이런 목적으로 사용할 수 있는 것이 바로 주요키(Primary Key) 칼럼
이다. 주요키 칼럼은 하나의 테이블에 저장된 모든 레코드가 서로 다른 값을 갖는 칼럼을 의미한다. 회원 아이디와 같이 서로 다른 값을 가져야 하는 칼럼을 주요키로 사용한다. 위의 그림에서 MEMBERID 칼럼이 레코드마다 서로 다른 값을 가진다면, MEMBERID 칼럼을 주요키로 사용할 수 있다.
주요키와 더불어 레코드를 분류할 때 사용되는 것이 인덱스(Index)
이다. 인덱스는 데이터의 순서를 미리 정렬해서 저장할 때 사용한다. 예를 들어, 도서관을 생각해보자. 도서관은 보통 책의 이름에 따라서 책의 위치를 정리해놓는다. 그렇게 함으로써 사람들이 책 이름으로 쉽게 책의 위치를 찾을 수 있도록 하고 있다. 이와 비슷하게 데이터베이스도 특정 칼럼을 사용해서 레코드를 쉽게 찾을 수 있도록 미리 정리된 표를 만들어 두는데, 이것이 바로 인덱스이다. 주요키도 인덱스의 일종으로서, 인덱스는 중복된 값에 대한 정렬이 가능하지만 주요키는 중복된 값을 가질 수 없다는 차이가 있다.
예를 들어, 위의 그림에서 MEMBERID 칼럼은 모든 레코드가 서로 다른 값을 가지므로 주요키로 사용되지만, 이름을 저장하는 NAME 칼럼은 두 레코드가 같은 값을 가질 수 있다. 회원의 이름으로 데이터를 조회하는 기능이 많은 경우에는 회원의 이름 칼럼을 사용한 인덱스를 생성하면 회원 이름으로도 빠르게 데이터를 조회할 수 있게 된다.
데이터베이스 프로그래밍은 아래 그림과 같이 네 단계를 거치는 것이 일반적이다.
데이터베이스를 사용하려면 먼저 데이터베이스에 연결해야 한다. 그런 후, 데이터베이스에 데이터를 삽입하거나 변경하거나 삭제하는 등의 작업을 수행한다. 마지막으로 원하는 작업을 수행했으면 연결을 종료한다. 이때 2~3번 과정은 작업을 완료할 때까지 반복해서 수행할 수 있다.
데이터베이스 프로그래밍의 네 단계 과정은 자바의 데이터베이스 프로그래밍인 JDBC 프로그래밍에서도 동일하게 적용된다.
데이터베이스 프로그래밍에서는 위의 그림에서 보듯이 3개의 요소가 필요하다.
DBMS는 앞에서 말했듯이 오라클이나 MySQL과 같은 데이터베이스 관리 프로그램을 의미한다. DBMS가 필요하다는 말은 다시 말해서 오라클이나 MySQL과 같은 프로그램을 설치해야 한다는 것을 뜻한다.
데이터를 저장하려면 데이터를 저장할 공간인 데이터베이스를 만들어주어야 한다. 데이터베이스를 생성하는 방법은 DBMS마다 다르므로, 실제로 사용할 DBMS에 맞게 생성해주어야 한다.
마지막으로 DBMS 클라이언트가 필요하다. DBMS를 설치할 때 클라이언트가 함께 설치되기도 하고, 클라이언트만 따로 설치할 수도 있다. 한 DBMS에는 여러 종류의 클라이언트가 존재하기도 한다. 오라클은 SQL Plus라는 클라이언트를 함께 제공하며, TOAD라는 오라클 클라이언트 프로그램이 따로 존재한다. MySQL을 설치할 때 사용되는 기본 클라이언트는 mysql.exe이지만 MySQL Workbench라는 클라이언트를 따로 설치할 수도 있다. 자바에서는 JDBC Driver가 클라이언트의 역할을 대신하게 된다.
참고