์์ฝ๋ด์ญ
์ ์๋ฆผํก
์ด ์์ ๋ ์ด ์๋ฆผํก์ ์ทจ์ํ๊ณ ๋ค์ ์์ฝ
์ ๊ฑธ ๋ ๊ธฐ์กด ์์ฝ์๊ฐ
์ผ๋ก ์์ฝํ์ง ์๊ณ ์์ฝ์ ๊ฑฐ๋ ์์
์ ์๊ฐ์ ์์ฝํ๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํฉ๋๋ค.10์
์ ์ฑํ
ํ๋๋ฅผ ์ ์กํ๋ค๊ฐ ์๋ชป ์ ์กํ ๊ฒ์ ์ธ์งํ๊ณ 10์ 01๋ถ
์ด ๋๋ํ๊ธฐ ์ 10์ 00๋ถ 59์ด
์ ์ฑํ
๋ฐฉ์ ์ฑํ
์ ์ฌ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์๋ ํด๋น ์๋ฆผํก์ 10์ 1๋ถ
์ ๊ฐ์๊ณต์
์ฌ์ ์ ๋ฌ ๋ ์์ ์ด์์ผ๋ ๋๋ํ๊ธฐ ์ ์ ์ฑํ
์ ์ ์กํจ์ผ๋ก์จ ๊ธฐ์กด์๋ฆผ์ด ์ทจ์
๋๊ณ 10์ 01๋ถ 59์ด
๋ค์ ์๋ฆผ์ด ๊ฐ๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฌ์ ๋ ์ฑํ
๋ฐฉ์ ๊ณ์ ์ฑํ
์ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ ์์ ๋ ์๊ฐ์ ์๋ฆผ์ด ๊ฐ์ง ๋ชปํ๋ ๋ฌธ์ ์
์ด ๋ฐ์ํฉ๋๋ค.๋ด์ฉ
์ด ๋ณด์ฌ์ง๊ฒ ํ๋ค.๊ฑด์
์ ๋ํด์ ํ์ํ๊ฒ ํ๋ค.ํน์ ์์ ์ ์ํ๋ ๊ธฐ๋ฅ ์ ์ํ
์์ ์ ์ด๋์ ๋ถ๋ถ์ด 1์ฐจ์ ์ผ๋ก ๊ฐ์ฅ ํ์ํ ๊ธฐ๋ฅ์
๋๋ค. CoolSms์ ๋์ ๋ด๊ณ ์ฌ์ฉํ๊ณ ์์๊ธฐ์ ๊ธฐ์กด์ ์๋ CoolSms
๋ฅผ ํ์ฉํ์ฌ ํน์ ์์ ์ ์ํ๋ ๊ธฐ๋ฅ
์ ์ฌ์ฉํ๋ ๊ฒ์ด 1์ฐจ ์ ํ์ง
๋ผ๊ณ ์๊ฐ๋์ด CoolSms
์ ์์ฝ ๊ด๋ จ API
๋ฅผ ์ด์ฉํ์ฌ ์์ ๊ธฐ๋ฅ
์ ๊ตฌํํ๊ณ ์ ํ์์ต๋๋ค.
CoolSms ๊ด๋ จ ์๋ฃ ์์ง ๊ฒฐ๊ณผ ์์ฝ ์๋ฆผ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ๊ณ ํด๋น ๊ธฐ๋ฅ์ ์ธ์ด๋ณ๋ก ์ฝ๋์ API๋ฅผ ์ ๊ณตํ๊ณ ์์์ต๋๋ค. ์๋ ์ฝ๋๊ฐ ์์ฝ๊ด๋ จ๋ ํ์ด์ฌ์ฝ๋ ์ ๋ฌธ์ด์๊ณ ํด๋น ์ฝ๋๋ง์ผ๋ก sms ๊ธฐ๋ฅ์ ๊ตญํ๋๊ฑฐ์ง, ์นด์นด์คํก ์๋ฆผ๋ ๊ฐ๋ฅํ๊ฑฐ์ง ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ํ์ํ์ต๋๋ค.
if __name__ == '__main__':
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
# ํฌ๋งํ์๋ ์์ฝ ๋ ์ง๋ฅผ ๋ฃ์ด์ฃผ์ธ์
# datetime(๋
, ์, ์ผ, ์, ๋ถ, ์ด)
scheduledDate = datetime.datetime(2022, 2, 8, 0, 0, 0).replace(
tzinfo=datetime.timezone(offset=utc_offset)).isoformat()
data = {
'scheduledDate': scheduledDate
}
# [INPUT_GROUP_ID] ์ ๊ทธ๋ฃน ์์ด๋๋ฅผ ๋ฃ์ด์ฃผ์ธ์
# ex) G4V20181005122748TESTTESTTESTTES
res = message.post('/messages/v4/groups/[INPUT_GROUP_ID]/schedule', data=data)
ํน์ ์์ ์ ์ํ๋ ๊ธฐ๋ฅ
์ ์ํํ ์ ์์๊ณ 1์ฐจ ์ ํ์ง
๋ก ๊ฐ๋ฐ์ ์งํํ๊ธฐ๋ก ํ์ต๋๋ค. ์ API์ ์ด๋ป๊ฒ data๋ฅผ ๋ด๋์ง ๊ถ๊ธํ์ค ์๋ ์์ผ์ค ๊ฒ ๊ฐ์์ ์๋ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํด๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ค์ง์ ์ผ๋ก ๋ด์ฉ
์ ๋ด์ ํน์ ์๊ฐ
์ ์๋ฆผ์ ๋ณด๋ด์ผ ํฉ๋๋ค. ์ด๋ ์ API data์๋ ์๋์ ํํ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๊ณ messages
๊ฐ key
๋ก []
ํํ์ ๊ฐ์ ๊ฐ๊ณ ์๋๋ฐ 'scheduledDate': scheduledDate
ํด๋น ํํ๋ฅผ data ๋ถ๋ฌธ์ ์ถ๊ฐํด์ ๋ฃ์ด ์ฃผ์๋ฉด ์ ํฌ๊ฐ 1์ฐจ์ ์ผ๋ก ๋ชฉํํ๋ ์ํ๋ ์๊ฐ์ ์๋
์ ๋ณด๋ด๋ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ต๋๋ค.data = {
"scheduledDate": scheduledDate
"messages": [
{
"to": params["phone"],
"from": settings.SENDER,
"kakaoOptions": {
"pfId": "KA01PF220419030622998QL1fNO8mOEN",
"templateId": "KA01TP22101204464856145zRAS7bWfv"
if settings.SERVER_ENVIROMENT == "prod"
else "KA01TP220721063111651MN94HDoefzd",
"variables": {
"#{name}": params["name"],
"#{bookingDate}": params["date"],
"#{bookingTime}": params["time"],
"#{carNum}": params["car_number"],
"#{repairshopName}": params["agent_name"],
"#{repairshopLocation}": params["agent_location"],
"#{code}": cipher,
},
},
},
]
}
๊ทธ๋ฃน ์์ด๋์ ๋ํ ๊ฐ๋
์ด ๋ช
ํํ์ง ์์ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ก ํ ๋์ ํธ๋์ญ์
์ผ๋ก์์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋์์ด๊ณ ์ด๋ฅผ ๋ฉ์ธ์ง ์ ์ก > ์ ์ก ๊ฒฐ๊ณผ
๋ก ๋ค์ด๊ฐ ์๋์ ๊ฐ์ด ํ์ธํด ๋ณผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ํธ๋์ญ์
์ด๋ ์ํํด์ผํ ๊ณผ์
์ด ๊ณผ์
1, ๊ณผ์
2, ๊ณผ์
3 .. ๊ณผ์
100 ๊ฐ ์๊ณ ์ด๋ฅผ ์ํํ๋๋ฐ ์์ด ๋ฌถ์
์ผ๋ก ์ํํ์ฌ ๋ฐ์ํ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค. ์๋ฅผ ๋ค์ด ์ฒฉ๋ณด์ํ์์ ์๋ฒ์ค์ ์นจ์
ํด ์ค์ํ ์๋ฃ๋ฅผ ๋ฐ์ผ๋ ค๊ณ ํ ๋ 99%๋ก์์ ์ ์ ๋๊ธฐ๋ฉด 99% ๋ฐ์๊ฒ ์๋๋ผ ์์ ์
๋๋ค. ๋ฌถ์์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ๋๋ฅผ ์ ํํด์ json ํํ์ response๋ฅผ ๋ณด๋ฉด _id
ํ๋์ G4V20221018095137DS0WQ7OZWQ0IPHL
๊ฐ ์ ํ์๋๋ฐ ํด๋น ๋ถ๋ฌธ์ด ๊ทธ๋ฃน์์ด๋
์ ํด๋นํ๋ ๋ถ๋ฌธ์ด๊ณ ์ฌ๋ฌ๊ฐ๋ฅผ ํด๋ฆญํด ๋ณด๋ฉด ๊ฐ๊ฐ๋ง๋ค ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์์ด๋
๋ก ๋ฉ์ธ์ง๊ฐ ๊ด๋ฆฌ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฆ ๋ฉ์ธ์ง๋ง๋ค ๊ณ ์ ํ ๊ทธ๋ฃน์์ด๋๊ฐ ๋ถ์ฌ๋๋ ๊ฒ์
๋๋ค.
{
"_id": "G4V20221018095137DS0WQ7OZWQ0IPHL",
"count": {
"total": 1,
"sentTotal": 1,
"sentFailed": 0,
"sentSuccess": 1,
"sentPending": 0,
"sentReplacement": 0,
"refund": 0,
"registeredFailed": 0,
"registeredSuccess": 1
},
"countForCharge": {
"sms": {},
"lms": {
"82": 1
},
"mms": {},
"ata": {},
"cta": {},
"cti": {},
"nsa": {},
"rcs_sms": {},
"rcs_lms": {},
"rcs_mms": {},
"rcs_tpl": {}
},
"balance": {
"requested": 0,
"replacement": 0,
"refund": 0,
"sum": 0
},
"point": {
"requested": 50,
"replacement": 0,
"refund": 0,
"sum": 50
},
"app": {
"profit": {
"sms": 0,
"lms": 0,
"mms": 0,
"ata": 0,
"cta": 0,
"cti": 0,
"nsa": 0,
"rcs_sms": 0,
"rcs_lms": 0,
"rcs_mms": 0,
"rcs_tpl": 0
},
"appId": null,
"version": null
},
"serviceMethod": "MT",
"sdkVersion": "sms-python 2.0.3",
"osPlatform": "14.38.93.171|Darwin|Python 3.9.4|sms/2",
"log": [
{
"createAt": "2022-10-18T00:51:37.200Z",
"message": "[::ffff:127.0.0.6] ๋ฉ์์ง ๊ทธ๋ฃน์ด ์์ฑ๋์์ต๋๋ค."
},
{
"createAt": "2022-10-18T00:51:37.265Z",
"message": "๊ตญ๊ฐ์ฝ๋(82)์ ์ฅ๋ฌธ๋ฌธ์(LMS) 1 ๊ฑด์ด ์ถ๊ฐ๋์์ต๋๋ค."
},
{
"createAt": "2022-10-18T00:51:37.422Z",
"message": "๋ฉ์์ง๋ฅผ ๋ฐ์กํ์ต๋๋ค.",
"oldBalance": 0,
"newBalance": 0,
"oldPoint": 74489,
"newPoint": 74439,
"totalPrice": 50
}
],
"status": "COMPLETE",
"dateSent": "2022-10-18T00:51:37.422Z",
"scheduledDate": null,
"dateCompleted": "2022-10-18T00:51:50.855Z",
"isRefunded": false,
"flagUpdated": false,
"prepaid": true,
"strict": false,
"masterAccountId": null,
"allowDuplicates": false,
"accountId": "21030220742796",
"apiVersion": "2",
"customFields": {
"coolsmsGroupId": "R2Gx2hrUE7Ppm84k"
},
"hint": null,
"groupId": "G4V20221018095137DS0WQ7OZWQ0IPHL",
"price": {
"82": {
"sms": 20,
"lms": 50,
"mms": 120,
"ata": 13,
"cta": 19,
"cti": 26,
"nsa": 13,
"rcs_lms": 40,
"rcs_mms": 75,
"rcs_sms": 15,
"rcs_tpl": 12
}
},
"dateCreated": "2022-10-18T00:51:37.202Z",
"dateUpdated": "2022-10-18T00:51:50.855Z"
}
import json
from src.lib import message
'''
์์ฝ ๋ฐ์ก ์ทจ์ ์์ , ์ด๋ฏธ ์์ฝ ๋ฐ์ก์ด ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค.
'''
if __name__ == '__main__':
# [INPUT_GROUP_ID] ์ ๊ทธ๋ฃน ์์ด๋๋ฅผ ๋ฃ์ด์ฃผ์ธ์
# ex) G4V20181005122748TESTTESTTESTTES
res = message.delete('/messages/v4/groups/[INPUT_GROUP_ID]/schedule', data=None)
print(json.dumps(json.loads(res.text), indent=2, ensure_ascii=False))
[INPUT_GROUP_ID]
์ ๊ทธ๋ฃน์์ด๋๋ฅผ ๋ฃ์ด์ ๊ธฐ์กด ์งํํ๋ ์์ฝ์ ์ทจ์ํ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ฝ์ ๊ฑธ๊ณ ์ทจ์ํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์ 1)API์์ฒญ์ ํตํด ๊ทธ๋ฃน์์ด๋๋ฅผ
๋ฐ๊ธ๋ฐ๊ณ ์ด๋ฅผ ๊ด๋ฆฌํ์ฌ ์์ฝ API
๋๋์์ฝ ์ทจ์ API
๋ฅผ ํธ์ถํด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.์ ํฌ๊ฐ ํ์๋ก ํ๋ ๊ธฐ๋ฅ, 1) ์ํ๋ ์๊ฐ์ ์์ฝ์ ํ๋ ๊ธฐ๋ฅ, 2) ๊ธฐ์กด ์์ฝ์ ์ทจ์ํ๋ ๊ธฐ๋ฅ 2๊ฐ์ง ๋ชจ๋ ์ถฉ์กฑํ๊ณ ์์๊ธฐ ๋๋ฌธ์ CoolSms๋ฅผ ํ์ฉํ 1์ฐจ ๊ฐ๋ฐ
์ ์๋ฃํ๊ฒ ๋์์ต๋๋ค.
์ํ๋ ๊ธฐ๋ฅ์ API๋ฅผ ์ ๊ณตํ๊ธฐ์ ๊ฐ๋ฐ์ ์งํํ ์ ์์์ผ๋ ํด๋น API๋ ๋๊ตฐ๊ฐ๊ฐ ์ฑํ
์ ์ณค์ ๋ ๋์ํ๋ API๋ก ์ฑํ
์ ์ก
์ด ๋ฐฉ์์
์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ด๋ API๊ฐ ์ฆ๊ฒ ํธ์ถ ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ง์ผ ์ฌ๋ฌ ์ฑํ
๋ฐฉ์์ ์ฌ๋ฌ ๊ฑด์ ์ฑํ
์ด ์์ฑ ๋ ๊ฒฝ์ฐ ์์ฝ ๊ด๋ จํด์ ๋ด๋นํ๋ ๊ธฐ๋ฅ
์ด ์ฌ๋ฌ๋ฒ ํธ์ถ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ณ ์ด๋ ๊ณ์ํด์ ๊ทธ๋ฃน์์ด๋๋ฅผ ๋ฐ๊ธ ๋ฐ์์ผ ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ณ CoolSmS ํํ์ด์ง ๋ฉ์ธ์ง ๋ก๊ทธ
์ ์ ์ ๋ฐ์ก๊ฑด๊ณผ ํผ์ฌ๋๋ฉด์ ํ์ธํ๋๋ฐ ์ด๋ ค์์ ์ด๋ํฉ๋๋ค.
path(
"chat/<int:parts_req_id>/create/<int:match_id>",
views.MatchChatCreateView.as_view(),
name="match_chat_create_view",
)
์๊ฐํ๊ณ ์ด๋ค ๋๊ตฌ๋ฅผ ์ ์ ํ๋ ์์ ์ ์ฝ์ง ์์์ต๋๋ค. ๊ฐ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ๋ณธ ๊ฒฝํ์ด ์๋ ์ํ์์ ์ฌ์ฉ ์ค๋ช ์๋ง์ ๋ณด๊ณ ๋ฌธ์ ์ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ํํ์ฌ ์ผ์ ์งํํด์ผ ๋๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค.
ํ์ด์ฌ์์ ์๊ฐ์ ์กฐ์ํ๋ time
, threading
๋ชจ๋์ ์ง์ํฉ๋๋ค. ํด๋น ๋ชจ๋์ ์ฌ์ฉ ํ ๊ฒฝ์ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ํ๋ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ง๋ง, ์ํ๋ ์๊ฐ๋์ ํน์ ๊ธฐ๋ฅ์ ํ์ฑํ์ํค๊ธฐ ์ํ ๋จ์๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค.
์ธ๋ถ ๋ชจ๋์ธ sched
๋ํ ๋ด์ฅ๋ชจ๋๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํฌ๊ฐ ์ํ๋ ์๊ฐ์ ํน์ ๊ธฐ๋ฅ์ ํ๋ฒ ํธ์ถํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋จ์๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค.
์ 2๊ฐ์ ์ฑ์ ํ์ด์ฌ ์ง์์์ ์ ๊ณตํ๋ ์ธ๋ถ์ฑ์
๋๋ค. ํด๋น ์ฑ๋ค์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ค ์ผ
์ ์ํํ๊ณ ์ถ์ ๋ ์์ ์ฑ์ ์ฌ์ฉํฉ๋๋ค. ์์์ ์ ์ํ ๋ชจ๋์ ํ์ฅํฉ ๋๋์ผ๋ก ๊ธฐ๋ฅ์ด ๋ํ
์ผํ๊ณ ๋ค์ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ํฌ๊ฐ ํด๊ฒฐํ๊ณ ์ถ์ ๋ถ๋ถ -:> ์ํ๋ ์๊ฐ
์ ์์ฝ์ ๊ฑธ๊ณ ์ทจ์
ํ๋ ๊ธฐ๋ฅ์ด ์๋์ง ํ์
ํด์ผ ํ์ต๋๋ค. ์ฑํ
์ ์น๋ ํ์ ์์ฒด๊ฐ ์ฃผ๊ธฐ์ ์ธ ์ฑ๊ฒฉ
์ ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ฌ ๋ฐฑ์๋ ์ชฝ์์ Celery์ django-apscheduler๊ฐ ์ค์น๋์ด ์์ต๋๋ค. ์ ์ ์ฒซ๋ฒ์งธ ์ ํ์ django-apscheduler
์์ต๋๋ค. ํ์ํ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํ๊ณ ์ถ์๊ณ ์กฐ๊ธ ๋ ํ์ฅํฉ ๋๋์ธ Celery์ ๋์
์ ์ดํ์ ์์๋ผ๊ณ ์๊ฐํ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋คํํ ์ํ๋ ์๊ฐ
์ ์์ฝ์ ๊ฑธ๊ณ ์ทจ์
ํ๋ ๊ธฐ๋ฅ์ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค.
triggers
์ธ์ ํน์ ํ ๊ธฐ๋ฅ์ ์ํํ ์ง๋ฅผ ์๋ ค์ฃผ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ดฌ์์ฅ์์ ์ฌ๋ ์ดํธ์ ๊ฐ์ ์ญํ ์ด๋ค.
job stores
์ธ์ ํน์ ํ ๊ธฐ๋ฅ์ ํ๊ธฐ๋ก ํ๋์ง์ ๋ํ ์ฌ๋ฌ Jobs๋ฅผ ์ ์ฅํ๊ณ ์๋ ๊ณต๊ฐ์
๋๋ค. ๊ธฐ๋ณธ ์ ์ฅ๊ณต๊ฐ์ ์ฌ์ฉ ํ ๊ฒฝ์ฐ memory๋ก ๊ด๋ฆฌ๋๊ณ scheduler๋ ํด๋น ๊ณต๊ฐ์ ์๋ก ๊ณต์ ํ์ง ์๊ณ ๋
๋ฆฝ์ ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค.
executors
job store์ ์ ์ฅ๋ Job ๋ค์ ์ฐ๋ ๋ ๋๋ ํ๋ก์ธ์ค ํ์ ๋์ ธ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์ฆ ์ ์ฅ๊ณต๊ฐ์ ์์ธ ์ผ๊ฐ๋ค์ด ์คํ๋์ด์ผ ํ ์์ ์ด ์์ ๋ ๋๊ธฐ์กฐ์ ์๋ ์ผ๊พผ๋ค์๊ฒ ์ผ์ ์ ๋ฌ ํด์ฃผ๋ ๊ฒ์
๋๋ค.
schedulers
์์ ์์
๋ค, Job์ ๋ํ ํธ๋ฆฌ๊ฑฐ ์ง์ , Job์ ์ ์ฅ, Job์ ์คํ๋ฑ์ ๊ด์ฅํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ์ ์ ๊ฐ์ ์ฑ๊ฐ๋ฐ์๋ schedulers๋ฅผ ํตํด ์์ ์ฃผ์ฒด๋ค๊ณผ ์ํตํ๋ ๊ฒ์
๋๋ค.
์์ 4๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ ์ ํ๋ ์์ ์ด ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ฝ๋๊ฐ ์์ด ์์ ์ฝ๋๋ฅผ ํตํด ํด๋น ๊ฐ์ฒด๋ค์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋๊ฐ์ต๋๋ค.
์ค์ผ์ค๋ฌ์ ๊ฒฝ์ฐ django-apscheduler
๋ ์ฌ๋ฌ๊ฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ํฌ๋ ์ฌ๋ฌ๊ฐ์ ์ฑํ
๋ฐฉ์ด ์์ฑ ๋ ๊ฒฝ์ฐ ์ฑํ
๋ฐฉ ๊ฐ๊ฐ์ ๋ด๋นํ๋ ๋
๋ฆฝ์ ์ธ scheduler
๊ฐ ํ์ํ๋ฏ๋ก BackgroundScheduler
๋ฅผ ์ ํํ์์ต๋๋ค. ๋ณดํต ๋ง์ด ์ ํํฉ๋๋ค.
์คํ ํ ์ผ
์ ์ ์ฅ ํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํด์ผ ํ๋๋ฐ ์ค๊ณ ํน์ฑ์ ์์ฝ์ด ๊ฑธ๋ ค์๋์ง
๊ฑธ๋ ค์์ง ์์์ง
๊ฐ ๋ถ๊ธฐ์ ์ด ๋์ด ๋ก์ง์ ์ํํ๋ฏ๋ก Memory
์ ์ ์ฅ๋์ด ์๋ job
ํ๋๋ง ํ์ํ๋ฏ๋ก ์ด ๋ํ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํฉ๋๋ค.
ํธ๋ฆฌ๊ฑฐ์ ์ข
๋ฅ์๋ 3๊ฐ์ง ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋๋ฐ date
ํธ๋ฆฌ๊ฑฐ๊ฐ ์ ํฌ์ ๋ชฉ์ ์ธ ํน์ ์์ ์ ์ํ๋ ์ก์คํ
์ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๊ณ ์์์ต๋๋ค. ๐คฉ
๐ก ์ด๋ก์ ์์ผ๋ก์ ๊ฐ๋ฐ ๋ฐฉํฅ์ ํฌ๋ง์ด ์๊ฒผ์ต๋๋ค.
์ค๊ณ ํ ์ ํํ ๋๊ตฌ๋ฅผ ํตํด์ ๊ฐ๋ฐ์ ์งํํ์ ๋ ๋ง์ฃผํ ๋ฌธ์ ์ ๋ค์ ๋์ดํ๊ณ ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์์ง ๊ทธ ๊ณผ์ ์ ๋ํด์ ๋๋๊ณ ์ํฉ๋๋ค.
์ค์ผ์ค์ ๋๋ฆฌ๊ธฐ ์ํด์ ์๋์ ์์๋ฅผ ๋ฐ๋ผ์ ์ก์ ์คํํฉ๋๋ค. ์ค์ผ์ค์ ๋๋ฆฐ ์ดํ์๋ ์ค์ ๊ฐ์ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ค์ผ์ค๋ฌ ์์ฑ
---> ์คํ ํ ์ก ์ถ๊ฐ
---> ์ก ์คํ
scheduler = BackgroundScheduler()
scheduler.add_job(ํจ์, ํธ๋ฆฌ๊ฑฐ ์ ํ, ํธ๋ฆฌ๊ฑฐ ๊ฐ, ํจ์์ธ์)
scheduler.start()
ํ์ฌ ํธ์ถ๋๊ณ ์๋ APIํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. API๋ฅผ ํธ์ถํ ๋๋ง๋ค MatchChatCreateView
๋ผ๋ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋งค๋ฒ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ์ ์ฑํ
๋ฐฉ์์ ์ฑํ
์ด ์ฌ๋ผ์ค๊ฒ ๋ ๊ฒฝ์ฐ ํด๋น ํด๋์ค๋ก๋ถํฐ ์๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ฒ ๋ฉ๋๋ค. ์์ ์๋ ๋ก์ง์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ์ฑํ
๋ฐฉ๋ง๋ค ํ๋์ ์ค์ผ์ค๋ฌ ์ธ์คํด์ค๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
๋ง์ฝ ์ด์ ์ ์ค์ผ์ค๋ฌ๋ฅผ ๋ง๋ ๊ฒ์ ๊ธฐ์ตํ์ง ๋ชปํ๋ค๋ฉด ์ฌ๋ฌ๊ฐ์ ์ฑํ ๋ฐฉ์์ ์ฑํ ์ด ์ฌ๋ผ์ฌ ๋๋ง๋ค ์๋ก ์ธ์คํด์ค๋ฅผ ํธ์ถํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํด๋น API๊ฐ ํธ์ถ๋ ๋ ์ฑํ ๋ฐฉ๋ง๋ค ๊ณ ์ ์ ์ค์ผ์ค๋ฌ ์ธ์คํด์ค๋ฅผ ๋งค์นญํด์ฃผ๊ธฐ ์ํด์ ์ฑํ ๋ฐฉ์ ๊ณ ์ ์์ด๋๋ฅผ ์์ฑ์ ๋ณ์๋ก ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ์ฌ ์๋ฌด๋ฆฌ ๋ง์ API๊ฐ ํธ์ถ๋๋๋ผ๋ ์ฑํ ๋ฐฉ ๋ณ๋ก ์ค์ง ํ๋์ ์ค์ผ์ค๋ฌ๋ง ์์ฑํ๊ฒ ์กฐ์ ํด์ฃผ์ด์ผ ํ๋ ์์ ์ด ํ์ํ์ต๋๋ค.
์ด์ ํด๋์ค ๋ณ์๋ฅผ ๋๊ณ key: value
ํํ๋ก ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํํ์ฌ key: ์ฑํ
๋ฐฉ ์์ด๋
๋ก value: scheduler_instance
๋ก ์ ์ฅํ์ฌ ํ์ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ๋งค์นญ์ ํตํด ๋ณธ๋์ ์ค์ผ์ค๋ฌ๋ฅผ ์ฐพ์ ๊ฐ ์ ์๋๋ก ํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
APScheduler docs
An elegant way to run periodic tasks in python
RLock
Python with statement