SK네트웍스 Family AI 캠프 1기 3주차 회고
SK Networks AI Camp
Weekly 회고 - 3주차
포스트를 읽기 전에..
이 포스트는 SK네트웍스 Family AI 캠프를 다니면서 느낀 개인적인 생각을 정리한 포스트입니다.
배운 내용이나 스킬셋에 대한 설명은 별도로 작성하지 않았기 때문에, 그에 대한 정보는 다른 포스트를 참고해주세요!
Liked
벌써 세번째 회고록 작성입니다! 회고록의 처음은 항상 좋은 점으로 시작하게 되는 것 같아요. 저의 경우엔, 좋은 점을 생각하고 그게 왜 좋았는지 생각해보면 배운 내용들이 생각나더라구요. 그리고 좋았던 점을 제외한 나머지 부분을 생각하면 스스로 부족한 부분이나 보완해야 할 점이 생각이 나서 회고록을 작성 할 때 항상 이 순서대로 작성하게 되네요. 이제 좋았던 점을 말씀드리겠습니다!
이번 주 강의 내용 중에서 가장 좋았던 점은 제가 잘 모르는 분야에 대해 배웠다는 것입니다. 저는 제가 사용할 줄 아는 툴이나 언어보다 제가 다루지 못하는 무언가를 배우는 것을 좋아하는 편입니다. 이번에 새로 배운 분야는 두 가지인데, 하나는 데이터베이스 그리고 나머지 하나는 웹 크롤링입니다. 새로 배웠다고 말씀드리긴 했지만, 아예 처음 보고 접하는 것은 아니고 인터넷으로 알아보고 간단한 문법이나 사용법정도만 알고 강의를 들었다고 생각하시면 됩니다.
강의를 듣기 전엔 사실 데이터베이스를 만만하게 생각했었습니다. 그 이유는 데이터 분야에서 주로 사용되는 SQL 언어의 문법이 다른 프로그래밍 언어에 비해서 직관적인 편이라고 생각했기 때문입니다. 하지만, 직접 경험해보니 직관적인 문법은 맞지만 뭔가 비슷비슷한 단어(?)들이 자주 사용되는 듯하여 그 단어가 어떤 역할을 하는 것인지 많이 헷갈렸습니다. 사실 회고록을 작성하는 지금도 명확히 구분하여 사용할 수 있다고 말씀드리기는 어려울듯 합니다. 좋았던 점에서 제 부족한 점을 너무 많이 언급한 것 같다는 생각은 들지만! 그래도 새로 무언가를 배워서 활용할 수 있는 툴이 늘었다는 것은 분명 저에게 좋은 점이기 때문에 좋은 점에 같이 적어보았습니다.
그리고 웹 크롤링 강의는 웹 크롤링 자체를 알게 되었다는 좋은 점도 분명 존재하지만, 그보다 웹 크롤링으로 어떠한 데이터를 수집하고 모은 데이터들을 SQL을 이용하여 데이터베이스에 올려서 관리할 수 있다는 것을 알게 된 것이 더 큰 좋은 점이라고 생각합니다. 캠프를 진행하다보면 중반부쯤 자연어 처리에 대해 배우게 될텐데, 자연어 처리에는 방대한 문장 데이터가 필요한 것으로 알고 있고 그 정도의 데이터는 사람이 수작업으로 만들 수 없을 것입니다. 그렇지만 저에게 그런 데이터를 만들라는 업무가 주어진다면 그 업무를 가장 효율적으로 수행할 수 있는 방법이 무엇일까요? 제가 생각하는 업무를 가장 효율적으로 수행하는 방법은 이러한 크롤링 툴과 데이터베이스를 이용하는 것입니다. 현재 소규모의 기업도 웹페이지에 챗봇을 배치하는 경우가 많은데, 결국 챗봇이라는 것은 어떠한 자연어 처리 모델이 동작하는 것이고 그 모델을 훈련하기 위한 데이터는 이런 식의 크롤링과 데이터베이스로 관리하게 될 것입니다. 말하다보니 문장이 길어졌는데 짧게 다시 말씀드리자면, “크롤링과 데이터베이스는 현재 가장 각광받는 분야인 자연어 처리 부분에서 유용하게 사용될 기술 스택이라서 배우게 되어 좋았다” 라고 정리할 수 있겠습니다!
Learned
좋았던 점에서 언급했던 것처럼 이번 주에 주요하게 배웠던 것은 데이터베이스와 웹 크롤링입니다.
데이터베이스에서 배웠던 내용을 하나하나 열거하자면 아마 월요일 입실할 때까지도 다 작성하지 못하지 않을까 싶습니다. 그렇기 때문에 여기서는 큰 흐름만 정리하고자 합니다.
데이터베이스 강의는 총 3일로 진행되었고 첫 날엔 MySQL 및 GUI 설치 그리고 GUI를 메인으로 사용하는 데이터베이스 관리, 둘째 날엔 본격적인 쿼리문에 대해 배우고 CLI으로 쿼리를 보내어 데이터베이스의 변화를 확인해보았습니다. 마지막으론 파이썬을 이용하여 쿼리를 보내어 데이터베이스의 변화를 보고, 반대로 파이썬에서 데이터베이스의 값을 가져오는 것을 배웠습니다. 세 가지 중에서 제가 경험해보았던 것은 둘째 날에 진행했던 CLI로 쿼리를 작성하고 데이터베이스에서 데이터를 가져오는 것이었습니다. 그렇기 때문에 나머지 두 가지는 처음 배웠던 내용이었습니다. 강의를 진행하는 동안엔 이해하지 어렵고 잘 모르는 문법도 많았는데, 강의 이후에 진행된 예복습 스터디에서 민재님께서 알려주신 내용을 정리하면서 배운 내용을 이해할 수 있게 되었습니다! 정리한 내용 중 몇가지만 가져와보자면 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- ALTER 수정
사용 예시 : ALTER TABEL UserTbl DROP COLUMN UserAge
-- SELECT 선택
사용 예시 : SELECT (3)* FROM (1)table_name WHERE (2)id ;
(1) - (2) - (3) 순서대로 범주가 큰 데이터
-- CREATE 생성
사용 예시 : CREATE TABLE `테이블 이름` (행이름 자료형) ; ex. (id INT)
-- DROP 삭제
사용 예시 : DROP TABLE `테이블 이름` ;
-- INSERT 삽입
INSERT INTO 테이블 이름
SELECT 행 이름1, 행 이름2, 행 이름3
FROM 데이터를 가져올 테이블 이름
LIMIT 줄 개수 = (최대로 가져올 데이터 개수)
사용 예시 :
INSERT INTO indexTBL
SELECT first_name, last_name, hire_date
FROM employees.employees
LIMIT 500
-- PROCEDURE
사용 예시:
DELIMITER //
CREATE PROCEDURE myProc()
BEGIN
SELECT * FROM memberTBL WHERE memberName = '당탕이';
SELECT * FROM productTBL WHERE productName = '냉장고';
END //
DELIMITER ;
삭제 시, DROP PROCEDURE myProc;
-- TRIGGER
(INSERT / UPDATE / DELETE)
:프로시저를 통해 위 3가지 작업이 수행되면 특정 작업을 추가로 수행하도록 한다.
-- LIKE "찾고자 하는 값"
-- 언더스코어(_)의 개수만큼 빈칸에 해당하며, 글자수가 같은 유사 인덱스를 반환
-- %는 와일드카드(*)와 비슷한 기능으로, 글자수를 고려하지 않은 유사 인덱스를 반환
Ex) %n% -> info, warning..
__fo -> info
__f% -> info
ORDER BY
: 정렬 기능(기본값은 오름차순)
정렬 조건이 여러 가지일 경우, 앞에 있는 조건이 우선순위
ASC 오름차순
DESC 내림차순
웹 크롤링에선 BeautifulSoup와 Selenium에 대해 배웠습니다. 두 가지 다 캠프 참여 전, 커리큘럼에 웹 크롤링이 있는 것을 보고 간단하게 사용해본 적이 있어서 데이터베이스 강의보단 수월했다고 생각합니다. 그렇기 때문에 앞선 데이터베이스처럼 배운 내용은 나열하는 것말고, 직접 코드를 작성하여 크롤링을 수행해보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# selenium의 webdriver를 사용하기 위함
from selenium import webdriver
# selenium으로 무엇인가 입력하기 위함
from selenium.webdriver.common.keys import Keys
# find_element를 사용하기 위함
from selenium.webdriver.common.by import By
# 페이지 로딩을 기다리는데에 사용
import time
# 검색할 키워드 입력
query = input("검색할 키워드를 입력하세요: ")
# 크롬드라이버 실행
driver = webdriver.Chrome()
# 크롬드라이버에 url 주소를 넣고 실행
driver.get('https://www.naver.com/')
# 페이지가 완전히 로딩되도록 3초동안 기다림
time.sleep(3)
# 검색창에 키워드 입력 후 엔터
search_box = driver.find_element(By.ID, "query")
search_box.send_keys(query)
search_box.send_keys(Keys.RETURN)
time.sleep(2)
# 뉴스 탭 클릭
driver.find_element(By.XPATH, '//*[@id="lnb"]/div[1]/div/div[1]/div/div[1]/div[1]/a').click()
time.sleep(2)
# 뉴스 제목 텍스트 추출
news_titles = driver.find_elements(By.CLASS_NAME, "news_tit")
for t in news_titles:
print(t.text)
# 뉴스 하이퍼링크 추출
for t in news_titles:
print(t.get_attribute('href'))
# 뉴스 썸네일 이미지 추출
# 스크롤 내리기 (모든 썸네일 이미지 로딩을 위함)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
# 뉴스 썸네일 이미지 다운로드
news_content_div = driver.find_elements(By.CLASS_NAME, 'news_contents')
news_thumbnail = []
for i in news_content_div:
try:
thumbnail = i.find_element(By.CLASS_NAME, 'thumb')
news_thumbnail.append(thumbnail)
except:
pass
link_thumbnail = [img.get_attribute('src') for img in news_thumbnail]
# 이미지 저장할 폴더 생성
import os
img_path = './crawling_imgs/'
if not os.path.exists(img_path):
os.mkdir(img_path)
# 이미지 다운로드
from urllib.request import urlretrieve
i = 0
for link in link_thumbnail:
i += 1
urlretrieve(link, img_path + f"{i}.jpg")
time.sleep(0.3)
아래 사진와 같이 뉴스 타이틀과 뉴스 링크, 그리고 썸네일을 가져오는 것을 확인할 수 있습니다! 하지만 썸네일을 가져오는 과정에 어떤 문제가 있는지, 제대로 가져와지지 않는 사진들이 있어 더 보완이 필요할 것으로 보입니다.
Lacked
이번 주에 스스로 가장 부족하다고 느낀 점은 “마음가짐”입니다. 캠프에 참여한 지 어느 덧 3주가 넘어가고 이 생활에 적응해서 처음 마음과는 다르게 열정적으로 무언가를 해야겠다는 생각이 줄어든 것 같습니다. 프로젝트라던가 스터디라던가 신경쓸 것들이 많아지니 하나에 집중하는 것도 쉽지 않고 거기에 더해서 무언가 해야겠다는 생각이 들지 않는 것 같아서 반성중입니다.. 주말동안 생각 정리를 하고 심기일전해서 첫 주의 마음가짐처럼 모든 것에 최선을 다하는 사람이 되어야겠다고 생각하고 있습니다.
앞서 언급한 내용에 더불어 예전과 다르게 문제 푸는 양도 적어지고 그거에 대해 생각할 시간도 많이 줄어들어서 문제 풀이 능력이나 사고력이 떨어진 것 같다는 생각이 듭니다. 그렇다고 떨어진대로 가만히 둘 순 없기에, 감사하게도 우수 회고록으로 선정받은 덕분에 받은 교보문고 상품권에 자비를 조금 보태서 알고리즘 서적을 새로 구매하였습니다! 앞으로 캠프 이후에 개별적으로 공부하면서 부족한 역량을 갈고 닦고자 합니다.
Longed for
부족한 점에서 언급한 것과 연결되는 얘기인데, 앞으로의 캠프 생활에서 스스로 바라는 점은 알고리즘 문제 풀이 능력을 향상시켜서 알고리즘 문제 풀이 대회에 참가해보는 것입니다. 사실 캠프의 내용과 알고리즘 문제 풀이는 크게 상관이 없지만, 스스로 어려운 목표를 설정하고자 하여 이런 목표를 설정해보았습니다! 7월쯤에 개최되는 대회가 있다면 참가할 예정인데 그 때까지 부족한 부분을 채워야 할 것으로 생각됩니다. 그러기 위해선 스스로의 노력도 중요하지만 현재 많은 인원과 함께 진행중인 알고리즘 스터디도 중요한 부분이라고 생각하고 있습니다. 그 이유는 알고리즘 스터디를 진행하기 위해 기초적인 자료구조와 알고리즘을 정리하고 다시 풀어보면서 스스로 부족한 부분을 알게되었기 때문입니다. 자료구조나 알고리즘을 깊게 공부하고 문제 풀이에 접근한 적이 없다보니 설명을 하기 위해선 처음부터 다시 공부해야했고 그 과정에서 ‘자료구조를 어떻게 구현하는지’, ‘메모리는 어떻게 관리되는지’ 와 같이 평소엔 생각하지 않았던 부분에 대해 생각해볼 수 있는 기회가 되었습니다.
맺음말
이번 주도 쓰다보니 주절주절 얘기가 길어졌네요. 이번 주는 전체적으로 스스로 나약해진 마음을 다시 강하게 만드는 한 주였던 것 같습니다. 저는 마음을 강하게 만들기 위해서 ‘어떤 목표를 설정하고 그 목표를 이루기 위해 노력하는 것’ 이 가장 중요하다고 생각합니다. 여러분들은 어떠신가요? 지금 마음이 약해지고 무언가 내려놓고 싶어지진 않으셨나요? 그럴 때일수록 마음 굳게 먹고 뭐라도 해보는 게 중요하다고 생각합니다! 예를 들면, 저에게는 알고리즘 대회 참가겠죠. 이 글을 보는 모두 다 스스로 설정한 목표 달성할 수 있는 사람이 되길 기원합니다.