
이번 주간은 드디어 벚꽃이 만개함과 동시에 첫 프로젝트를 시작하게 되었다. 비전공자로서 팀에서 최소한 1만큼은 하고 싶다는 마인드로 최선을 다하고 싶었다. 아무래도 이제 막 파이썬과 SQL을 공부했던 터라 지금까지 배운 것들을 한번에 적용해서 프로젝트를 만들어낼 수 있을까하는 걱정이 먼저 앞섰다. 그래도 가장 감사했던 것은 혼자서는 해결할 수 없었던 부분들은 주변 팀원분들이 문제해결사처럼 도와주셔서 문제의 늪에서 빠져나올 수 있도록 도와주셨다. 물론 혼자서 고군분투했던 시간들도 있었지만, 그 시간들마저 하나도 아깝지 않고 값진 시간이었다.
📚회고 구성
1️⃣ LEARN
1) 지난 일주일 동안 가장 인상 깊었던 배움
2) 그 배움까지 다가가는데 어떤 어려움이 있었는지
2️⃣FINDINGS & FEELINGS
: 그 과정에서 나는 무엇을 깨달았고, 어떤 감정/생각이 들었는지?
3️⃣ RESULT
: 결과적으로, 현재 나의 상태는?
4️⃣ HOW TO SOLVE
: 이 상태에서 다음 일주일을 더 잘 보내려면 어떻게 해야 할까?
지난 일주일동안 가장 인상 깊었던 배움
💡그 중에서도 가장 인상적인 부분을 정리하자면…
이번 프로젝트의 주제는 웹크롤링을 통해 자동차나 자동차 회사와 관련된 데이터를 수집해서 Database에 저장한 후에 그 기반으로 시스템을 구현하는 것이다. 우리 팀은 다양한 주제 후보들이 나왔지만, 그중에 한 팀원이 낸 아이디어 중에 신박하고 새로운 아이디어가 채택되었다. 그 아이디어는 바로 다양한 자동차 회사의 자동차 정보들을 크롤링을 해서 자동차 월드컵 게임을 만들자는 것이다. 그냥 자동차 정보를 보여주면, 식상하기도 하고 단순한 시스템 구현이다보니 보다 사용자들이 재밌게 즐길 수 있는 콘텐츠를 선정하게 되었다.
우리는 그 프로젝트를 실현하기 위해 가장 먼저 10년치 신차 데이터 정보를 사이트에서 크롤링 해와야 했다. 우리가 배웠던 크롤링 방법은 두가지가 있는데 정적 사이트와 동적 사이트에 따라 방법이 달라진다. 그래도 우리가 활용할 사이트는 정적 사이트이다보니, Beautiful soup을 활용했다.
여기서 인상적인 부분이 있다면, 우리는 거의 3897개의 데이터를 끌어와야해서 데이터의 양이 상당했다. 보통, 그 웹사이트가 랜더링 되는 시간을 기다려야 하기 때문에 time.sleep() 을 걸어주는데 처음엔 3초 정도 걸어주어도 데이터를 크롤링해서 csv에 저장하는데까지 시간이 걸렸다. 그래서 다른 팀원분이 0.1초로 해보라고 말씀해주셔서 바로 해보니 빠르게 데이터를 가져올 수 있었다.
for i in range(7576, 4000, -1):
try:
url = f'https://www.carisyou.com/car/{i}/Spec'
response = requests.get(url)
time.sleep(0.1)
response.raise_for_status()
parser = BeautifulSoup(response.text, 'lxml')
다음으로, 이제 가져온 데이터를 자동차 월드컵 게임으로 구현하는 과정이 필요했는데, python 패키지 중 하나인 Streamlit을 활용했다. streamlit은 수업 시간에 배운 내용이 아니다보니, 어떻게 사용해야 하는지 모르는 부분이 많았다. 그치만, 경험이 많으신 팀원분께서 하나하나씩 알려주셔서 도움을 많이 받았다. 그 중에서도 내가 담당했던 파트는 자동차 월드컵 게임 후에 최종으로 선택받은 자동차인 winner_info를 데이터에 저장하고 시각화해서 보여주는 부분까지를 연결하는 코드로 구현해야 했다. 그리고, 그 winner_info 중에 win_log 를 하나씩 추가해서 win_log 에 따라 랭킹을 나타내는 것이 통계 시각화의 주요 목적이었다. 이때 아래와 같이 데이터를 연결할 때, if구문을 활용해서 win_log 를 update함과 동시에 winner_info 를 insert할 수 있었다.
with conn.cursor() as cursor:
# 1. 기존에 해당 car_id가 있는지 확인
select_sql = "SELECT win_log FROM winner_info WHERE car_id = %s"
cursor.execute(select_sql, (car.car_id,))
existing = cursor.fetchone()
if existing:
# 2. 이미 있다면 win_log 1 증가시켜 업데이트
new_win_log = existing[0] + 1
update_sql = """
UPDATE winner_info
SET win_log = %s
WHERE car_id = %s
"""
cursor.execute(update_sql, (new_win_log, car.car_id))
else:
# 3. 없다면 새로 insert (win_log = 1)
insert_sql = """
INSERT INTO winner_info (
car_id, model, img_url, price, outfit, win_log
) VALUES (
%s, %s, %s, %s, %s, %s
)
"""
그 배움까지 다가가는데 어떤 어려움이 있었는지
우리가 수집해야 하는 자동차 정보 중에 가격은 특정 가격이 아니라 range가 있는 가격 정보였다보니, 가격을 몇으로 가져올지도 정해올지도 정해야 했고, 그걸 코드로 어떻게 구현해서 가져올지도 어려움이 있었다. 이때, len() 을 활용해서, 각 가격에 따라 다른 값들을 가져오도록 설정하였다.
if len(elements2) == 3 or len(elements2) == 4:
price_real = elements2[-2].text.strip().replace(',', '') + elements2[-1].text.strip().replace(',', '')
elif len(elements2) == 2:
if len(elements2[0].text) <= 2:
price_real = elements2[0].text.strip().replace(',', '') + elements2[1].text.strip().replace(',', '')
else:
price_real = elements2[1].text.strip().replace(',', '')
else:
price_real = elements2[0].text.strip().replace(',', '')
가격.append(price_real)
: 그 과정에서 나는 무엇을 깨달았고, 어떤 감정/생각이 들었는지?
이번 프로젝트를 하면서, 아직 나는 갈 길이 멀었다는 것을 다시금 깨닫는 시간이 되었다. 어쨌든, 이 교육이 끝나면 실무에 투입되어서 나의 역할을 잘 수행해야 하지만, 지금 상태로는 절대로 불가능하다는 것을 직면했다. 여러 방면에서 잘할 수 있는 사람이 되고 싶지만, 이번 프로젝트에서 나의 역할이라고 한다면 READ.me 파일과 문서를 정리하는 역할이었다. 정리를 하면서 프로젝트 전반적인 부분들을 이해할 수 있엇지만, 아직까지 세밀하게 코드를 구성하는 부분이 많이 약하다는 것을 느끼게 되었다. 이번 프로젝트를 통해, 나의 부족한 부분들을 다시금 직면할 수 있는 계기가 되었다.
: 결과적으로, 현재 나의 상태는?
프로젝트 부분 중에서 몇 퍼센트를 이해했는지 묻는다면..한 40%를 이해했던 것 같다. 프로젝트의 전반적인 부분들은 모두 이해하고 있지만 사실상 하나씩 뜯어보면 그 내부적인 코딩 방식이나 DB를 연결하는 부분들은 완벽히 이해하기엔 나의 역량이 너무 부족하다. 2주동안 배운 내용을 단번에 다 적용하면..아마 난 천재가 아닐까... 근데 난 천재가 아니다^^
: 이 상태에서 다음 일주일을 더 잘 보내려면 어떻게 해야 할까?
코딩 실력에 심각성을 느끼고, 이번주에는 남아서 공부하는 시간을 최대한으로 늘려보려고 한다. 그래서 실질적 실천 방안을 작성해보자면!
실질적 실천방안
1️⃣ 첫 번째, 지금까지 배운 내용들을 꾸준히 복습하기!
→ 1-2주차 때 배웠던 Python 내용들을 꾸준히 복습하고 이에 맞는 예제들을 찾아서 연습해보는 것이다.
2️⃣ 두 번째, 예복습 스터디에 진심으로 임하기!
→ 우리 예복습 스터디 멤버들도 다 너무 진심으로 임하다보니 공부가 정말 많이 된다. 이번주엔 내가 lead를 하는 차례가 되어서 더 열심히 수업을 듣고 준비해보려고 한다.
3️⃣세 번째, 프로그래머스 코테 꾸준히 풀기!
→ 코테의 장점은 python을 계속해서 복습시켜준다는 것이다. 그래서 코테 스터디전까지 모든 문제를 다양한 풀이 방안으로 풀어가보는 것이 목표다!