내가 고민을 했던가. 언제 선택을 했던가. 전역한지 1달도 안되어 흐름에 몸을 맡겨 부트캠프에 들어왔다. 동작신속! 빨리빨리 만들어라! 니 팀 버려?! 그렇게 정신을 혼미하고 정신없이 보낸 1주차. 전역 후 게을렀던 지난 20일들을 벗겨냈다.
응애 나 애기 스파르탄. 0주차는 역시나 임시입교 기간이었나. 분위기가 180도 뒤바뀌었다. 그렇게 나는 시작하자마자 영화 300의 시작 장면마냥 절벽으로 던져졌다.
🐱💻 NOTE
협업은 바람과 같지, 늘 내곁에 있으니
현직에서 어느 누구와 협업을 하게 될 지 모르니 이렇게 무작위로 사람을 마주하는 시간들을 조금 더 의미있게 사용해야겠다. 그렇게 걷지도 못하는 신생아는 1주차 첫 프로젝트에서 조장을 당했다.
미니 프로젝트를 기획하며 가장 먼저 마주한 어려움은 프로젝트의 조건이었다.
Jinja2
Flask 프레임 워크에서 사용되는 템플릿 언어, 웹 브라우저 쪽에서 HTML을 완성할 수 있는 사이드 랜더링의 이점 뿐만 아니라, Html 코드 내부에서 파이썬 코드를 이용해 연산작업이 수행 가능하도록 한다.
🐱💻 NOTE
어두움엔 강하고 담대하게!
jinja2 문법의 꼬부랑 중괄호들에 시작부터 긴장했던 첫 날. '기능만 구현하고 강의 들어봐야지.' '저걸 꼭 써야하나?'. 이런 생각들을 할 시간에 정면으로 마주했으면 훨씬 많은 시간이 절약되었을 것이다. 물리보다 어려운건 생각보다 적을지도..
JWT
JSON Web Token의 줄임말로, JSON 객체를 이용해 정보를 전달하는 기능이다.
예시로 이번 프로젝트에서는 사용자가 로그인 시 사용자의 id와 로그인 유효시간을 담아 발급했다. 그 후 사용자가 서버에 특정 요청을 할 때 요청에 해당 토큰을 포함하여 전달, 토큰이 유효하고 인증되었는지 검증 후 서비스를 제공했다.
로그인 시 token 제공
(id와 만료시간을 담은 payload를 JWT로 encode)#app.py
@app.route('/sign_in', methods=['POST'])
def sign_in():
# ... 입력정보 받아오기
if result is not None: #DB에 입력정보가 있으면
payload = {
'id': username_receive,
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
return jsonify({'result': 'success', 'token': token}) #token 제공
else: # DB에서 입력정보를 찾지 못하면
return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
//login.html
function sign_in() {
// ... 정보 입력 후
success: function (response) {
if (response['result'] == 'success') { //API 성공시
$.cookie('mytoken', response['token'], {path: '/'});
//쿠키에 token 입력.
window.location.replace("/")
} else {
alert(response['msg'])
//'msg': '아이디/비밀번호가 일치하지 않습니다.'
}
}
});
}
기능 이용시 token을 이용해 로그인 여부 및 userNickname 확인
@app.route("/team/write", methods=["POST"])
def ariticle_post():
# 쿠키에서 로그인 토큰을 받아온다.
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
userNickname = payload['id'] #token을 활용한 글쓴이 확인
# ... 글 작성
except(jwt.ExpiredSignatureError, jwt.exceptions.DecodeError):
return jsonify({'msg': "글 작성은 로그인을 해야합니다."}) #로그인 필요 전달
🐱💻 NOTE
의미없는 배움은 없다!
내 담당은 아니었던 회원가입/로그인 기능. 하지만 Merge 후 내가 구현한 게시판과 연결을 위해서는 어느정도 필요한 만큼은 이해해야 할 필요가 있었다. 피하지 말고 자처해서 배움을 마주하자. 모든 배움엔 의미가 있다. 새내기 잡스의 서예 시간이 그러했듯.
API
클라이언트의 요청에 따라 갖가지 기능을 제공하는 서버 창구. 목적과 성질에 따라 대표적으로 GET과 POST로 나뉜다.(PUT, DELETE, PATCH 제외)
🐱💻 NOTE
우린 답을 찾을 것이다. 늘 그랬듯이.
어찌어찌 표현은 했지만 아래의 회고에 적혀있듯 중간중간 API에 많은 문제들이 있었다. 멍청하게도 팀별 뉴스 불러오기(GET메서드)를 구현 할 때 서버에 데이터(특정 팀 크롤링을 위한 팀 이름)를 보내는 방법을 몰랐던 것. URL을 이용해 기껏 서버로 받아온 데이터가{{teamtitle}}
그대로였다나..
미니 프로젝트 회고
🐱💻 NOTE
계획은 최대한 꼼꼼히!
레이아웃, 디자인, 기능, API설계, 파일명, 역할배분 그리고 시간배분 그 모든 계획이 허술했다. 계획이 있고 없고의 시간 차이는 하늘과 만덕역 차이였다. (부산 3호선, 한국에서 가장 깊은 지하철 역)
미니 프로젝트에서 살아 돌아온 나. 응애. 애기 스파르탄.
이번엔 알고리즘 마라톤이다. 마라톤은 능력 향상을 위해 달렸던 것이 아니었다. 살기 위해 달렸던 것도 아니었다. 살리기 위해 달린 것이었다.
페이디피데스는 도망칠 수 있음에도 그리스를 위하여.
나에겐 무엇일까.
지금을 살기 위해 도망치지 말고, 내 미래를 살리는 것을 두고 달려봐야겠다.
🐱👤 TODO
하루하루 최선을 다하기.
┣ 새롭게 배우는 메서드, 해결방식 정리하기 - javascript 모아보기 (velog)
└ 도움 많이 받고, 도움 많이 주기. 나눌 수록 커진다. - 알고리즘 모아보기 (Github)