- crontab으로 주중 매일 11시 20분에 프로그램 실행을 위한 쉘 스크립트 자동 실행(공휴일 제외)
- 스크립트 참조 경로: ~/.bash_profile에 정의된 $LUNCH_PATH 하위의 lunch.sh
-
lnch_user; 유저 테이블
-
lnch_menu; 메뉴 종류 테이블
-
lnch_record; 일별 추천메뉴 기록 테이블
* DDL -- 유저 테이블 CREATE TABLE lnch_user ( SEQ_NO int not null auto_increment primary key comment '일련번호', ID varchar(10) unique, PW varchar(12) ); -- 메뉴 테이블 trigger 생성(id_no 기준으로 seq_no 부여) DELIMITER $$ CREATE TRIGGER set_seq_no BEFORE INSERT ON lnch_menu FOR EACH ROW SET NEW.seq_no = COALESCE((SELECT MAX(seq_no) FROM lnch_menu WHERE id_no = NEW.id_no), 0) + 1;$$ DELIMITER ; -- 메뉴 테이블 CREATE TABLE lnch_menu ( ID_NO int comment 'lnch_user.SEQ_NO', SEQ_NO int comment 'ID_NO에 따른 일련번호', CLASSIFICATION varchar(10) comment '한식/양식/중식/일식/기타', RESTAURANT_NM varchar(10) comment '음식점 이름', DISTANCE varchar(2) comment 'N: 근거리, F: 원거리' ); -- 기록 테이블 CREATE TABLE lnch_record ( YYYYMMDD date, RESTAURANT_NM varchar(10) );
- d: 거리(all/near, default: all)
- ex: 제외할 음식 종류나 음식점 이름(lnch_menu.CLASSIFICATION(음식 종류) 또는 lnch_menu.RESTAURANT_NM(음식점 이름)과 매핑, default: None)
- priority: 우선순위로 적용할 음식 종류나 음식점 이름(lnch_menu와의 매핑 정보는 ex와 동일)
-
사용자는 점심 메뉴 선정 전 우선순위 후보 등록을 할 수 있다.
-
메뉴 선택 옵션에 따라 데이터셋을 구성한다.
① 거리 옵션(d)에 따른 데이터셋 선택
: d 값이 all이면 lnch_menu.DISTANCE가 N(near), F(far)인 row 모두,
d 값이 near이면 N인 row만 읽어와 최초 데이터셋을 구성한다.② REDIS에 우선순위 후보에 대한 데이터가 존재하면 아래 기준에 따라 우선순위를 선정한다.
: 1) 최다 득표, 2) 득표 수 동률 시 등록 순서③ 데이터셋에 우선순위(priority) 및 제외(ex) 옵션 적용
* ex가 존재하는 경우 - ex 값이 음식 종류이면 ① 결과에서 제외할 음식 종류에 해당되는 음식점을 모두 제외시킨다. - ex 값이 음식점 이름이면 ① 결과에서 해당 음식점을 제외시킨다. * priority가 존재하는 경우 - prioirty가 음식 종류이면 ex 옵션 적용 결과에서 priority에 해당되는 음식점 리스트만 남긴다. - prioirty가 음식점 이름이면 해당 음식점으로 점심메뉴를 추천한다.
④ lnch_record 테이블에서 어제 먹은 메뉴를 불러와 데이터셋에서 삭제
-
2.에서 구성한 데이터셋에서 random 모듈을 사용해 메뉴를 선정한다.
-
webhook으로 구글채팅 '점심 메뉴 알림' 스페이스에 점심메뉴 추천 결과를 전달한다.
-
lnch_record 테이블에 오늘 날짜와 점심메뉴 추천 결과를 저장한다.
※ 거리와 제외 메뉴 옵션을 적용시키고 싶으면 아래와 같이 인자를 전달해 메뉴 추천 프로그램을 수동으로 실행시킨다.
python3 main.py -d [거리] -ex [제외할 음식 종류나 음식점]
python3 menu_registrant.py
python3 priority_registrant.py