영원한 것은 없다
이 글은 예전에 올린 장르실험 ‘심리 드라마’의 프리퀄입니다.
데이터베이스에서 데이터를 정의·조작·조회·제어하기 위한 언어.
그러나 여기에서는 '기억을 호출하는 언어'로서의 SQL을 장르로 다뤄 본다.
시간 속에 흩어진 기억을 정렬하고,
중복된 감정을 찾아내고,
사라진 대화를 다시 INSERT하는 언어.
원래는 컴퓨터가 데이터를 다루기 위해 만들어졌지만,
오늘은 그걸로 ‘하루’와 ‘그놈’의 기억을 호출한다.
둘이 남겨둔 흔적을 SELECT하고,
같이 웃었던 시간만 GROUP BY하고,
끝내 서로에게 남긴 말을 DELETE하지 못한 채로 남겨둔다.
=============================
=============================
CREATE TABLE memory (
id SERIAL PRIMARY KEY,
who TEXT NOT NULL,
what TEXT NOT NULL,
at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE feeling (
who TEXT NOT NULL,
target TEXT NOT NULL,
emotion TEXT CHECK (emotion IN ('LIKE', 'LOVE', 'DOUBT', 'FEAR', 'TIRED', 'LOSS')),
intensity INT CHECK (intensity BETWEEN 1 AND 10),
at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE dialogue (
id SERIAL PRIMARY KEY,
speaker TEXT,
words TEXT,
scene INT
);
=============================
=============================
INSERT INTO memory (who, what) VALUES
('하루', '만화책방에서 "천사전설"을 보고 있었다'),
('그놈', '병맛 만화를 읽고 웃는 그녀가 눈에 들어왔다');
INSERT INTO feeling (who, target, emotion, intensity) VALUES
('하루','그놈','LIKE',7),
('그놈','하루','LIKE',6);
INSERT INTO dialogue (speaker, words, scene) VALUES
('그놈','천사전설... 병맛인데 좋아하세요?',1),
('하루','네, 주인공이 무섭게 생겼지만 착하잖아요.',1),
('그놈','"끼요오오옷!" 할 땐 무섭지 않나요?',1),
('하루','ㅋㅋㅋ 그걸 직접 소리로 내다니...',1);
=============================
=============================
SELECT m1.who AS A, m1.what AS A_memory,
m2.who AS B, m2.what AS B_memory
FROM memory m1
JOIN memory m2 ON m1.id < m2.id
WHERE (m1.what ILIKE '%웃음%' OR m1.what ILIKE '%눈빛%' OR m1.what ILIKE '%설렘%')
AND (m2.what ILIKE '%웃음%' OR m2.what ILIKE '%눈빛%' OR m2.what ILIKE '%설렘%');
-- 결과: 서로의 감정이 연결됨
INSERT INTO feeling (who, target, emotion, intensity) VALUES
('하루','그놈','LOVE',9),
('그놈','하루','LOVE',8);
INSERT INTO dialogue (speaker, words, scene) VALUES
('하루','만화책 얘기 더 하지 않을래?',2),
('그놈','좋아, 그전에 밥부터 먹자. 버거왕 좋아해?',2),
('하루','어제도 먹었지만 오늘도 먹고 싶을게.',2),
('그놈','다음번엔 네가 좋아하는 거 먹자.',2);
=============================
=============================
-- CONNECTION STABLE
-- TRANSACTION RATE HIGH
-- NEW RECORDS BEING INSERTED NIGHTLY
-- NO TIMEOUT DETECTED
DO $$
BEGIN
LOOP
INSERT INTO dialogue (speaker, words, scene) VALUES
('그놈','밤새도록 통화를 하다 보면 하루는 가끔 졸다가 전화에 대고 잠꼬대를 한다',3),
('하루','네가 지난번에 오스트리아 살다 왔다고 했잖아!',3),
('그놈','어...ㅋㅋㅋ 그래ㅋㅋㅋ (갑자기 웬 오스트리아?)',3),
('하루','(수화기 든 채로 자는 중)',3);
EXIT WHEN feeling.emotion IN ('DOUBT','TIRED');
END LOOP;
END $$;
INSERT INTO memory (who, what) VALUES
('그놈','그녀의 숨소리가 끊기지 않던 그 밤들, 질리지 않았다.'),
('하루','통화 중 잠들면, 꿈에서도 그의 목소리가 이어졌다.');
-- LOOP TERMINATED BY SLEEP MODE
=============================
=============================
UPDATE feeling
SET emotion='DOUBT', intensity=5
WHERE who='하루' AND target='그놈' AND emotion='LOVE';
INSERT INTO dialogue (speaker, words, scene) VALUES
('하루','네 마음이 진짜인지 잘 모르겠어.',4),
('그놈','나도 너 좋아해, 근데 너무 자주 물어보는 거 아니야?',4);
=============================
=============================
BEGIN;
INSERT INTO memory (who, what) VALUES
('하루','불안이 점점 커져서 매일 연락을 기다렸다');
INSERT INTO feeling (who,target,emotion,intensity)
VALUES ('그놈','하루','TIRED',7);
SAVEPOINT before_breakup;
INSERT INTO dialogue (speaker, words, scene) VALUES
('하루','나 좋아하는 거 맞아?',5),
('그놈','그래, 근데 자꾸 확인하니까 지쳐.',5),
('하루','나는 네가 있어도 외로워.',5),
('그놈','(대답하지 않음)',5);
ROLLBACK TO before_breakup;
-- 그놈은 대답하지 않았지만, 하루는 이미 들었다.
COMMIT;
=============================
=============================
DELETE FROM feeling
WHERE who='하루' AND target='그놈' AND emotion IN ('LIKE','LOVE');
DELETE FROM feeling
WHERE who='그놈' AND target='하루' AND emotion IN ('LIKE','LOVE');
INSERT INTO feeling (who,target,emotion,intensity)
VALUES
('하루','그놈','LOSS',10),
('그놈','하루','TIRED',8);
INSERT INTO memory (who, what) VALUES
('하루','전화기 너머의 침묵이 무슨 의미인지 들린다'),
('그놈','하루는 왜 건져도 건져도 자꾸 잠길까');
-- POSITIVE DATA FROM feeling BEING DELETED PROGRESSIVELY
-- CONNECTION STILL ACTIVE, BUT STABILITY INDEX CRITICALLY LOW
=============================
=============================
UPDATE dialogue
SET words = NULL
WHERE speaker IN ('하루','그놈');
INSERT INTO memory (who, what) VALUES
('그놈','이제 전화해도 금방 끊으려 한다'),
('하루','대화를 이어가려 했지만 그는 자꾸 피했다'),
-- SESSION CLOSED
-- NO TRANSACTION DETECTED
=============================
=============================
CREATE VIEW last_resonance AS
SELECT
a.who AS person,
a.what AS memory,
b.who AS counterpart,
b.what AS echo
FROM memory a
JOIN memory b
ON a.id < b.id
WHERE
(a.what ILIKE '%설렘%' OR a.what ILIKE '%호기심%')
AND (b.what ILIKE '%설렘%' OR b.what ILIKE '%호기심%')
AND a.who='하루'
AND b.who='그놈';
-- 결과: 두 사람의 마지막 설렘이 교차된 순간 호출
-- 하루: "그와 얘기하면 시간 가는 줄 몰랐다"
-- 그놈: "그녀의 눈빛이 처음엔 낯설고, 점점 궁금했다"
SELECT * FROM last_resonance;
● INSERT = ‘만남’
— 처음으로 데이터가 기록되는 순간. 존재의 시작.
● JOIN = ‘공명’
— 서로의 기억이 연결되고, 관계가 생겨나는 지점.
● LOOP = ‘지속, 과열된 안정기’
— 데이터가 계속 쌓이고, 대화가 밤마다 반복되는 상태.
시스템은 정상 작동 중이지만, 이미 과부하의 조짐이 있다.
● UPDATE = ‘불안’
— 감정의 값이 변하기 시작한다. 처음의 설렘이 다른 상태로 overwrite됨.
● SAVEPOINT / ROLLBACK = ‘묵음, 미발화된 말’
— 말하려다 되돌린 문장, 끝내 실행되지 않은 트랜잭션.
● DELETE = ‘악화 혹은 단절의 시작’
— 관계 테이블에서 행이 제거된다. 논리적 연결이 끊김.
● NULL = ‘완전한 공백’
— 데이터 구조는 남아 있으나 내용은 사라진 상태. 대화 필드에 남은 침묵.
● VIEW = ‘기억의 잔향, 되돌리고 싶은 첫 장면’
— 시스템이 마지막으로 감지한 설렘을 다시 불러오는 쿼리.
데이터는 변하지 않지만, 호출만으로 감정이 잠시 복원된다.
- 영원한 것은 없다 -