MySQL에서 주간 이벤트 저장하기
MySQL에 주간 반복 이벤트를 효율적으로 저장하는 방법을 알아보겠습니다. 가장 일반적인 접근 방식은 요일별 필드를 포함하는 테이블을 생성하고, 각 요일에 해당 이벤트가 발생하는지 여부를 0 또는 1로 표시하는 것입니다.
1. 테이블 생성
먼저 요일별 필드와 이벤트 시작일·종료일을 포함하는 새로운 테이블을 생성합니다.
mysql> CREATE TABLE WeeklyEventDemo
-> (
-> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EventName VARCHAR(20),
-> Monday TINYINT(1),
-> Tuesday TINYINT(1),
-> Wednesday TINYINT(1),
-> Thursday TINYINT(1),
-> Friday TINYINT(1),
-> Saturday TINYINT(1),
-> Sunday TINYINT(1),
-> StartDate DATE,
-> EndDate DATE
-> );
Query OK, 0 rows affected (0.55 sec)각 요일 컬럼은 TINYINT(1) 타입으로 정의하여 불리언 값(0 = 해당 없음, 1 = 해당 요일에 이벤트 발생)을 저장합니다. StartDate와 EndDate는 이벤트가 유효한 기간을 나타냅니다.
2. 데이터 삽입
INSERT 명령어를 사용하여 테이블에 샘플 레코드를 삽입합니다.
mysql> INSERT INTO WeeklyEventDemo(EventName, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, StartDate, EndDate)
-> VALUES('Event-1', 0, 0, 0, 0, 1, 0, 0, '2018-03-21', '2019-03-08');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO WeeklyEventDemo(EventName, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, StartDate, EndDate)
-> VALUES('Event-2', 0, 0, 0, 0, 0, 1, 0, '2018-03-21', '2019-03-08');
Query OK, 1 row affected (0.16 sec)위 예시에서 Event-1은 금요일(Friday=1)에, Event-2는 토요일(Saturday=1)에 반복되는 이벤트입니다.
3. 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> SELECT * FROM WeeklyEventDemo;
실행 결과는 다음과 같습니다.
+----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ | ID | EventName | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday | StartDate | EndDate | +----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ | 1 | Event-1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2018-03-21 | 2019-03-08 | | 2 | Event-2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2018-03-21 | 2019-03-08 | +----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ 2 rows in set (0.00 sec)
4. 특정 요일의 이벤트 조회하기
이제 특정 요일에 발생하는 주간 이벤트를 조회하는 쿼리를 살펴보겠습니다. 예를 들어 금요일에 해당하는 이벤트만 가져오려면 WHERE 조건절에 Friday = 1을 지정하면 됩니다.
mysql> SELECT * FROM WeeklyEventDemo WHERE Friday = 1;
실행 결과:
+----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ | ID | EventName | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday | StartDate | EndDate | +----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ | 1 | Event-1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 2018-03-21 | 2019-03-08 | +----+-----------+--------+---------+-----------+----------+--------+----------+--------+------------+------------+ 1 row in set (0.00 sec)
추가 팁: 실무에서 고려할 사항
- 날짜 범위 조건 추가: 종료된 이벤트를 제외하려면
WHERE CURDATE() BETWEEN StartDate AND EndDate조건을 함께 사용하는 것이 좋습니다. - 여러 요일 조회: 월요일과 수요일처럼 복수 요일의 이벤트를 찾으려면
WHERE Monday = 1 OR Wednesday = 1형태로 작성할 수 있습니다. - 대안 설계: 요일별 컬럼 대신 이벤트 ID와 요일 번호(1~7)를 저장하는 별도의 매핑 테이블(정규화 방식)을 사용하면 확장성이 더 좋습니다.
이처럼 요일별 플래그 컬럼을 활용하면 주간 반복 이벤트를 직관적으로 저장하고, 간단한 WHERE 절로 원하는 요일의 이벤트를 빠르게 조회할 수 있습니다.