다들 자신의 주특기에 자신있는 분들을 만나 프로젝트를 순조롭게 진행 할 수 있어 4/16 중간체크 이전 까지 주요 기능인 채팅을 완성할 수 있었습니다.
지금까지 정확한 시간계획 없이 프로젝트 진행, 주특기 공부 등을 하고 있어 정리가 잘 안되는 느낌을 받아 항해 99에서 만난 분들과 시간을 정해 알고리즘 공부를 하기로 하였습니다. 21:30 ~ 23:30 까지 Python 을 이용하여 프로그래머스, 백준 알고리즘 을 풀어 서로 도움되는 시간을 가질 수 있고, 지속적으로 알고리즘을 공부함으로 알고리즘에 익숙해 질 수 있을 것 같습니다.
채팅을 만들며 기본 CRUD를 사용하는 것이 아닌 WebSocket통신을 접할 수 있어 알림, 채팅 등 실시간으로 이루어지는 것에 대해 조금이나마 이해할 수 있었습니다. 아직 Redis에 대해서는 더 공부해야 할 필요성을 느꼇습니다.
처음 WebSocket을 이용하여 채팅을 구현한 것이여서 기분이 매우 좋았으며, 팀원분들과 직접 구현한 채팅 페이지에서 채팅을 하며 소소한 즐거움을 얻을 수 있었습니다.
카카오 소셜로그인은 심화 Spring강의에서 한 프로젝트 안에 백엔드, 프론트엔드가 공존할때에만 구현한 경험이 있어 이를 토대로 소셜로그인을 React와 같이 하려 했지만 Redirect하는 부분에서 Token을 어떻게 넘겨줘야하는지에 문제가 있어 프론트엔드에서 카카오Token을 백엔드로 넘겨주는 방식으로 해결하였습니다. 이게 올바른 방법인지는 아직 해답을 찾이 못하였으나 마지막 코드리뷰때 문의할 예정입니다.
비밀번호 변경하는 방법을 메일보내는 것을 통해 구현하였습니다. 비밀번호 찾기 시 랜덤한 인증번호를 메일과 프론트엔드에 보내어 인증번호를 올바르게 입력하였을때 비밀번호를 변경 할 수 있는 페이지에 나오게 하였는데, 그리 어려운 기능은 아니였지만 Spring boot 코드에서 메일을 보내는 기능을 추가 하여 재밌는 경험이였습니다.
처음으로 백엔드와 프론트엔드로 나누어 프로젝트를 진행하는 경험을 할 수 있었습니다. 혼자만의 속도가 아닌 팀원 전체의 속도에 맞추다보니 완벽하게 프로젝트를 마무리 하지 못하여 아쉬움이 있었지만 그래도 여러사람과의 협업을 통해 프로젝트를 진행 해보았다라는것에 의미가 있었습니다.
매 주차마다 제출하는 단원평가에 코드리뷰, 피드백이 없다 등 아쉬움점을 적어서 인지 스파르타에서 14시~16시에 튜터님이 상시 대기하며 질문 받는 코너가 새로 생겨 프로젝트를 진행 하다 막히는 부분이나 이론상 이해가 안되는 부분이 있으면 물어볼 수 있어 좋았습니다.
항해99를 시작한지 겨우 3주(21일)밖에 안지났는데 하루 최소 12시간 이상 씩 매일 하다보니 체감상 3달은 된거 같습니다. 적은 일수로 많은 것을 해내기 위해 필요한 것들만 배울 수 있도록 커리큘럼이 짜여져 있어 항해 99가 끝난 후에 어떻게 되었을지 기대가 많이 됩니다.
몰랐던 알고리즘(백트래킹, 분할정복, 다익스트라)을 적용해야만 풀 수 있는 문제도 있어 혼자 고민하면서 시간을 흘러보내며 결국 인터넷을 찾아봐서 알게되었지만 문제를 해결하려고 시도한 덕분에 알고리즘에 더욱 익숙해질 수 있었습니다.
2주동안 배우고 연습했던 알고리즘으로 3/20 Startup Coding Festival을 지원해 시험을 봤습니다. 4시간동안 총 6문제를 풀면되는데, 6문제 중 2문제만 정답으로 처리되고 2문제는 예제만 통과해 많이 아쉬웠고, 열받았습니다. 알고리즘 공부를 나름 열심히 했다고 생각했는데 더욱 더 열심히 해야하는 생각이 들었습니다. (지속적으로 최소 하루에 2~3문제는 풀기)
다음 커리큘럼(3/19) 부터 각자 선택한 주특기(Spring)에 대해 배우게 되는데, 이제 본격적으로 서비스를 만드는 준비를 하는거 같아 설렘을 느끼고있습니다.
1주차 동안 같이 프로젝트를 진행했던 팀원분들과는 헤어지고 랜덤으로 생성된 다른 팀으로 재조정 되었습니다.
알고리즘에 대해 이해할 수 있는 문제들이 제시 되어 해당 요일들을 권장요일에 맞춰 문제를 푸는 형태이며, 별도의 수업은 없으며 사전지식이 없는 경우를 대비해 스파르타 코딩클럽에서 운영하고 있는 알고리즘, 파이썬 기본문법을 수강할 수 있도록 무료로 열어 주어 개개인의 실력차를 스스로 맞춰나갈 수 있도록 진행되었습니다.
3/5일 ~ 3/11일 까지 21문제가 제시 되었고, 각각 난이도는 하하 ~ 중상 까지 있었습니다.
(2) 일정
3/5 ~ 3/11 - 권장요일에 맞는 문제풀이
3/5 ~ 3/11 - 모르는 부분을 채우기 위한 동영상 강의 보기 (스스로 부족한 부분만 봐도 무방)
3/10 (19:00 ~ 20:00) - 항해톡 진행 (항해99 크루원(참가자) 중 지원한 4명을 선정해 각각 RestAPI, https, 프로세스와 스레드, 시간복잡도 에 대한 설명)
3/5 초반부 문제들은 사칙연산, 조건문, 반복문, 문자열 등 대체로 쉬운부분 이여서 무난하다 후반부분에서 익숙치 않은 알고리즘을 만나 시간을 많이 소모하기도 했습니다. 1주차에 비해 팀원분들과 소통하는 시간은유일하게 풀었던 문제 코드리뷰, 또는 모르는 문제 물어보기 밖에 없어 개개인이 각자 문제 푸는 시간이 많고, 팀원들과의 속도가 맞지 않아 쉬는 시간을 더 많이 갖고, 집중력도 떨어져 열심히 안한것 같아 나 자신에게 실망했습니다.
그래도 후반부에 나오는 DFS/BFS, DP, 이분탐색 등 코딩 테스트에 자주 출제하는 알고리즘을 사용해야하는 문제들을 알려주고, 배우며 익숙해지고있어 만족스러웠습니다.
공식적으론 아침 9시 ~ 저녁 9시까지 공부를 해야 한다고 나와있지만 부족한 점이 많기에 아침 9시 ~ 새벽(자기전) 까지 계속 진행되었습니다.
항해 99를 시작 하기 전 웹 개발에 대해 지식을 조금이나마 채울 수 있도록 항해 99에선 웹 개발 종합반 수업을 열어 사전학습을 하도록 한 후 3월 1일 부터 바로 3명의 랜덤 팀원들과 미니 프로젝트를 진행하게 되었으며, 1주일 간 배운 것을 회고할 수 있도록 WIL을 추천하여 이 글을 쓰게 되었습니다.
(2) 일정
3/1 ~ 3/4 - 팀 배정 및 웹 개발 미니 프로젝트
3/5 - 3/1 ~ 3/4 동안 만들었던 미니 프로젝트 발표 및 팀 배정
3/6 ~ 알고리즘 문제풀이
(3) 배운점
Git
매번 Git을 쓰려고 했지만 혼자쓰는 경우가 많아 add, Commit, push, pull, branch에 대해 개념은 알고있었지만 사용하는법은 잘 몰랐었습니다. 이번 미니 프로젝트를 진행하며 팀원들과 수십번, 수백번의 add, Commit, push, pull 을 하며 조금이나마 익숙해 질 수 있었습니다.
팀 배정을 받은 후 3/4일 자정까지 부족한 시간으로 프로젝트를 진행하게 되었습니다. 공대생 3명으로 이루어진 팀이여서 그런지 프로젝트 완성 후에도 디자인이 너무 투박해 아쉬운 면도 있지만 팀원들과의 협업을 통해 하나의 프로젝트를 완성했다는 것이 만족스러웠습니다.
프로젝트를 진행 하면서 JWT를 사용하라는 조건이 있어 JWT에 대해 자연스럽게 알게되었으며, 또 한번 사용해보게 되어 공부가 많이 되었습니다. 또한 조건에 없는 경우에도 프로젝트를 만들면서 필요한기능을 하나 둘 씩 생각하고 찾아보면서 몰랐던 부분을 새롭게 알게되었고, 혼자 아침 9 시부터 자기전 까지 계속 컴퓨터 앞에 앉아 공부하는 것이 쉽지만은 않은데 Gather을 통해 마이크, 웹캠을 키고 진행을 하게 되어 온라인이지만 오프라인에서 공부하는 느낌이 들어 팀원들과 힘을 내 매일매일 9시부터 자기전까지 개발을 할 수 있었습니다.
3/5일 다른 팀 총 32개조의 미니 프로젝트를 보면서 여러 아이디어를 보며 사전학습에 배웠던 '크롤링'만으로 여러 가지를 할 수 있구나를 보며 신기했습니다.
3/6일 부터 알고리즘 주차가 시작되었습니다. 항해 99 튜터 분들이 정해 놓은 문제를 하나 둘 씩 풀면서 푼 문제는 팀원들과 코드리뷰, 어려운 문제가 있는 경우 서로 도와주며 진행하고있으나, 아직 쉬운문제이기에 다음주에는 항해 99에서 열어준 알고리즘 수업을 듣고 문제를 푸는 방식으로 갈 예정입니다.
드디어 마지막 5주차가 끝났습니다. 현재 취준생인 저로써는 하루에 1주차씩 5일정도를 소모하여 5주차를 완료할 수 있었습니다.
웹개발 종합반을 들으면서 대단한건 아니지만 처음부터 끝(도메인)까지 개발한 경험을 얻을 수 있어 의미있는 시간이였고, 학생들이 흥미를 느낄 수 있도록 수업 커리큘럼이 잘 짜여진 것 같습니다. 하지만 짧은 시간을 들여서 경험한 전체적인 틀을 조금조금씩 다루는 정도 여서 깊이는 조금 아쉬웠습니다.
window의 경우 Pycharm 내부에서 File -> Settings -> Project: Project_Name -> Python Interpreter -> +버튼 ->원하는 Package입력 ->Install Package -> OK
+버튼
requests
#requests 라이브러리 설치 필요
import requests
r = requests.get('open_api 주소')
rjson = r.json()
bs4 (BeautifulSoup)
import requests
from bs4 import BeautifulSoup
# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# url = 크롤링하고 싶은 사이트의 url
data = requests.get('url',headers=headers)
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
soup = BeautifulSoup(data.text, 'html.parser')
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
# 개발자도구(F12)를 열어 원하는 부분을 copy -> copy_selector를 통해 확인 가능
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
(3) MongoDB
DB 설치 및 확인 - 크롬창에 localhost:27017을 입력 후 아래화면이 나오면 정상
MongoDB정상작동
DB 종류
SQL - 데이터가 정형화 되어있어 분석에 용이하나, 중간에 열을 추가하는 행동이 어려울 수 있다.
No-SQL - 데이터가 딕셔너리 형태로 저장되어 일관성이 부족하지만, 중간에 열을 추가하는것에 문제가 없다.
pymongo 사용법
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
#dbname = 원하는 db이름
db = client.dbname
#collection_name = 원하는 collection 이름
#collection_name의 모든 값 검색
list(db.collection_name.find({},'_id':False))
#collection_name의 name열에서 Kim 검색
db.collection_name.find_one({'name':'Kim'},'_id':False)
#collection_name의 name열에있는 Kim을 나이 20세로 수정
db.collection_name.update_one({'name':'Kim'},{'$set':{'age':20}})
#collection_name의 name열에있는 Kim을 삭제
db.collection_name.delete_one({'name':'Kim'})
#collection_name의 데이터를 모두 삭제
db.collection_name.remove()
(4) 3주차 숙제
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://www.genie.co.kr/chart/top200?ditc=D&ymd=20200403&hh=23&rtm=N&pg=1',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
trs = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
for tr in trs:
rank = tr.select_one('td.number')
artist = tr.select_one('td.info > a.artist.ellipsis')
title = tr.select_one('td.info > a.title.ellipsis')
print(rank.text.split(' ')[0].strip(), title.text.strip(), artist.text.strip() )
(5) 느낀점
크롤링과 db에 대해 필요한 부분만 잘 정리되어있는 수업진행으로 기초 부분을 빠르고 쉽게 이해할 수 있었습니다.
모든 수업마다 이전에 했던 내용을 복습하며, 금주에 배울 내용에 대해서도 여러 번 반복하여 새로운 Quiz, 숙제를 통하여 이해뿐만 아니라 조금이나마 익숙해 질 수 있었습니다.