Web UI 를 Database 그대로 표현하려다 보면 단순한 텍스트 필드는 간단한 DDL로도 쉽게 구현가능하지만 라디오버튼이나 체크박스의 데이터들을 어떻게 표현할까 고민이 많이 된다. 흔히들 간단히 DB에는 INT 형을 만들고 이를 UI에서 매핑하는 방식들을 쓰지만 매우 수작업에 의존하고 시스템이 복잡해질 경우 자동화 또는 lowcode 적용에 분명 어려움이 생긴다. 그래서 다음과 같이 ENUM 과 ARRAY를 활용하는 방법을 고민해 본다.
CREATE TYPE gender AS ENUM ('middle', 'male', 'female');
CREATE TABLE UserProfile (
user_id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
gender gender NOT NULL
);
COMMENT ON COLUMN UserProfile.gender IS 'type=enum;0=middle;1=male;2=female';
INSERT INTO public.userprofile (user_id, "name", gender)
VALUES(nextval('userprofile_user_id_seq'::regclass), 'blackpink', 'female');
SELECT user_id, name, gender,
CASE
WHEN gender = 'middle' THEN 0
WHEN gender = 'male' THEN 1
WHEN gender = 'female' THEN 2
END as gender_int
FROM UserProfile;
SELECT user_id, name, gender,
array_position(enum_range(NULL::gender), gender) - 1 AS gender_int
FROM UserProfile;
UPDATE public.userprofile
SET "name"='blackpink2', gender='male'
WHERE user_id=3;
CREATE TYPE noti_method AS ENUM ('SMS', 'Email', 'kakao', '우편');
CREATE TABLE UserProfile2 (
user_id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
noti_methods noti_method[] DEFAULT ARRAY[]::noti_method[] -- 기본값을 빈 배열로 설정
);
COMMENT ON COLUMN UserProfile2.noti_methods IS 'type=array;SMS=SMS notification;Email=Email notification;kakao=KakaoTalk notification;우편=Postal mail notification';
INSERT INTO UserProfile2 (name, noti_methods)
VALUES ('John Doe', ARRAY['SMS', 'Email']::noti_method[]);
SELECT * FROM UserProfile2 WHERE 'Email' = ANY(noti_methods); -- Email을 알림 방법으로 선택한 사용자 조회
UPDATE UserProfile2
SET noti_methods = ARRAY['SMS', 'kakao', '우편']::noti_method[]
WHERE user_id = 1;
lowcode 개발을 하지 않으면 빠르게 변하는 개발 추이를 따라 잡을 수 없는 시대가 돼 버렸다. 매너리즘에서 벗어나 뭐든 자동화할 수 있고 논리적인 개발과정을 스스로 구축해두어야 한다. 노가다 탈피는 이제 필수! 그래서 COMMENT에도 어떻게 자동화하면 좋을 지 힌트를 남겨두었다.