Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- S3
- HADOOP
- Docker
- dockerfile
- 파이썬
- 운영체제
- airflow.cfg
- linux
- 데이터베이스
- TIL
- PYTHON
- http
- 데이터엔지니어링
- 가상환경
- airflow
- TCP
- 컴퓨터네트워크
- sql
- redshift
- 자료구조
- AWS
- 데브코스
- 종류
- Go
- 컴퓨터 네트워크
- 데이터 엔지니어링
- 정리
- 데이터 웨어하우스
- Django
- 데이터 파이프라인
Archives
- Today
- Total
홍카나의 공부방
[DE 데브코스] 04.20 TIL - 좋은 코드를 작성하려면?, Selenium 본문
Data Engineering/프로그래머스 데브코스
[DE 데브코스] 04.20 TIL - 좋은 코드를 작성하려면?, Selenium
홍문관카페나무 2023. 4. 20. 17:00좋은 개발자의 시작은? (행동적인 부분)
- 긍정적인 자세
- 남과 비교하며 좌절하지 않기 <- 꼭 개발자 뿐만 아니더라도 어딜 가나 중요한 마인드라고 생각. 나는 나의 길이 있다.
- 내가 맡은 업무 혹은 문제 정의를 잘하고, 결과를 내보기
- 커리어를 길게 보자. 돌아온 시간은 무의미 하지 않다.
- (면접 시) 일방적인 답변 보다는 예의를 갖추는 선에서 나도 물어볼거 물어보기. 니들 Sales 얼마냐? 등..
좋은 개발자의 시작은? (기술적인 부분)
- 주 언어 하나는 이해도를 높이기
- 단, sequential 하게 프로그래밍 언어를 하나 쓱 배우고 넘어가지 말것.
- 이는 수학 공부하듯이 하라는 뜻이다. 선형대수학 한 번 슥 공부하면 뭐하나? 안 쓰면 까먹는다.
- 깔끔하고 읽기 쉬운 코드를 작성하며, 생산성 툴을 활용한다.
구문 및 데이터 유형 이해하기
- 많이 코딩해보자. 그러면서 고민해보자.
- 남의 코드 보고 배우면서 내 코드 리뷰도 받으면서 develop 하자.
- 오픈소스 코드 보면서 배우는 것도 좋은 방법 중 하나.
좋은 코드를 작성하려면?
- 코드는 이해하기 쉽게, 수정하기 쉽게, 명확한 이름, 일관된 형식으로. 모르면 ChatGPT에게 물어보기도 해라.
- 클래스와 함수는 분명한 하나의 일을 하도록 구현해야 한다.
- 코드는 모듈화되어야 하며 중복을 피해야 한다.
- 코드는 작성자가 아닌 사용자를 염두하여 설계해야 한다.( 특히 API나 라이브러리를 만들 때 )
- 단, 중요한 일을 더욱 완벽하게!
코드 작성 원칙 DRY - Don't Repeat Yourself
- 같은 코드를 여러 번 중복하여 작성하지 말라. 한 번 작성하여 재사용할 수 있게 해라.
- 함수로 만들거나, 반복을 루프로 바꾸거나, 클래스 계승 구조를 생각해보기.
코드 작성 원칙 KISS - Keep in Simple, Stupid
- 하나의 함수는 하나의 일만
- 코드를 가능한 한 단순하게 만들어서 읽기 쉽고 이해하기 쉽게 만들어라.
일관된 포맷 및 이름 명명 규칙
- 개인적으로 혹은 팀 내에서 이름 명명 규칙을 정하고 진행한다.
- 함수 이름, 변수 이름, 파일 이름은 이해하기 쉽고 약어를 피하는게 좋다.
- ex) module_name, variable_name, function_name처럼 Snake case 방식으로 해주는 것이 좋다.
- ex2) ClassName, ExceptionName 처럼 클래스나 익셉션 이름은 Camel case로 해주는 것이 좋다.
- ex3) GLOBAL_CONSTANT 처럼 값이 변하지 않는 전역 상수 등은 Upper case로 해주는 것이 좋다.
- ex4) boolean type 이라면 is_valid 처럼 변수 앞에 is를 붙여주는게 좋다.
- 구글의 파이썬 스타일링 가이드에서 이렇게 한다는 것이지, 절대적으로 옳은 것은 아니다.
- 모르면 chatGPT에게 물어본다.
ex) Google Python Styling Guide에 맞춰서 오늘의 스타벅스 주식의 종가에 해당하는 변수 이름을 짓고 싶어.
코드 리뷰
- 주니어 개발자나 신규 개발자를 훈련시키는 최선의 방법이라고 한다.
- 코드 리뷰는 되도록 조금씩 자주 요청하자. 원기옥 모아서 "코드 리뷰 해주세요!!!"하면 원기옥을 그대로 맞아서 코드 리뷰에 어려움을 겪으실 수 있다.
- 코드 리뷰 요청시 : 주석을 최대한 추가하고, 무슨 이유에서 뭘 하려고 하는지 설명한다.
- 코드 리뷰 요청시 : 리뷰에 대한 피드백을 너무 감정적으로 받아들이지 않는다.
- 코드 리뷰 해줄 때 : "코드를 이렇게 밖에 못짜요?" 등의 감정을 건드리는 언행은 삐-
구글 코드 리뷰 사례
- 코드 리뷰어는 1명이면 충분하다.
- 코딩 스타일의 경우 오리지널 코드의 스타일을 따라가는게 좋다.
- 코드 리뷰어가 꼭 시니어 레벨이거나 상급자일 필요는 없다. 주니어라도 코드 리뷰어로 교육을 받으면 활동 가능
- 코드 리뷰는 가볍고 빠르게 하는 작업이다. (그럴러면 코드 리뷰 양이 원기옥이 아니라 에네르기파 정도가 되어야 함)
def compute_average(numbers):
sum = 0
for n in numbers:
sum += n
return sum/len(numbers)
# 이런 함수가 있다고 치자.
# 1. 코드 리뷰를 하기 전에 함수에 대한 docstring이 필요하다. """파라미터, 리턴값 설명"""
# 2. numpy를 쓴다면 mean이라는 메소드를 쓰는게 낫다.
# 3. numbers가 0이라면 error가 발생하는 코드다. error 처리에 대한 발생 부분이 빠져있다.
# try catch로 잡던가.. if로 잡던가.. 등등
테스트의 종류
- Unit Test는 모듈의 특정 기능(함수)을 테스트하는 것이다. 보통 하나의 함수를 테스트한다.
- Integration Test는 여러 모듈을 통합하여 하는 상위 단계의 테스트다.
- Acceptance Test는 트래픽을 만들어 시스템에 로드를 주고 견디는지 확인하는 테스트다.
Selenium
- 아래 코드들로 모든 설명을 대체한다.
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 브라우저 자동 꺼짐 방지 옵션
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# with - as를 사용한 실행 및 종료
# with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
# driver.get("https://www.naver.com")
# print(driver.find_element(By.TAG_NAME, "p"))
# Implicit Wait : 지정한 시간 동안 기다림
# Explicit Wait : 특정 요소에 대한 제약을 이용한 기다림
# Xpath(Path of XML)를 이용하면 위치를 활용하여 스크래핑이 가능함.
driver = webdriver.Chrome(service=Service(
ChromeDriverManager().install()), options=chrome_options)
driver.get("https://indistreet.com/live?sortOption=startDate%3ADESC")
# 완전한 응답이 왔다 싶으면 바로 다음 명령으로
driver.implicitly_wait(7)
# get을 한 다음에 특정 요소를 바로 찾으면 element를 찾을 수 없음.
print(driver.find_element(By.XPATH,
'//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text)
driver.implicitly_wait(7)
print(driver.find_element(By.XPATH,
'//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[2]/div/a/div[2]/p[1]').text)
# Explict Wait:
print(WebDriverWait(driver, 10).until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[2]/div/a/div[2]/p[1]'))).text)
# 반복문을 이용해서 여러 개의 요소를 스크래핑하는 코드도 작성할 수 있다.
# 보통 대기 코드 등이 없으면 자동으로 종료함.
time.sleep(60)
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains as AC
from selenium.webdriver import Keys
# 부트텐트 사이트의 로그인 버튼을 셀레니움을 통해 클릭하는 코드
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 접속 후 로그인 버튼 클릭까지 과정
driver = webdriver.Chrome(service=Service(
ChromeDriverManager().install()), options=chrome_options)
driver.get("https://boottent.sayun.studio/")
driver.implicitly_wait(5)
login_button = driver.find_element(
By.CLASS_NAME, 'ant-btn.btn-small')
AC(driver).click(login_button).perform()
# 카카오 로그인 버튼 클릭 과정
time.sleep(1) # 버튼 클릭 까지 대기
AC(driver).click(driver.find_element(
By.CLASS_NAME, "ant-btn.ant-btn-lg.btn-kakao")).perform()
# 카카오 로그인 email,pw 입력하는 과정
driver.implicitly_wait(3)
email_input = driver.find_element(By.ID, "loginKey--1")
AC(driver).send_keys_to_element(email_input, "yourID").perform()
time.sleep(0.8)
password_input = driver.find_element(By.ID, "password--2")
AC(driver).send_keys_to_element(password_input, "1234").perform()
time.sleep(0.8)
login_button_kakao = driver.find_element(
By.CLASS_NAME, "btn_g.highlight.submit")
AC(driver).click(login_button_kakao).perform()
오늘 공부하며 어려웠던 내용
- 딱히 없었다.
반응형
'Data Engineering > 프로그래머스 데브코스' 카테고리의 다른 글
[DE 데브코스] 04.24 TIL - Django 기초 (0) | 2023.04.24 |
---|---|
[DE 데브코스] 04.21 TIL - 야구 잘하는 팀 시각화, Seaborn, WordCloud (0) | 2023.04.21 |
[DE 데브코스] 04.19 TIL - Beautifulsoup, Locater, 알고리즘 문제 (0) | 2023.04.19 |
[DE 데브코스] 04.18 TIL - 웹 스크래핑을 위한 HTTP 기초 (0) | 2023.04.18 |
[DE 데브코스] 04.17 TIL - HTML (0) | 2023.04.17 |