์ฒซ์งธ ๋ TIL์ ์ ์ ํ 1์ฃผ์ฐจ ํ๋ก์ ํธ ๋ง๋ฌด๋ฆฌ์ ์น๊ฐ๋ฐ ๊ฐ์ ์๊ฐ์ ์น์ฌ ๊ฒฐ๊ตญ WIL๋ก ๋ฐ๋ก ๊ฑด๋์ค๊ฒ ๋์๋ค..
ํ๋ก์ ํธ ์ ์ถ์ผ์ ํ์ด์ 2์ฐจ ์ ์ข
ํ์ ์ฆ์ผ๋ก ์จ์ข
์ผ ๋ํต์ ์๋ฌ๋ ธ์ง๋ง ํ์๋ค์ ๋์์ผ๋ก ๋ฌด์ฌํ ์ ์ถํ ์ ์์๋ค..
์๋ก ์ด ํ๊ณ๋ก ๊ธธ์ด์ก๋๋ฐ.. ์ฐ์ 1์ฃผ์ฐจ ๋์ ๋ด๊ฐ ๋ฐฐ์ ๋ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค!
์์ด๋ณด๋ฐ์ ๊ณผ์ ๋ค์ ๋น ๋ฅด๊ฒ ํ์ด๋ณด๋ ์๊ฐ์ด์๋ค. ๊ธฐ๋ณธ ํ์ ์ง๋ ๊ฒ์์ ์์ํด, ์ฌ์ง ์ ๋ก๋ ๊ฐ์ ๋ํ ์ผ์ ์ถ๊ฐํ๊ณ ์๋ฒ์ ๋ฐฐํฌํ๋ ๊ณผ์ ๊น์ง ํ๋ก์ ํธ๋ฅผ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ค๋น๋ฅผ ํ๋ ๊ณผ์ ์ด์๋ ๊ฒ ๊ฐ๋ค. ํนํ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํํ์ ์ ๊ฒฝ์ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ๋๊ปด์ก๋ค.
1์ฃผ์ฐจ ๋ฏธ๋ ํ๋ก์ ํธ์ ์ฃผ์ ํฌ์ธํธ ์ค ํ๋์ธ Jinja2๋ฅผ ์ฒ์ ๋ง์ฃผํ๋ ์๊ฐ์ด์๋ค. ajax๋ฅผ ์ด์ฉํด ๊ฐ์ ๋ถ๋ฌ์ค๋ ๊ฒ์ ์ต์ํ๋์ง๋ผ ์ด๋ฐ์๋ ์ดํดํ๊ธฐ ์ฝ์ง ์์๋ค. ๊ทธ๋ฌ๋ ๊ฐ์๋ฅผ ๋ฐ๋ผ ์ง์ ์ฝ๋ฉ์ ํด๋ณด๋ฉฐ ์นํ์ด์ง์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ajax์ Jinja2๊ฐ ์ ์ ํ ์ฐ์ผ ์ ์๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๊ณ , ๋น๋ก์ ํ๋ก์ ํธ์ ์ง์ ์ ์ฉํ ์ ์์๋ค.
๋์์ง๊ณ ๋ ๋ค ๋ฐ๋ ์ผ์ด ์๋ ํ์ด์ง ๊ฐ์ ๊ฒฝ์ฐ์๋ html์ ์์ฑํด์ ๋ณด๋ด์ฃผ๋ ์๋ฒ์ฌ์ด๋๋ ๋๋ง(SSR) ๋ฐฉ์์ Jinja2 ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
์ ๋ ๋์์ ์ด์ฉํด ์คํฌ๋ํ์ ์ตํ๋ณด๋ ์๊ฐ์ด์๋ค. ๋ค์ด๋ฒ ์ง๋ API๋ฅผ ์ง์ ์จ๋ณด๋ฉด์ API์ ์ ๋ณด๋ฅผ ๋์ด์ค๋ ๋ฐฉ๋ฒ๋ ์ค์ตํด๋ณผ ์ ์์๋ค. ์ฌ์ค ์ฐ๋ฆฌ ์กฐ์ ํ๋ก์ ํธ์์๋ ์ฐ์ด์ง ์๋ ๊ธฐ๋ฅ์ด๋ผ ๊ผผ๊ผผํ๊ฒ ์ดํด๋ณด์ง ๋ชปํ๋ค. ์ถ์ ์ฐํด๋ฅผ ์ด์ฉํด ๋ค์ ํ ๋ฒ ๋ณต์ตํ ๊ฒ์ด๋ค.
๋ด๊ฐ ์ด๋ฒ ํ ํ๋ก์ ํธ์์ ๋งก์ ๋ถ๋ถ์ธ ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ ์์ ๋ฐฐ์ธ ์ ์์๋ ๊ฐ์์๋ค. Jinja2์ ํจ๊ป 1์ฃผ์ฐจ ํ๋ก์ ํธ์ ์ฃผ์ ํฌ์ธํธ์๋ JWT๋ฅผ ๋ค๋ฃจ๋ ๊ฐ์์ด๊ธฐ๋ ํ๊ธฐ์ ๋ ์ด์ฌํ ๊ณต๋ถํ๋ค. ๋ณด์์ ์ทจ์ฝํ์ง ์์ผ๋ฉด์ ๊ฐํธํ๊ณ ๋น ๋ฅธ ์ธ์ฆ ๋๋ถ์ ์๋ฒ์ ๋ถํ๋ ์ค์ผ ์ ์๋ค๋ ๊ฒ์ด JWT์ ํฐ ์ฅ์ ์ผ๋ก ๋๊ปด์ก๋ค.
ํ์ ๋ก๊ทธ์ธ ์์คํ ์ ๋ค๋ฃฐ ๋, ๊ธฐ์กด์ ์๋ฒ ์ฌ์ด๋ ์ธ์ ์ ๋ฐฉ์์ ์ด์ฉํ๋ค๋ฉด ๋ก๊ทธ์ธ ์ธ์ ์ ๋ณด๋ฅผ ์๋ฒ๋ DB์ ์ ์ฅํ๋ค. ๋จ์ผ ์๋ฒ์ด๊ฑฐ๋ ๋์ ์ ์์ ์๊ฐ ์ ์ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋์ ์ ์์ ์๊ฐ ๋์ด๋๊ณ ์๋ฒ์ ๊ฐฏ์๊ฐ ๋์ด๋๋ค๋ฉด DB๊ฐ ๋ถ๋ดํ๋ ํ์ ๋ฐ์ดํฐ์ ์๋ ๋์ด๋ ๋ฟ๋๋ฌ, ๋ก๊ทธ์ธ ์ดํ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋์ง ์์ ์๋ฒ๋ก ์ ์ํ ์ ์ฌ์ ์์ ํด์ผํ๋ ๋ถํธํจ์ ๊ฐ์ํด์ผํ๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋งค ์์ฒญ ๋ง๋ค ์์ด๋๋ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์ ๋ณด๋ค์ด ์ค๊ฐ๋ ๊ฒ์ ๋ณด์์ ์ธ ์ธก๋ฉด์์๋ ์ทจ์ฝํ๋ค.
JWT(JSON Web Token)์ header . payload . signature ์ธ ๋ถ๋ถ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ์ฐ์ payload ์์๋ ์ด ํ ํฐ์ ๋ฐ๊ธ ์ ๋ณด, ์ ํจ ๊ธฐ๊ฐ, ์ฌ์ฉ์์ ์๋น์ค ์ด์ฉ ๊ถํ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ JSON ํ์ผ ํ์์ผ๋ก base64 ์ธ์ฝ๋ฉ๋์ด ๋ด๊ฒจ์๋ค. payload ๋ถ๋ถ๋ง ๋ณด์์ ๋๋ ๋๊ตฌ๋ ๋์ฝ๋ฉ๊ณผ ์ธ์ฝ๋ฉ ๊ณผ์ ์ ํตํด ๊ฐ์ ์กฐ์ํ ์ ์์ด๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง ๊ทธ๋ ์ง ์๋ค. ๋๋จธ์ง ๋ ๋ถ๋ถ์ด ๋จ์์๊ธฐ ๋๋ฌธ์ด๋ค. header ๋ถ๋ถ์ ์ดํด๋ณด๋ฉด, ์ฌ๊ธฐ์ JWT๋ฅผ ์ง์ ํ๋ ๊ณ ์ ๊ฐ์ธ type๊ณผ signature ๊ฐ์ ๋ง๋๋๋ฐ์ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ ์ง์ ๊ฐ์ด ๋ค์ด์๋๋ฐ, ์ธ๋ฒ์งธ ๋ถ๋ถ์ธ signature๊ฐ์ ๋ฐ๋ก ์ด header์ ์๊ณ ๋ฆฌ์ฆ ์ง์ ๊ฐ์ ๋ฐํ์ผ๋ก payload ๊ฐ๊ณผ ์๋ฒ๋ง์ด ์๊ณ ์๋ SECRET KEY ๋ฐ์ดํฐ๊ฐ ์ํธํ๋์ด ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์์์ ์ฌ์ฉ์๊ฐ payload์ ๊ฐ์ด ์กฐ์๋ ํ ํฐ์ผ๋ก ์๋น์ค์ ์ ๊ทผ์ ์๋ํ ์ง๋ผ๋ ๊ณ ์ ์ SECRET KEY ๊ฐ์ ๋์ ํด ๋์จ signature ๊ฐ์ด ๋ค๋ฅด๋ค๋ฉด ์๋ฒ๋ ์กฐ์๋ ํ ํฐ์ ์ ๊ทผ์ ๊ฑฐ๋ถํ ์ ์๋ค.
์ฌ๊ธฐ์ JWT์ ์ฅ์ ์ด ๋ณด์ด๊ธฐ ์์ํ๋ค. ์์ ๋ถํฐ ์ฐ์ด๋ ์ธ์ ์ด๋ ์ธ๊ฐ(authorization) ํ ํฐ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด๋ฅผ DB์ ์ ์ฅํด๋๊ณ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ฐ์ ๋ ๋ง๋ค DB๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ค. ๊ทธ๋ฌ๋ JWT๋ ๊ฐ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ cookie์ ํํ๋ก ์ ์ฅ๋๊ณ ์ด๋ฅผ ์๋ฒ๋ก ๋ณด๋ธ๋ค. ์๋ฒ๋ ๋ฐ์ ํ ํฐ์ ์ ๋ณด๋ฅผ ๊ณ ์ SECRET KEY ๊ฐ์ ์ด์ฉํด ๊ฒ์ฆํ๊ณ , signature ๊ฐ์ด ๋ณํ๋์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ฒ ๋ง์ผ๋ก ์ธ์ฆ ๊ณผ์ ์ ์ํํ ์๊ฐ ์๋ค. DB๋ฅผ ๊ฑฐ์น๋ ์๊ณ ์์ด ์ธ์ฆ๊ณผ ๊ถํํ์ธ ๊ณผ์ ์ ์ํํ ์ ์๋ค. ๋ฌผ๋ก ์ธ์ ๊ฐ๋ ๋์ ์์ค์ ์ํธํ ํด๋ ๋ฒ์ ์ด์ฉํ์ฌ JWT์ ๊ณ ์ ํค๊ฐ์ ์์๋ผ ์๋ ์๋ค. ๊ทธ๋ฌ๋ ์๋ฌด๋ฆฌ ๊ณ ๋ํ๋ ์ํธ ํด๋ ๊ธฐ์ ์ผ์ง๋ผ๋ ์ ๋์ ์ธ ์๊ฐ์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ์ด๋ payload ๊ฐ ์์ ํ ํฐ ์ ํจ ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์ ํ์ฌ ํด๋ ๋๊ธฐ ์ ์ ํ ํฐ์ด ๋ฌดํจํ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๋ค.
๊ฐ์๋ฅผ ๋ฐํ์ผ๋ก ๊ตฌํํ์๋๋ฐ, ๊ธฐ์กด ๊ฐ์์์ ๋ง๋ค์๋ SWEETER ์๋น์ค๋ ํ์๊ฐ์ ์ ๋ณด๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ์ ๊ทธ์ณค๋ ๋ฐ๋ฉด, ์ฐ๋ฆฌ์ SCRUM ์๋น์ค์์๋ ๋๋ค์๊ณผ ์ด๋ฉ์ผ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ์๊ฐ๊ธ์ด ์ถ๊ฐ ๋๋ค. ๋๋ค์ ์ ๋ ฅ์ฐฝ์์๋ ์์ด๋์ ๊ฐ์ด ์ค๋ณตํ์ธ์ ํ์๋ก ํ๊ณ , ํ๊ธ๋ก๋ง ๋๋ค์์ ๋ง๋ค ์ ์๊ฒ ํ๊ธฐ ์ํด ํ๊ธ์ธ์ง ํ๋จํ๋ ์ ๊ท์๋ ๋ง๋ค์ด์ผ ํ๋ค. ์ด๋ฉ์ผ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฉ์ผ ํ์์ด ๋ง๋์ง๋ฅผ ํ๋จํ๋ ์ ๊ท์์ ๋ง๋ค์ด์ผํ๋ค. 1์ฃผ์ฐจ ๊ฐ์์์ ๊ฐ์กฐํ์ จ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ํํ์ ์ฃผ์ํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฌด๋ฆฌ์์ด ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์๋ค.
@app.route('/sign_in', methods=['POST'])
def sign_in():
# ๋ก๊ทธ์ธ
# ํด๋ผ์ด์ธํธ์์ ๋ฐ์์จ ๊ฐ์ ๊ฐ ๋ณ์์ ๋ด๊ธฐ
username_receive = request.form['username_give']
password_receive = request.form['password_give']
# ํจ์ค์๋๋ ํด์ฌํจ์๋ฅผ ์ด์ฉํ์ฌ ์ํธํ ํ๊ณ ๊ทธ ๊ฐ์ pw_hash ๋ณ์์ ๋ด๋๋ค
pw_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
# DB์ ํ์ ์ ๋ณด์ ๋ง๋์ง ํ์ธ
result = db.users.find_one({'username': username_receive, 'password': pw_hash})
if check_today(username_receive):
status = 'posted' # ๋น์ผ ๊ฐ์ค ์ด๋ฏธ ์์ฑํ์ ์์๋ ๋ฉ์ธ ํ์ด์ง
else:
status = 'not_yet' # ์๋๋ผ๋ฉด ์์ฑ ํ์ด์ง๋ก
if result is not None:
payload = {
'id': username_receive,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 3) # ๋ก๊ทธ์ธ 3์๊ฐ ์ ์ง
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
# ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ํธํํ JWT
# DB์ ์ ๋ณด์ ๋ง๋ค๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต
return jsonify({'result': 'success', 'token': token, 'post_state': status})
# ์ฐพ์ง ๋ชปํ๋ฉด
else:
return jsonify({'result': 'fail', 'msg': '์์ด๋/๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.'})
@app.route('/sign_up/save', methods=['POST'])
def sign_up():
# ํ์๊ฐ์
# ํด๋ผ์ด์ธํธ์์ ๋ฐ์์จ ๊ฐ์ ๊ฐ ๋ณ์์ ๋ด๊ธฐ
username_receive = request.form['username_give']
password_receive = request.form['password_give']
# ํจ์ค์๋๋ DB์ ๊ทธ๋๋ก ๋ด์ง ์๊ณ ์๋์ ํด์ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ํธํํ ๊ฐ์ ๋์ ๋ด๋๋ค
password_hash = hashlib.sha256(password_receive.encode('utf-8')).hexdigest()
email_receive = request.form['email_give']
nickname_receive = request.form['nickname_give']
profile_info_receive = request.form['profile_info_give']
# ๋ฐ์์จ ๊ฐ์ DB์ ์ ์ฅ
doc = {
"username": username_receive, # ์์ด๋
"password": password_hash, # ๋น๋ฐ๋ฒํธ
"nickname": nickname_receive, # ๋๋ค์
"profile_pic": "", # ํ๋กํ ์ฌ์ง ํ์ผ ์ด๋ฆ
"profile_pic_real": "profile_pics/profile_placeholder.png", # ํ๋กํ ์ฌ์ง ๊ธฐ๋ณธ ์ด๋ฏธ์ง
"profile_info": profile_info_receive, # ํ๋กํ ์๊ฐ๊ธ
"email": email_receive # ์ด๋ฉ์ผ
}
db.users.insert_one(doc)
return jsonify({'result': 'success'})
# ์์ด๋ ์ค๋ณตํ์ธ
@app.route('/sign_up/check_dup', methods=['POST'])
def check_dup():
username_receive = request.form['username_give']
# ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์์จ ๊ฐ์ด DB์ ์กด์ฌํ๋์ง ์กด์ฌํ์ง ์๋์ง ํ์
exists = bool(db.users.find_one({"username": username_receive}))
return jsonify({'result': 'success', 'exists': exists})
# ๋๋ค์ ์ค๋ณตํ์ธ
@app.route('/sign_up/check_dup_nick', methods=['POST'])
def check_dup_nick():
nickname_receive = request.form['nickname_give']
# ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์์จ ๊ฐ์ด DB์ ์กด์ฌํ๋์ง ์กด์ฌํ์ง ์๋์ง ํ์
exists = bool(db.users.find_one({"nickname": nickname_receive}))
return jsonify({'result': 'success', 'exists': exists})
์ฝ๋๋ฅผ ์
๋ ฅํ์ธ์
<script>
{#๋ก๊ทธ์ธ ๊ธฐ๋ฅ ํจ์#}
function sign_in() {
let username = $("#input-username").val() {#์์ด๋ ๊ฐ์ username์ด๋ผ๋ ๋ณ์์ ๋ด๊ธฐ#}
let password = $("#input-password").val() {#ํจ์ค์๋ ๊ฐ์ password๋ผ๋ ๋ณ์์ ๋ด๊ธฐ#}
{#์์ด๋, ํจ์ค์๋ ๋ฏธ์
๋ ฅ ์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ๋
ธ์ถ, input ๋ฐ์ค์ ๊ฐ์ด ์๋ค๋ฉด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์จ๊น#}
if (username == "") {
$("#help-id-login").text("์์ด๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-username").focus()
return;
} else {
$("#help-id-login").text("")
}
if (password == "") {
$("#help-password-login").text("๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-password").focus()
return;
} else {
$("#help-password-login").text("")
}
$.ajax({
type: "POST",
url: "/sign_in",
data: {
username_give: username,
password_give: password
},
{#๊ฐ์ค ์์ฑ์ด ๋ ์์ด๋๋ผ๋ฉด ๋ฉ์ธ๋ฆฌ์คํธ ํ์ด์ง๋ก, ์์ฑ๋์ง ์์ ์ํ๋ผ๋ฉด ๊ฐ์ค ์์ฑ ํ์ด์ง๋ก#}
success: function (response) {
if (response['result'] == 'success') {
{# ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ํ ํฐ์ ํค๊ฐ ํํ๋ก ์ ์ฅ #}
$.cookie('mytoken', response['token'], {path: '/'});
let post_state = response['post_state']
window.localStorage.setItem('post_state', post_state)
if (post_state == 'posted') {
window.location.replace("/")
} else {
window.location.href = "/boards/form"
}
} else {
alert(response['msg'])
}
}
});
}
{# ํ์๊ฐ์
๊ธฐ๋ฅ ํจ์ #}
function sign_up() {
{# ๊ฐ ํ์์ ๋ณด ๊ฐ์ ๋ณ์์ ๋ด๊ธฐ #}
let username = $("#input-username").val()
let password = $("#input-password").val()
let password2 = $("#input-password2").val()
let nickname = $("#input-nickname").val()
let email = $("#input-email").val()
let profile_info = $("#input-profile_info").val()
console.log(username, password, password2, nickname, email, profile_info)
{# ์์ด๋๊ฐ์ด ์๋ ์ํ์์ ๋ก๊ทธ์ธ์ ์๋ํ๋ฉด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ์#}
if ($("#help-id").hasClass("is-danger")) {
alert("์์ด๋๋ฅผ ๋ค์ ํ์ธํด์ฃผ์ธ์.")
return;
{# ์ค๋ณตํ์ธ์ ํ์ง์๊ณ ํ์๊ฐ์
์ ์งํํ ์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ์#}
} else if (!$("#help-id").hasClass("is-success")) {
alert("์์ด๋ ์ค๋ณตํ์ธ์ ํด์ฃผ์ธ์.")
return;
}
if (password == "") { {# ๋น๋ฐ๋ฒํธ ๊ฐ์ ์
๋ ฅํ์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ์#}
$("#help-password").text("๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-password").focus()
return;
} else if (!is_password(password)) { {# ๊ฐ์ ์
๋ ฅํ์ง๋ง ํ์๊ฐ์
์ ์ํ ๋น๋ฐ๋ฒํธ ํ์์ ๋ง์ง ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ์#}
$("#help-password").text("๋น๋ฐ๋ฒํธ์ ํ์์ ํ์ธํด์ฃผ์ธ์. ์๋ฌธ๊ณผ ์ซ์ ํ์ ํฌํจ, ํน์๋ฌธ์(!@#$%^&*) ์ฌ์ฉ๊ฐ๋ฅ 8-20์").removeClass("is-safe").addClass("is-danger")
$("#input-password").focus()
return
} else { {#๊ฐ๋ ์๊ณ ํ์๋ ๋ง๋ค๋ฉด ํ์๊ฐ์
๋ฒํผ์ ๋๋ฆ๊ณผ ๋์์ ์๋ ๋ฌธ๊ตฌ ์ถ๋ ฅ#}
$("#help-password").text("์ฌ์ฉํ ์ ์๋ ๋น๋ฐ๋ฒํธ์
๋๋ค.").removeClass("is-danger").addClass("is-success")
}
if (password2 == "") {
$("#help-password2").text("๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-password2").focus()
return;
} else if (password2 != password) { {# ์ฒซ ์นธ์ ์ ์ ๋น๋ฐ๋ฒํธ์ ์ผ์นํ์ง ์์ ์์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์ถ๋ ฅ#}
$("#help-password2").text("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.").removeClass("is-safe").addClass("is-danger")
$("#input-password2").focus()
return;
} else {
$("#help-password2").text("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํฉ๋๋ค.").removeClass("is-danger").addClass("is-success")
}
if ($("#help-nickname").hasClass("is-danger")) {
alert("๋๋ค์์ ๋ค์ ํ์ธํด์ฃผ์ธ์.")
return;
{# ์ค๋ณตํ์ธ์ ํ์ง์๊ณ ํ์๊ฐ์
์ ์งํํ ์ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ํ์#}
} else if (!$("#help-nickname").hasClass("is-success")) {
alert("๋๋ค์ ์ค๋ณตํ์ธ์ ํด์ฃผ์ธ์.")
return;
}
if (email == "") {
$("#help-email").text("์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-email").focus()
return;
} else if (!is_email(email)) {
$("#help-email").text("์ด๋ฉ์ผ ํ์(scrum@email.com)์ด ๋ง๋์ง ํ์ธํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-email").focus()
return
} else {
$("#help-email").text("์ฌ์ฉํ ์ ์๋ ์ด๋ฉ์ผ์
๋๋ค.").removeClass("is-danger").addClass("is-success")
}
{# ์
๋ ฅ๋ฐ์ ๊ฐ๋ค์ ์๋ฒ์ sign_up()์ผ๋ก ๋ณด๋ #}
$.ajax({
type: "POST",
url: "/sign_up/save",
data: {
username_give: username,
password_give: password,
nickname_give: nickname,
email_give: email,
profile_info_give: profile_info
},
{# ์ ์ ์๋๋์์ ์ ์๋ ๋ฌธ๊ตฌ ์ถ๋ ฅ #}
success: function (response) {
alert("ํ์๊ฐ์
์ ์ถํ๋๋ฆฝ๋๋ค!")
window.location.replace("/login")
}
});
}
{# ๋ก๊ทธ์ธ ์ฐฝ๊ณผ ํ์๊ฐ์
์ฐฝ์ "ํ์๊ฐ์
ํ๋ฌ๊ฐ๊ธฐ"์ "์ทจ์" ๋ฒํผ ํด๋ฆญ์ผ๋ก ์ ํ๋๋๋ฐ, toggleClass๊ธฐ๋ฅ์ ํตํด
๋ก๊ทธ์ธ ํ๋ฉด์์ ๋ณด์ฌ์ผํ๋ ์
๋ ฅ์นธ๊ณผ ํ์๊ฐ์
์์ ๋ณด์ฌ์ผํ๋ ์
๋ ฅ์นธ์ ๋์ ๋ฐ๋ผ ๋
ธ์ถ/์จ๊น#}
function toggle_sign_up() {
$("#sign-up-box").toggleClass("is-hidden")
$("#div-sign-in-or-up").toggleClass("is-hidden")
$("#btn-check-dup").toggleClass("is-hidden")
$("#btn-check-dup_nick").toggleClass("is-hidden")
$("#help-id").toggleClass("is-hidden")
$("#help-password").toggleClass("is-hidden")
$("#help-password2").toggleClass("is-hidden")
$("#help-email").toggleClass("is-hidden")
$("#help-profile_info").toggleClass("is-hidden")
$("#help-nickname").toggleClass("is-hidden")
$("#help-id-login").toggleClass("is-hidden")
$("#help-password-login").toggleClass("is-hidden")
}
{# ์์ด๋ ํ์์ ๊ฒ์ฌํ๋ ์ ๊ท์ #}
function is_username(asValue) {
var regExp = /^(?=.*[a-zA-Z])[-a-zA-Z0-9_.]{2,10}$/;
return regExp.test(asValue);
}
{# ํจ์ค์๋ ํ์์ ๊ฒ์ฌํ๋ ์ ๊ท์ #}
function is_password(asValue) {
var regExp = /^(?=.*\d)(?=.*[a-zA-Z])[0-9a-zA-Z!@#$%^&*]{8,20}$/;
return regExp.test(asValue);
}
{# ์ด๋ฉ์ผ ํ์์ ๊ฒ์ฌํ๋ ์ ๊ท์ #}
function is_email(asValue) {
var regExp = /^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/;
return regExp.test(asValue);
}
{# ๋๋ค์ ํ์์ ๊ฒ์ฌํ๋ ์ ๊ท์ #}
function is_nickname(asValue) {
var regExp = /^[๊ฐ-ํฃ]{2,6}$/;
return regExp.test(asValue);
}
{# ์์ด๋ ํ์ ๊ฒ์ฌ, ์์ด๋ ์ค๋ณตํ์ธ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํจ์ #}
function check_dup() {
let username = $("#input-username").val()
console.log(username)
if (username == "") {
$("#help-id").text("์์ด๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-username").focus()
return;
}
if (!is_username(username)) {
$("#help-id").text("์์ด๋์ ํ์์ ํ์ธํด์ฃผ์ธ์. ์๋ฌธ๊ณผ ์ซ์, ์ผ๋ถ ํน์๋ฌธ์(._-) ์ฌ์ฉ ๊ฐ๋ฅ. 2-10์ ๊ธธ์ด").removeClass("is-safe").addClass("is-danger")
$("#input-username").focus()
return;
}
$("#help-id").addClass("is-loading")
$.ajax({
type: "POST",
url: "/sign_up/check_dup",
data: {
username_give: username
},
success: function (response) {
{# ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ด exists ๋ผ๋ฉด ์ด๋ฏธ ์กด์ฌํ๋ ์์ด๋๋ผ๋ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ๋
ธ์ถ๊ณผ ํจ๊ป ์
๋ ฅ์นธ ์ด๋ #}
if (respose["exists"]) {
$("#help-id").text("์ด๋ฏธ ์กด์ฌํ๋ ์์ด๋์
๋๋ค.").removeClass("is-safe").addClass("is-danger")
$("#input-username").focus()
} else { {# ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ด exists๊ฐ ์๋๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๋ฌธ๊ตฌ ๋
ธ์ถ #}
$("#help-id").text("์ฌ์ฉํ ์ ์๋ ์์ด๋์
๋๋ค.").removeClass("is-danger").addClass("is-success")
}
$("#help-id").removeClass("is-loading")
}
});
}
{# ๋๋ค์ ํ์ ๊ฒ์ฌ, ์์ด๋ ์ค๋ณตํ์ธ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํจ์ #}
function check_dup_nick() {
let nickname = $("#input-nickname").val()
console.log(nickname)
if (nickname == "") {
$("#help-nickname").text("๋๋ค์์ ์
๋ ฅํด์ฃผ์ธ์.").removeClass("is-safe").addClass("is-danger")
$("#input-nickname").focus()
return;
}
if (!is_nickname(nickname)) {
$("#help-nickname").text("๋๋ค์์ ํ์์ ํ์ธํด์ฃผ์ธ์. ํ๊ธ๋ง ์ฌ์ฉ ๊ฐ๋ฅ. 2-6์ ๊ธธ์ด").removeClass("is-safe").addClass("is-danger")
$("#input-nickname").focus()
return;
}
$("#help-nickname").addClass("is-loading")
$.ajax({
type: "POST",
url: "/sign_up/check_dup_nick",
data: {
nickname_give: nickname
},
success: function (response) {
if (response["exists"]) {
$("#help-nickname").text("์ด๋ฏธ ์กด์ฌํ๋ ๋๋ค์์
๋๋ค.").removeClass("is-safe").addClass("is-danger")
$("#input-nickname").focus()
} else {
$("#help-nickname").text("์ฌ์ฉํ ์ ์๋ ๋๋ค์์
๋๋ค.").removeClass("is-danger").addClass("is-success")
}
$("#help-nickname").removeClass("is-loading")
}
});
}
</script>์ฝ๋๋ฅผ ์
๋ ฅํ์ธ์
๊ฐ์ ํ์ด์ง ๋ณ๋ก ๊ธฐ๋ฅ์ ๋งก์๋ ๊ฒ์ ๊ณผ์ ์ ์ผ๋ก ํ์คํ์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๊ด๊ณ๋ฅผ ์ดํดํ๋๋ฐ์ ๋์์ด ๋์๋ค. ๊ทธ๋ฌ๋ ์์ฌ์ ๋ ์ ์ ๊ฐ์์ ๊ธฐ๋ฅ์ ํฉ์น๋ ๊ณผ์ ์์ Git์ ์ฌ์ฉํ๋๋ฐ, ๊ฒน์น๋ ๋ถ๋ถ์ด ๋ง๋ค๋ณด๋ ์ฝ๋๋ฅผ commitํ๊ณ pushํ๋ ๊ณผ์ , pull์ ๋ฐ์์ค๋ ๊ณผ์ ๋ชจ๋์์ ์ฝ๋ ๊ฐ์ ์ถฉ๋์ด ์ฆ์๊ณ , ํ ์ ์ฒด์ ์ผ๋ก workflow๋ฅผ ํด์น๊ฒ ๋์๋ค. ํ์๋ค ๋ชจ๋ ์ด ์ ์ ์์ฌ์์ ๋๊ผ๊ณ , ๋ค์ ํ๋ก์ ํธ์์๋ ๊ธฐ์ด ์ค๊ณ ๋จ๊ณ์์๋ถํฐ ๊ผผ๊ผผํ๊ฒ ์์ํ์๋ ๋ค์ง์ ํ๊ฒ ๋์๋ค.
์ฒซ ๋ ๋ถํฐ TIL์ ๊พธ์คํ ์์ฑํด๋ณด๋ฆฌ๋ ๊ฐ์ค๋ฅผ ์งํค์ง ๋ชปํ ๊ฒ์ด ๋ถ๋๋ฝ๋ค.. ์ค๋ WIL๋ ์ ์์ฑํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง.. ์ด๋ฏธ 1์ฃผ์ฐจ๋ ์ง๋๊ฐ๋ค! ๋ค์๊ธ ๊พธ์คํจ์ ์ด์ด๋๊ฐ๊ฒ ๋ค๋ ๋ค์ง์ ํ๋ฉฐ ์ฒซ WIL์ ๋ง๋ฌด๋ฆฌํ๋ค. ๋ด์ผ ๋ถํฐ๋ ๊ผญ! 1์ผ 1TIL! (์ด๋ฉ์ผ๊ธฐ ๊ฐ๋๋ผ๋ ๊ด์ฐฎ์๐ )