홍카나의 공부방

[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()

 


 

오늘 공부하며 어려웠던 내용

  • 딱히 없었다.
반응형