도메인 타입

도메인 타입 (Domain Types)

'정수'라는 타입은 있는데, '양수만 허용하는 정수' 같은 타입은 따로 없어요. 그런데 우리 애플리케이션에 그런 제약이 자주 필요하다면 어떨까요? 매번 CHECK 제약을 붙이는 대신, PostgreSQL의 도메인(Domain) 을 쓰면 제약이 담긴 '나만의 타입'을 만들어서 필요한 곳마다 재사용할 수 있어요.

출처: 공식문서

도메인은 타입 위에 제약을 얹은 타입이에요

도메인은 어떤 기반 타입(underlying type)을 바탕으로 정의하는 사용자 정의 타입이에요. 선택적으로 제약을 붙여서, 기반 타입이 허용하는 값 중 일부만 받아들이도록 좁힐 수 있죠. 그 외에는 기반 타입과 똑같이 동작해요. 기반 타입에 적용할 수 있는 연산자나 함수는 도메인 타입에도 그대로 적용됩니다. 기반 타입은 PostgreSQL 내장 타입이나 사용자 정의 기본 타입, enum, 배열, 복합, 범위 타입, 심지어 다른 도메인까지 뭐든 될 수 있어요.

양수만 받는 도메인을 만들어 쓰는 예시를 볼게요.

CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE mytable (id posint);
INSERT INTO mytable VALUES(1);   -- works
INSERT INTO mytable VALUES(-1);  -- fails

도메인 값에 기반 타입의 연산자나 함수를 적용하면, 값은 자동으로 기반 타입으로 내려갑니다(down-cast). 예를 들어 mytable.id - 1의 결과는 posint가 아니라 integer 타입으로 취급돼요. 다시 도메인 타입으로 되돌리고 싶다면 (mytable.id - 1)::posint처럼 명시적으로 캐스팅하면 되고, 이때 도메인의 제약이 다시 검사됩니다. 만약 그 표현식이 id 값 1에 적용되었다면 이 경우에는 오류가 나겠죠. 반대로 기반 타입의 값을 도메인 타입의 필드나 변수에 넣을 때는 별도 캐스팅 없이도 되지만, 그때도 도메인의 제약 검사는 이루어져요.

도메인을 만드는 문법의 상세한 내용은 CREATE DOMAIN 명령 문서를 참고하면 돼요.

더 알아보기 (Learn more)