Programming/SQL

데이터 딕셔너리, 도메인 제약조건 2021-08-17

최동훈1 2021. 8. 17. 16:40

우선 데이터 딕셔너리란 무엇이냐면, user, all, table 이 3가지 범주로 나누어서, 해당 주체가 가진 테이블 등을 뷰 형태로 볼 수 있는 정보이다. DBMS 내부에 자체적으로 포함되어 있는 정보라고 생각하면 된다.

사용자 서비스를 위해 DBMS가 자체적으로 가진 저장공간.

조금더 정확히 설명하자면, 사용자 계정을 통해 사용자가 DBMS에 접근해서 어떤 테이블을 가져오려고 할때, DBMS는 이런 사용자가 만든 테이블의 위치, 크기 등을 알고 있어야 한다. 이렇게 사용자 서비스를 위한 정보들을 저장하고 있는 것이 데이터 딕셔너리 이다. 또 내가 그 전 포스트에서도 강조하다시피 DBMS는 사용자계정 별로 테이블을 저장하기 때문에, 사용자 의 정보 저장이 중요하다.

또한 이 데이터 딕셔너리는 해당 사용자의 정보를 그대로 보여주는것이 아니라, 뷰 형식으로 보여준다. 즉 데이터 딕셔너리는 테이블 형태로 정보를 저장하는 것이 아닌, 뷰 집합형태로 로 모든 정보를 제공한다.

 여기서 뷰의 의미도 한번 되짚어 볼 수 있는데, 편리하게 분리된 테이블을 하나로 합쳐진채로 사용할수 있고, 코드의 복잡성도 줄일 수 있는 편리성의 기능도  있지만, 반대로 테이블 전체를 보여주지 않고, 특정한 칼럼만을 가리고 보여주는 등 사용자의 권한 밖에 있는 칼럼은 아예 못보게 만드는 역할을 한다. 보안적인 측면도 존재한다는 것이다.

또, 뷰 자체가 '읽기 전용' 으로 어떤 테이블을 보여주는 기능이기 때문에, 직접적으로 테이블의 어떤 값들에는 접근할수 없도록 만든다. 

이런 특성 때문에 딕셔너리는 뷰 형태로 사용자에게 정보를 전달한다.

 

예를 들면 이 사용자의 테이블은 어떤 것이 있는지, 이 테이블에는 어떤 칼럼이 있는지 등을 보고 싶을때 데이터 딕셔너리를 쓴다.

select * from user_tables;

이렇게 언더바 '_' 를 써서 뽑아내고 싶은 항목을 select 하면 된다. 그럼 사용자 계정에 존재하는 테이블이나 칼럼등을 뷰 형식으로 볼 수 있다.

 

그런데 현재는 잘 안쓰인다. 과거에 이런 SQL DEVELOPER 같은 윈도우용 툴이 개발되지 않고 콘솔 기반으로 SQL을 다룰때는 이런 데이터 딕셔너리로, 하나하나 일일이 찾았다면, 이젠 SQL DEVELOPER 같은 에디터에서 클릭 몇번으로 간단하게 사용자가 원하는 정보를 볼수 있어서 거의 사용되지 않는다.

 

그 다음 제약조건에 대해서 설명하겠다. 우리가 어떤 웹 서비스에 회원 가입을 하려 할때, 필수 입력 사항 과 선택사항으로 나누어 지는 것을 경험해 본 적이 있을 것이다. 바로 SQL의 제약조건으로 이러한 기능을 만들 수 있다.

 

SQL에서 제약조건은 크게 도메인->엔티티->릴레이션(테이블 간의 관계) 위 3가지 단계로 제약 조건을 거는데 우선 오늘 포스팅에서는 도메인 제약조건에 대해서 설명하겠다.

 

도메인 제약조건에는 세가지인데,

NOT NULL : null 이 올수 없음,  필수로 테이블을 만들때 입력해야 하는 항목.

DEFAULT : null 이 올 수 없지만, 굳이 입력을 하지 않아도, DBMS에서 기본값을 항상 넣어줌.

CHECK :  null 이 올 수 없고, 칼럼별로 설정한 표현이 맞지 않으면, 칼럼에 삽입을 입력 못함.

 

등이 있다. 어떻게 보면 전부 다. null이 올 수 없는 필수 입력사항 조건을 기본으로 깔고 간다고 보면 된다.

위 세가지 조건 모두 독립적인 조건 이무로 서로가 서로에게 영향을 주지 않는다. 내가 처음에는 다 not null 조건을 베이스로 가진다고 오해 한 거 같다. (아래에 해결과정 나옴.)

 

각 제약조건 을 테이블에 적용하려면 2가지 방법이 있는데,

1. DDL을 통해 처음 CREAT 문으로 테이블을 생성할 때, 또는 생성 뒤 ALTER 쿼리로 설정할 수 있고,

2.테이블 편집기를 이용해서 제약조건등을 설정 해 줄 수 있다. 

그런데 현업에서는 왠만하면 후자의 방법을 사용한다. 굳이 클릭 몇번으로 간단하게 만들 수 있는 내용을 복잡한 쿼리를 쓸 이유가 없기 때문이다. 다만, 많은 수의 테이블을 관리하는 사람이라면 쿼리로 하는 경우도 간혹 있다.

DB를 주구장창 관리하는 사람들, 사용자의 권한을 준다거나 하는 등. 배치파일을 만들어서 스크립트 를 직접 사용한단다.

이런 사람들 왜에는 DDL대신 간편한 편집기를 이용한다.

 

이렇게 NOT NULL 조건과 DEFAULT 조건을 편집기를 통하면 칼럼별로 간단하게 나타낼 수 있다.

또한 이렇게 제약조건이라는 텝을 클릭하고 + 표시를 클릭하여, 체크 제약조건도 추가해 줄 수 있다. 또한 관례적으로 체크 제약조건은 "테이블_칼럼_CK" 이런식으로 이름붙인다고 한다. 

그런데 의문점. 과연 NULL 이 들어가면 안될까?

아니다 ! null이 들어갈 수 있다. 내가 그 전까지는 기본으로 도메인 제약조건은 모두 NOT NULL 기능을 깔고 들어가는줄 알았는데 틀렸다... 그냥 NOT NULL, DEFAULT, CHECK 제약조건 모두 독립적인 변수이다. 서로가 서로에게 영향을 주지 않는다.

insert into member(id,name,phone) values('sk C&C', '최동훈', '010-9209-6429');

위 설정을 마친 뒤, 이렇게 새로운 레코드를 삽입해 보았다.

따로 REGDATE 칼럼에 대한 값을 넣어주지 않았는데도, 

넣을때 별다른 값을 주지 않으면,이렇게 DEFAULT 값으로 현재 날짜/시/분 /초 가 자동으로 입력됨을 볼수 있다.

 

공부시간 2시간.

순공시간 1시간 30분.