MySQL 가상 생성 컬럼과 내장 함수의 동작 원리
MySQL의 가상 생성 컬럼(Virtual Generated Column)은 다른 컬럼의 값을 기반으로 내장 함수를 사용해 자동으로 계산되는 컬럼입니다. 이 컬럼은 디스크에 물리적으로 저장되지 않으며, 쿼리가 실행되는 시점에 매번 즉석에서 값이 산출됩니다.
가상 생성 컬럼은 VIRTUAL 키워드를 명시적으로 선언하거나, 키워드를 생략한 채 정의할 수도 있습니다. MySQL에서는 별도의 표기가 없으면 기본적으로 VIRTUAL 타입으로 생성되기 때문입니다.
예제: CONCAT 함수로 FULL_NAME 컬럼 만들기
다음 예제에서는 employee_data라는 테이블을 생성하고, First_name과 Last_name을 결합하는 CONCAT 내장 함수를 활용해 FULL_NAME이라는 가상 생성 컬럼을 정의합니다.
mysql> Create table employee_data(ID INT AUTO_INCREMENT PRIMARY KEY,
First_name VARCHAR(50) NOT NULL, Last_name VARCHAR(50) NOT NULL,
FULL_NAME VARCHAR(90) GENERATED ALWAYS AS(CONCAT(First_name,'',Last_name)));
Query OK, 0 rows affected (0.55 sec)
테이블 구조를 확인해 보면 FULL_NAME 컬럼의 Extra 항목에 VIRTUAL GENERATED로 표시되어 있는 것을 알 수 있습니다. 이는 해당 컬럼이 저장되지 않고 가상으로 계산된다는 의미입니다.
mysql> DESCRIBE employee_data;
+------------+-------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| First_name | varchar(50) | NO | | NULL | |
| Last_name | varchar(50) | NO | | NULL | |
| FULL_NAME | varchar(90) | YES | | NULL | VIRTUAL GENERATED |
+------------+-------------+------+-----+---------+-------------------+
4 rows in set (0.00 sec)
데이터 삽입 및 결과 확인
이제 이름과 성만 입력하여 데이터를 삽입해 보겠습니다. FULL_NAME 컬럼에는 값을 직접 넣지 않아도 자동으로 계산됩니다.
mysql> INSERT INTO employee_data(first_name, Last_name) values('Yashpal','Sharma');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Krishan','Kumar');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, Last_name) values('Rakesh','Arora');
Query OK, 1 row affected (0.08 sec)전체 데이터를 조회하면 FULL_NAME 컬럼에 두 컬럼이 결합된 값이 자동으로 채워져 있는 것을 확인할 수 있습니다.
mysql> Select * from employee_data;
+----+------------+-----------+----------------+
| ID | First_name | Last_name | FULL_NAME |
+----+------------+-----------+----------------+
| 1 | Yashpal | Sharma | Yashpal Sharma |
| 2 | Krishan | Kumar | Krishan Kumar |
| 3 | Rakesh | Arora | Rakesh Arora |
+----+------------+-----------+----------------+
3 rows in set (0.00 sec)
정리
위 예제를 통해 확인할 수 있듯이, MySQL의 가상 생성 컬럼은 CONCAT 같은 내장 함수와 결합하여 원본 데이터를 중복 저장하지 않고도 파생 값을 손쉽게 관리할 수 있는 강력한 기능입니다. 저장 공간을 절약하면서도 조회 시점에 항상 최신 상태의 계산 결과를 제공하기 때문에, 이름 결합, 날짜 포맷 변환, 간단한 수식 처리 등 다양한 용도로 활용할 수 있습니다.