-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
40 additions
and
12 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,41 @@ | ||
content = """ | ||
해커톤을 요약하면 다음과 같다고 할 수 있다. 1박 2일 내지 2박 3일밖에 되지 않는 매우 짧은 기간에 팀원들과 기획부터 개발까지 빠르게 달려서 하나의 프로덕트를 만드는 행사. 이렇게만 봐도 해커톤에는 낭만이 있는 것 같지 않은가? 해커톤을 하면 시야도 넓히고 실력도 매우 가파르게 향상할 수 있다. 해커톤이 주는 낭만과 실력 향상 및 재미를 위해 나는 늘 해커톤에 참여하고 싶었다. 하지만, 4년의 대학 생활 동안 나는 단 한 번도 해커톤에 나가지 못했다. 코로나 기간에는 해커톤이 개최되지 않았고, 코로나 전에는 나의 부족한 실력이 팀원들에게 민폐를 끼칠까봐, 코로나 이후에는 학교생활, 개발 공부 및 프로젝트 진행으로 인해 시간이 없었기 때문이다. 그러던 와중 SKYCC 해커톤은 나에게 있어서 최적의 타이밍일 때 개최됐다. 여러 차례의 개발 프로젝트 경험으로 인해 나는 개발에 대한 자신감을 가지고 있었고, 당시 마지막 학기여서 시간적으로 여유가 있었기 때문이다. 이 글에서는 내 인생 첫 해커톤인 SKYCC에 대한 간략한 소개를 시작으로, 해커톤을 하면서 느낀 점에 대해 다뤄보려고 한다. | ||
from selenium import webdriver | ||
from selenium.webdriver.chrome.service import Service | ||
from webdriver_manager.chrome import ChromeDriverManager | ||
from selenium.webdriver.common.by import By | ||
from selenium.webdriver.chrome.options import Options | ||
import time | ||
|
||
올해 처음 개최된 SKYCC해커톤은 어떤 해커톤일까? SKYCC 해커톤은 서울대, 고려대, 연세대의 중앙 컴퓨터 동아리인 SCSC, KUCC, YCC가 연합해서 기획하고 주최한 해커톤이다. 이전까지는 데면데면했던 세 동아리가 이 해커톤으로 인해 2학기에는 SKYST 컨퍼런스 개최를 하는 등 본격적으로 교류를 하게 만들어준 의미 있는 행사다. 2023년 5월 13일 토요일과 5월 14일 일요일에 1박 2일로 진행됐으며, SKY 학생이라면 컴퓨터 동아리를 하지 않더라도, 분교생이더라도 누구나 참여할 자격이 주어졌다. 후원사인 AWS에서 제공해준 역삼역 사옥에서 진행됐으며, 무려 140명이 참여한 초대형 행사다. 한 팀은 4~5명으로 구성돼 있으며, 팀을 꾸려서 참가할 수 있다. 혼자 또는 4명 이하로 등록하면 사전에 진행된 설문조사를 토대로 포지션과 실력에 맡게 나머지 팀원이 매칭됐다. 사전에 주제가 공지됐는데, 이번 SKYCC의 부제가 pairing이었기 때문인지, 해커톤의 주제는 '악수 이모지'였다. 사전에 후원사인 AWS, Slack, ElasticSearch의 짤막한 소개와 당사들에서 제공하는 서비스와 관련된 재미있는 교육이 있었다. | ||
def get_title_and_content_selenium(url): | ||
try: | ||
# Selenium 설정: 머리 없는(headless) 브라우저로 설정 | ||
chrome_options = Options() | ||
chrome_options.add_argument("--headless") | ||
|
||
해커톤에서 가장 중요하게 느낀 점은 해커톤은 팀원들과 함께 즐기는 행사라는 것이다. 우리 팀은 4명이었으며 모두 개인 지원으로 참가했다. 모두 고려대학교 재학생으로 KUCC 1명(나, 백엔드 개발), DevKor 1명(프론트엔드 개발자), 경영전략학회인 SBC 소속 2명(기획자)이 있었다. 팀 명단을 받고 처음에는 조금 당황스러웠다. 개발하는 데는 상당히 많은 시간이 필요하며, 개발자가 여러 명 있어도 개발을 할 수 있을까 말까 한데 개발자가 프론트, 백 각각 1명 밖에 없었기 때문이다. 하지만, 기획자가 많았기 때문에 우리 팀은 실제 서비스로 내도 괜찮을 정도의 정말 좋은 기획을 할 수 있었다. 그리고 모든 팀원들이 일주인간 진행된 사전 회의에 열심히 참여해주고, 해커톤 당시에도 각자 맡은 바를 최선을 다해서 해줘서 개발자가 많지 않아도 좋은 팀이 될 수 있다는 것을 알게 됐다. 해커톤이 시작되는 토요일 아침에 다른 팀이 공중분해돼서 YCC 소속 디자이너가 우리 팀에 합류하게 되어 좋은 디자인도 뽑아낼 수 있었다. 우리 팀은 아쉽게 수상하지 못했지만, 회의와 해커톤을 포함해서 모든 시간 동안 즐겁게 진행했다고 자부하고, 이 과정을 통해 모두가 성장할 수 있는 의미 있는 시간을 보냈다. 이 경험은 내가 나중에 진행했던 해커톤에서도 1순위는 '즐기는 것'임을 명심하도록 만들어줬다. | ||
# WebDriver 경로 설정 | ||
service = Service(ChromeDriverManager().install()) | ||
|
||
기술 스택의 선정도 매우 중요하다는 것을 느끼게 됐다. 선택한 기술 스택으로 인해 중요하지 않다고 생각한 부분에서 매우 오랜 시간이 소요되기 때문이다. 당시까지 내가 사용해 봤던 백엔드 기술 스택은 Spring Boot와 Flask 두 가지였는데, 두 스택 모두 장단점이 있었다. 나는 Spring Boot 숙련도가 떨어져서 API를 구현하는 데 매우 오래 걸리지만, GitHub Actions와 Elastic Beanstalk을 사용해 CI/CD를 구축해 본 경험이 있어 빠른 인프라 구축이 가능했었다. Flask는 스파르타코딩클럽에서 아르바이트할 때 익히 사용해서 상대적으로 빠른 개발이 가능했지만, CI/CD 파이프라인 구축에 대해서는 대략적인 흐름만 알지 실제로 해본 적은 없었다. 그래서 어떤 기술 스택을 사용할지 오랫동안 고민하다가 Flask를 사용하기로 결정했다. 그런데 웬걸, 해커톤이 시작하자마자 Flask를 사용해서 바로 배포를 진행하려고 했는데 몇 시간이나 사용한 끝에 간신히 배포할 수 있었다. 가장 중요한 초반을 개발도 아니고 배포를 통해 낭비한 것은 정말 치명적인 실수였다. 만약 과거로 돌아간다면 Flask를 사용해서 미리 배포하는 것을 반복 숙달해 가거나, CI/CD는 포기하고 수동 배포를 했을 것 같다. 지금의 나라면 어떻게 헀을까? SKYCC로부터 반년이 지난 지금의 나라면 숙련도도 매우 높고, AWS, NCP, GCP에서 CI/CD를 구축했던 FastAPI를 사용할 것이다. Flask를 선택했기 때문에 CI/CD 파이프라인을 구축하지 못한다면 ngrok을 사용해서라도 백엔드 서버를 배포했을 것 같다. 하지만 과거에 잘못된 기술 스택 선정 및 전략을 수립한 내가 있었기 때문에, FastAPI를 연마한 내가 있는 거라고 생각한다. | ||
# WebDriver 초기화 | ||
driver = webdriver.Chrome(service=service, options=chrome_options) | ||
|
||
마지막으로 느낀 것은 해커톤에서는 매우 작은 아이디어라도 확실하게 개발 가능한 것을 기획해야 한다는 것이다. 우리 팀에는 전략학회에서 실력을 갈고닦은 온 매우 출중한 능력의 기획자들이 2명 있었다. 나와 프론트 엔드 개발자는 창업과 관련해서 수업을 듣거나 예비 창업을 했던 경험을 가지고 있다. 그런데 4명 모두 해커톤을 해봤던 경험이 하나도 없었다. 그렇다 보니까 우리의 사전 회의는 해커톤 회의라기보다는 '창업을 위한 서비스 기획' 회의에 더 가까웠다. 현실 세계에서 우리가 겪었던 문제들은 나열하는 것을 시작으로, 이러한 문제를 해결하려는 기존 서비스들을 분석하고, 관련 시장도 분석하여 서비스를 기획했다. 그렇다 보니 규모가 매우 커졌다. 다들 열심히 기획에 참여해 주고 합이 잘 맞아서 아무도 기획의 규모가 커지는 것에 브레이크를 걸 생각하지 못했던 것 같다. 결국 우리는 창업 아이디어 공모전에 제출한 수준의 규모를 가지고 해커톤에 나가게 됐다. 당연히 기획했던 기능의 반의반 정도밖에 개발하지 못했고, 이마저도 완성도가 높지 못했다. 그래도 좋은 기획과 적당한 완성도를 가졌기 때문에 상위 10개 팀에 선정돼 최종 발표를 할 수 있었지만, 수상은 하지 못했다. 이후에 해커톤을 하나하나 더 참여할 때마다 기능은 최소한으로 하고 완성도를 높이는 데 신경 쓸 수 있게 됐다. 여담이지만, 합이 맞는 팀원들과 좋은 기획을 했기 때문일까. 당시에 함께 해커톤에 참여했던 팀원들 중 몇 명과 실제 창업을 해보기로 했고, 지금도 24년 초에 있을 예비 창업 패키지를 목표로 하루하루를 열심히 살고 있다. | ||
# 주어진 URL로 이동 | ||
driver.get(url) | ||
|
||
해커톤 당시에는 매우 큰 스트레스와 압박감을 가졌다. 빠르게 개발을 시작해야 하는데 CI/CD 단계에서 몇 시간을 잡아먹지를 않나, 기껏 배포했는데 API를 빨리 만들지를 못했나. 하지만, 컴퓨터와 코딩, 기획에 열정이 넘치는 사람들이 치열하게 자신의 실력을 뽐내는 장소에서, 좋은 팀원들과 하나의 목표를 향해 함께 나가는 건 정말 즐거웠다. 첫 해커톤이라 아쉬운 점도 많았다. 나는 SKYCC 해커톤 이후에도 8월에는 프롬포터 데이 서울, 11월에는 채널톡 챌린져스 해커톤 '해키토키'와 KUCC의 자체 해커톤 '쿠씨톤'에 참여했다. 이러한 경험과 프로젝트를 통해 성장한 내가 6개월 전으로 돌아갔다면 더 좋은 퍼포먼스를 보여줬겠지만, 그때의 경험이 있었기 때문에 이만큼 성장할 수 있었던 것 같다. SKYCC 해커톤을 통해 얼굴만 알던 KUCC 부원들과도 내적 친밀감과 실제 친밀감도 상승했으며, 전혀 접점이 없던 다양한 백그라운드를 가진 팀원들을 알 수 있게 됐다. 이때 기획했던 아이디어로 오늘도 '예창패'를 위해 달리는만큼, 이 해커톤을 올해의 나에게 가장 큰 영향을 줬던 것 같다. 과거의 나는 시간이 없어서, 코딩에 자신이 없어서 등과 같은 이유로 해커톤에 나가지 않았다. 하지만, 나는 이제 모두에게 말하고 싶다. 실력이 없어도 좋다. 코딩을 하지 못해도 좋다. 무언가를 할 태도와 열정, 의지만 있다면 해커톤에 무조건 나가라고. | ||
# 페이지가 완전히 로드될 때까지 기다립니다. | ||
time.sleep(5) # 실제 상황에 따라 대기 시간을 조절해야 할 수 있습니다. | ||
|
||
""" | ||
# 페이지의 제목 가져오기 | ||
title = driver.title | ||
|
||
def crawl_website(url: str): | ||
# BeautifulSoup를 사용하지 않고 Selenium으로 내용 추출 | ||
content_elements = driver.find_elements(By.TAG_NAME, 'p') | ||
content = ' '.join([element.text for element in content_elements]) | ||
|
||
# 로직 구현 | ||
title = "[KUCC] 제1회 SKYCC 해커톤 회고" | ||
print("성공적으로 웹 페이지를 가져왔습니다.") | ||
|
||
return title, content | ||
driver.quit() # 브라우저 닫기 | ||
|
||
return title, content | ||
|
||
except Exception as e: | ||
print(f"오류 발생: {e}") | ||
driver.quit() |