테이블
테이블은 관계형 데이터베이스에서 데이터 관리의 기본 구조다. 데이터가 가지는 공통적인 속성을 모아 정의한 칼럼(필드)으로 구성되며 칼럼에 저장되는 데이터는 숫자형, 문자형, 날짜형, 불형(Boolean) 등으로 구분된다. 또한 파일과 같은 바이너리 데이터를 저장하거나 매우 긴 텍스트를 저장할 수 있는 자료형도 있다.
예를 들어 다음과 같이 정리되지 않은 데이터가 있다고 가정한다.
김길동, AA대학교, 1999-01-21, kim@aa.com
park@bb.com, 박사랑, BB대학교, 2000-01-21
나최고, 1998-07-11, na@cc.com, CC대학교
김길동, BB대학교, 1999-03-10, kim@bb.com
AA대학교, 홍길동, 1999-12-10, hong@aa.com
어수선하지만 데이터의 내용을 보면 이름, 대학, 생년월일, 이메일로 공통된 정보를 가지고 있다. 이를 테이블로 표현하면 다음과 같다. (학생정보 테이블)
이름 | 대학 | 생년월일 | 이메일 |
김길동 | AA대학교 | 1999-10-21 | kim@aa.com |
박사랑 | BB대학교 | 2000-01-21 | park@bb.com |
나최고 | CC대학교 | 1998-07-11 | na@cc.com |
김길동 | BB대학교 | 1999-03-10 | kim@bb.com |
홍길동 | AA 대학교 | 1999-12-10 | hong@aa.com |
칼럼
칼럼(Column)은 테이블을 구성하는 기본 속성으로 필드, 어트리뷰트라고도 불린다.
위 표에서는 이름, 대학, 생년월일, 이메일이 칼럼이 된다. 각각의 칼럼에 저장되는 데이터는 동일한 타입이어야 하며 구체적인 자료형은 데이터베이스마다 차이가 있다.
로우
로우(Row)는 하나의 데이터셋을 의미하며 레코드 혹은 튜플이라고도 한다.
위 표에서는 한 사람의 데이터, 즉 김길동, AA대학교, 1999-10-21, kim@aa.com이 로우에 해당한다. 따라서 위 표에는 총 5개의 로우가 있다고 이야기할 수 있다.
자료형
칼럼에 들어갈 수 있는 데이터 유형으로 일반적으로 숫자형, 문자형, 날짜형, 불형(Boolean) 등으로 구분한다.
데이터베이스에서 사용하는 자료형
데이터베이스에는 일반적인 자료형 이외에도 파일과 같은 바이너리 데이터를 저장하거나 매우 긴 텍스트를 저장하기 위한 자료형 등이 별도로 존재하는데, 데이터베이스마다 이러한 특수 타입을 지원하는 범위가 다르다. 또한 JSON 데이터의 활용이 늘어나면서 JSON 데이터를 저장하기 위한 칼럼 구조 혹은 변환 함수 등을 제공하기도 한다.
또한 데이터베이스마다 사용하는 자료형의 이름에 차이가 있은 주의해야 한다. 예를 들어 숫자의 경우 오라클은 number, MySQL은 int, double을 사용한다.
제약 조건
데이터베이스에서 제약 조건(Constraint)이란 칼럼에 부여되는 일종의 속성으로 저장될 데이터에 대한 요구사항이라 할 수 있다. 물론 데이터를 저장하는 프로그램 측에서 특정 조건을 만족하는 경우에만 저장하도록 로직을 설계할 수도 있다. 하지만 로직에 의한 오류가 존재할 수 있으며, 프로그램을 통하지 않고 들어오는 잘못된 데이터를 원천적으로 차단할 수 없다.
반면 제약 조건은 데이터베이스 자체적으로 저장될 데이터에 대한 요구 조건을 설정하는 것으로 제약 조건을 벗어나는 데이터는 원천적으로 차단된다. 이는 데이터베이스의 무결성(Integrity)을 지키기 위한 방법이 된다.
무결성 : 신뢰할 수 있는 서비스 제공을 위해서 의도하지 않은 요인에 의해 데이터, 스프트웨어, 시스템 등이 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성.
데이터베이스의 대표적인 제약 조건
종류 | 설명 | 특징 |
NOT NULL | 칼럼에 데이터를 비워둘 수 없다. | 기본은 NULL 가능으로 설정되어 있다. |
UNIQUE | 기본키는 아니지만 중복값이 허용되지 않는다. | 기본은 중복 가능으로 설정되어 있다. |
Primary Key | 데이터의 유일성을 보장하는 칼럼이다. | NOT NULL + UNIQUE, 테이블에 하나만 설정 가능하다. |
Foreign Key | 두 테이블 간의 참조 무결성을 보장한다. | 외래키로 지정된 칼럼값은 참조 테이블에 존재하는 값만 사용 가능하다. |
CHECK | 저장할 값의 범위 등을 지정한다. | 숫자 범위, 다른 칼럼값 비교 결과, 특정 문자 중 하나 등이다. |
IDENTITY | 유일한 값을 가지는 id 칼럼이다. | PK, Not Null, auto_increment가 자동 적용된다. |
MySQL의 경우 CHECK 제약 조건은 8.0.16 이후 버전에서만 지원된다.
키
키(Key)는 관계형 데이터베이스의 제약 조건 중 하나로, 데이터의 유일성 및 관계 설정을 위해 사용된다. 적절한 키의 사용은 데이터베이스 설계에서 매우 중요한 요소다.
기본키
기본키(Primary Key, PK)는 주키, 프라이머리키라고도 불린다. 테이블에 저장된 레코드(로우)를 서로 구분할 수 있도록 특정 칼럼에 설정하는 제약 조건이다. 기본키가 존재하지 않으면 데이터가 중복되고 특정 데이터 검색에 오류가 발생하기 때문에 꼭 설정되어 있어야 한다.
이름 | 대학 | 생년월일 | 이메일 |
김길동 | AA대학교 | 1999-10-21 | kim@aa.com |
박사랑 | BB대학교 | 2000-01-21 | park@bb.com |
나최고 | CC대학교 | 1998-07-11 | na@cc.com |
김길동 | BB대학교 | 1999-03-10 | kim@bb.com |
홍길동 | AA 대학교 | 1999-12-10 | hong@aa.com |
예를 들어 위 표에서 김길동 학생이 2명이기 때문에 이름으로 검색할 경우 2명의 학생이 검색된다. 따라서 이름만으로는 유일성 확보가 불가능하고 생년월일, 학교등 부가적인 칼럼의 정보를 조합해야 하는 어려움이 발생한다.
즉 이름은 중복이 가능하기 때문에 별도의 중복되지 않는 값이 기본키로 필요하다. 쉽게 생각할 수 있는 것은 학번, 주민등록번호 등의 고유번호더. 그러나 이러한 번호는 개인정보에 해당하므로 외부에 노출되지 않는 것이 좋기 때문에 기본키로 부적합하다.
보통 기본키는 시퀀스(Sequence)라고 불리는 단순 증가 값을 사용한다. 단순 증가 값이란 1부터 시작해서 1씩 단계적으로 증가하는 숫자로, 단순히 데이터를 서로 구분하는 용도로만 사용한다고 이해할 수 있다.
아래는 기본키가 추가된 학생정보 테이블이다.
번호(PK) | 이름 | 대학 | 생년월일 | 이메일 |
1 | 김길동 | AA대학교 | 1999-10-21 | kim@aa.com |
2 | 박사랑 | BB대학교 | 2000-01-21 | park@bb.com |
3 | 나최고 | CC대학교 | 1998-07-11 | na@cc.com |
4 | 김길동 | BB대학교 | 1999-03-10 | kim@bb.com |
5 | 홍길동 | AA 대학교 | 1999-12-10 | hong@aa.com |
데이터베이스에 따라서는 auto increment 속성을 통해 자동으로 증가 값을 입력하게 설정할 수도 있고 별도의 객체를 통해 지정해야 하는 경우도 있어 데이터베이스마다 확인이 필요하다.
외래키
외래키(Foreign Key, FK)는 테이블 간의 관계를 설정하기 위해 사용하며 참조 무결성을 제공하기 위한 용도로 사용된다.
이름 | 대학 | 생년월일 | 이메일 |
김길동 | AA대학교 | 1999-10-21 | kim@aa.com |
박사랑 | BB대학교 | 2000-01-21 | park@bb.com |
나최고 | CC대학교 | 1998-07-11 | na@cc.com |
김길동 | BB대학교 | 1999-03-10 | kim@bb.com |
홍길동 | AA 대학교 | 1999-12-10 | hong@aa.com |
위 표에서 대학 칼럼의 자료형은 문자열로, 다음의 데이터는 모두 동일한 학교를 의미한다.
AA대학교, AA 대학교, 에이에이 대학교, A A 대학교, AA대학 ...
이 경우 데이터의 의미는 동일하지만 검색에서 문제가 발생한다. 만약 AA대학교 학생만 검색하려고 할때 AA대학교를 제외한 다른 이름은 같은 의미임에도 검색 결과에 포함되지 않는다. 따라서 AA대학교 or AA 대학교 or 에이에이 대학교 등과 같이 조건 검색을 해야 하는 문제가 발생한다.
이러한 문제를 원천적으로 차단하기 위해서는 등록 가능한 대학정보 테이블을 별도로 두고 이를 참조할 수 있도록 외래키를 등록해 사용해야 한다.
대학정보 테이블은 아래 표와 같이 만들 수 있으며 이때 대학코드를 기본키(PK)로 설정한다.
대학코드(PK) | 대학명 | 위치 |
10011 | AA대학교 | 서울 |
10012 | BB대학교 | 인천 |
10013 | CC대학교 | 대전 |
이에 따라 위의 학생 정보 테이블은 아래표와 같이 수정될 수 있다. 대학 칼럼은 외래키(FK)로 설정하고 대학명 대신 대학정보 테이블의 대학코드를 외래키로 등록한다.
번호(PK) | 이름 | 대학코드(FK) | 생년월일 | 이메일 |
1 | 김길동 | 10011 | 1999-10-21 | kim@aa.com |
2 | 박사랑 | 10012 | 2000-01-21 | park@bb.com |
3 | 나최고 | 10013 | 1998-07-11 | na@cc.com |
4 | 김길동 | 10012 | 1999-03-10 | kim@bb.com |
5 | 홍길동 | 10011 | 1999-12-10 | hong@aa.com |
이때 학생정보 테이블의 대학 칼럼에 대학정보 테이블에 없는 값을 등록하면 에러가 발생하고 데이터가 등록되지 않는다는 것을 주의해야 한다. 또한 대학코드 테이블에서 특정 대학을 삭제하는 경우에도 해당 데이터를 학생정보 테이블에서 참조하고 있기 때문에 단순한 삭제 쿼리로는 데이터가 바로 삭제되지 않는다.
시퀀스, 트랜잭션
데이터베이스를 관리하는 데 필요하다.
시퀀스
시퀀스(Sequence)는 기본키 칼럼을 관리하기 위해 사용하는 데이터베이스 객체로, 보통 데이터를 추가할 때 순차적으로 증가하는 값을 자동으로 생성한다.
데이터베이스는 auto increment, auto_increment와 같은 속성을 칼럼에 추가하는 것으로 자동 증가 값을 사용할 수 있다. 대표적인 RDBMS인 오라클은 별도의 시퀀스 객체를 사용하는데, 이렇게 별도의 시퀀스 객체를 사용하는 방식은 편리함이 떨어지며 데이터베이스간의 호환성에도 문제가 발생한다.
예를들어 MySQL 또는 H2는 기본키에 auto increment를 지정하면 데이터 등록 시 기본키 칼럼을 제외한 나머지 데이터만 등록하면 자동으로 입력되는 방식이라 편리하다. 반면 오라클은 시퀀스 객체를 사용하는 쿼리를 따로 작성해야 하므로 쿼리에 호환이 안 되는 문제가 발생한다.
H2의 경우 IDENTITY라고 하는 자료형이 제공되어 auto_increment를 대체해 사용하는 것도 가능하다.
트랜잭션
프로그램에서 어떤 이벤트가 발생했을 때 하나의 테이블에만 데이터를 변경하는 경우보다 여러 테이블의 데이터를 차례로 변경해야 하는 경우가 더 많이 발생한다.
예를 들어 은행에서 계좌이체를 한다고 생각해본다. 동일 은행의 A계좌에서 B계좌로 이체한다고 했을 때 계좌는 테이블로 볼 수 있다. 이때 A계좌에서 100만 원을 차감한 후 B계좌에 100만 원을 추가하면 계좌이체가 완료된다. 이때 A계좌에서 차감 후 B계좌에 추가하는 과정에서 에러가 발생하면 A계좌에서 차감했던 금액은 다시 원래대로 되돌려야 한다.
이처럼 트랜잭션(Transaction)은 하나의 논리적 기능을 수행하기 위해 여러 작업을 묶어서 처리하는 것을 의미한다. 이러한 트랜잭션은 프로그램에서 단위 작업마다 성공 여부를 체크해야 진행할 수 있으나 이 경우 개발자가 로직을 잘못 설계할 가능성도 있기 때문에 데이터베이스 혹은 미들웨어 레벨에서 처리할 수 있어야 한다.
기본적으로 데이터베이스는 다음과 같이 트랜잭션 관리를 위한 명령을 제공한다.
- commit: 모든 데이터의 변화를 실제 적용한다.
- rollback: 문제 발생 시 현재까지의 변화를 원래대로 되돌린다.
A~C 순으로 진행되는 트랜잭션의 처리 과정을 요약하면 다음과 같다.
'Programming > Web' 카테고리의 다른 글
[Web] SQL(DDL, DML) (0) | 2022.10.25 |
---|---|
[Web] H2 데이터베이스 (0) | 2022.10.24 |
[Web] 데이터베이스(Database) (0) | 2022.10.24 |
[Web] 서블릿 컨트롤러 설계 (0) | 2022.10.23 |
[Web] MVC 패턴 (0) | 2022.10.22 |