일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mock api 사용법
- ScrollView 무한 스크롤
- 리액트 테스트
- 첫 코딩
- nest.js 순환 종속성
- Testing-library/react
- 첫코딩
- 리액트 테스트 코드
- react native 무한스크롤
- react
- TodoList 테스트 코드
- 비동기 테스트
- react jest
- javascript 테스트
- FlatList 무한 스크롤
- react 테스트
- nest.js 순환 참조
- React 테스트코드
- mock api를 이용한 react 테스트
- nest.js circular Dependency
- 프로젝트 배포하기
- 개발
- nest.js forwardRef
- react testing library 비동기 테스트 사용법
- JavaScript
- jest
- React Testing Library
- HTML
- TDD방식으로 리액트 테스팅
- CSS
- Today
- Total
성장을 위한 기록
3주차 내용 요약 본문
Python
파이썬은 매우 직관적인 언어이다. 그리고 요즘 인기많은 언어이다. (인기도는 1위지만 사용자 수는 1위는 아니다)
인기 많은 이유는 쉽고 빠르게 개발이 가능하다는 점에있다. 그리고 활용성이 넓다. 웹도 만들 수 있고 크롤링 db등 다양한 곳에서 활용이 가능하고 간단한 게임도 만들 수 있다. 몇몇 대기업도 python을 기반으로 운영한다.
다만 문서 전체를 기계어로 변경하는게 아닌 한 줄씩 진행하다보니 처리속도가 느리다. 그러기 때문에 3D 고사양 게임에서는 적합하지 않다.
파이썬은 js와 동일하게 변수, 자료형, 함수, 조건문, 반복문 등이 있다.
변수
js와 다르게 python은 변수를 선언하는 방식이 없다.
js는 var, let, const라는 선언 방식이 있었지만, python에 경우 선언방식 없이 변수 = 할당할 값으로 작성한다.
마찬가지로 어떤 타입에 형태를 입력 할 지 선언하지 않아도 된다.
js에서는 변수에 중복을 막기 위해 let과 const가 있지만, 파이썬에서는 별다른 선언 방식이 없기 때문에, 값이 변경 될 수 있으니 주의해야한다.
또한 js와 동일하게 +,-,*,/,% 등 기본 연산이 가능하다.
num1 = 2
num2 = 4
a = num1 + num2 // 6
자료형
js와 동일하게 숫자, 문자형, 리스트, 딕셔너리 등이 있다.
딕셔너리는 key와 value값을 갖는다.
people = {'name': 'bob', 'age': 20}
여기서에 js와 차이점이 있다. 작성방식에서 약간의 차이가 있는데
// js
people = {'name': 'bob', 'age': 20}
people = {name: 'bob', age: 20}
//python
people = {'name': 'bob', 'age': 20}
JS에서는 key값을 문자열로 작성해도 되고, ''없이 작성해도 정상 작동한다. 유연성이 크다.
반면에 파이썬에 경우 문자열로 표시해야만 정상 작동한다. 문자열 ("")표시가 없다면 변수로 판단하고 변수가 선언되지 않았다면 해당 코드는 오류를 일으킨다.
또한 key값으로 불러올 때 표현 방식이 정해져 있다.
people = {'name': 'bob', 'age': 20}
//js
people.name
people['name']
//python
people['name']
JS에서는 키 값을 통해 불러올 때 괄호[]와 점(.)을 통해서 불러 올 수 있지만,
파이썬에 경우에는 괄호를 통해서만 불러 올 수 있다.
python 문단(?) 구분
함수를 보기 이전에 파이썬은 들여쓰기가 매우 중요하다. 이 부분은 조건문, 반복문을 포함하여 여러 문법에서 지켜야 하는 부분이다.
JS코드를 보면 함수, 조건문, 반복문 등을 {}로 표시하여 구분을 짓는다.
파이썬은 더 직관적으로 들여쓰기로 구분을 한다.
//js
function f(){
console.log("hello")
}
console.log('end')
//python
def f():
print('hello')
print('end')
파이썬 코드를 보면 구역의 시작을 :로 시작하고 그 이후 들여쓰기 된 부분은 포함된다. (들여쓰기 2번은 안된다)
들여쓰기가 기준인 만큼 시작을 들여쓰기로 하거나 해야하는 부분을 하지 않는다면 예상과 다른 결과가 나올 수 있다.
함수
위 코드를 보면 알 수 있듯이. 약간의 차이만 있을 뿐 흐름은 비슷하다.
함수는 명령을 실행하는 것 뿐이기 때문에 따로 값을 주지 않는다면 반환하는 값은 없다.
따로 값을 주기 위해서는 return을 사용하여 해당 함수가 반환할 수 있는 무언가를 선언해야 한다.
1주차 요약 참고
def f(x):
return 2*x+3
조건문
파이썬은 직관적인 언어라 말 할 수 있다. 그래서 JS 함수보다 직관적으로 모습만 변할 뿐 구조적인 흐름은 비슷하다.
def oddeven(num):
if num % 2 == 0:
return True
else:
return False
if else 구조를 갖는다. {}로 묶었던 js 반면에 파이썬에 경우 :와 들여쓰기로 구분을 짓고 있다.
조건이 true일 경우 앞에 명령을 수행하고 false일 경우 else 다음에 명령을 수행한다.
반복문
우리가 반복문을 사용할 때 리스트는 항상 동반된다. (아닌 경우도 있지만)
파이썬은 이를 더 직관적으로 보기 위해 그리고 반목문은 리스트를 동반하기 때문에 둘을 묶었다.
기본 구조는 다음과 같다.
fruits = ['사과','배','감','귤']
//python
for fruit in fruits:
print(fruit)
//js
for(let i = 0 ; i < fruits.length ; i++){
document.write(fruits[i])
}
//or
fruits.forEach(function(fruit){
document.write(fruit)
})
위 코드와 같이 파이썬 반복문은 for in구문을 사용한다. fruits라는 리스트를 반복하여 각각 fruit라는 변수에 담는 것이다. js코드에 fruits[i]가 파이썬 fruit와 동일하게 사용된 것이다. i라는 인덱스 번호로 반복을 했다면 파이썬은 리스트를 사용한다는 전제를 두고 조건 코드가 생략된 것이다.
굳이 비슷한 걸 찾자면 js코드에서 forEach매서드와 유사하다.
패키지
우선 python으로 프로젝트를 폴더 만들면 파일 내에 venv폴더가 생긴다. 이 폴더의 역할은 가상 환경이라 볼 수 있다.
가상 환경이란 하나의 PC에서 프로젝트 별로 독립된 실행 환경을 사용할 수 있도록 한다.
없다면 ?
하나의 프로젝트만 진행한다면 큰 의미는 없겠지만, 끝나고 다른 프로젝트를 진행하기도 하고, 진행하는 와중에 전 프로젝트 수정 등 우리는 하나의 PC에 여러 프로젝트를 진행하게 된다. 만일 프로젝트 별로 사용하는 패키지가 다를경우 우리는 여러 패키지를 설치하고, 프로젝트에 필요없는 패키지도 가지고 있게 된다.
단순히 용량만 부족하다면 문제될 것은 없겠지만, 이 패키지가 버전이나 다른 이유로 서로 충돌을 할 수 있다.
만약 가상 환경이라는 개념이 없다면 우리는 프로젝트마다 삭제하고 다시 설치하는 방법을 택해야 할 것이다.
따라서 가상 환경이란 프로젝트마다 패키지를 설치 할 수 있고, 다른 프로젝트로 넘어가면 그 환경에서 설치된 패키지를 사용하는 것이라 할 수 있다.
그리고 고정적으로 venv라는 이름으로 생성된다. 꼭 이름이 venv일 필요는 없지만, 대부분의 프로젝트들이 따르는 관행이기 때문에 바꾸지 않는 것이 좋다.
그렇다면 패키지란 무엇일까
패키지는 일종의 기능들을 묶은 모듈을 모아 놓은 단위이다. 어떻게보면 라이브러리 라고 볼 수 있다.
1. requests
프로젝트를 하다보면 open API값을 가져와 처리하는 경우가 생길 수 있다. 이때 requests 패키지가 필요하다.
js에서는 CDN값을 가져와 입력만 했지만, 파이썬에서는 패키지를 설치하고 문서에 import를 해야한다.
기본 구조
import requests # requests 라이브러리 설치 필요
r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()
변수 r에 URL에서 보내준 데이터를 요청하고 받아 할당한다. 그리고 그 데이터의 json형식으로 또 다시 변수에 할당한다.
이후에는 딕셔너리에서 키값을 통해 값을 가져오는 방법을 이용해 json 데이터를 이용할 수 있다.(rjson["RealtimeCityAir"])
JS에서 보면 Ajax를 GET 방식으로 사용하는 것과 동일 하다.
2. beautifulsoup4
앞서 언급한 requests패키지를 통해 웹페이지 html을 가져오는 것은 가능하다. 하지만 이렇게 가져온 html은 파이썬의 문자열 객체를 반환할 뿐이기 때문에 파이썬이 이해할 수 있는 객체 구조를 만들어주지 못한다.
따라서 우리는 html을 가져와 원하는 정보를 추출하기 위해서는 beautifulsoup4 (bs4) 패키지를 사용해야한다.
크롤링을 하기 위해 필요한 패키지이며. 크롤링은 웹스크래핑이라고도 부르며 다른 웹페이지에 html코드를 가져올 수 있다.
크롤링을 이용하면 네이버 영화정보 페이지에서 해당 영화 포스터, 별점, 제목 등을 가져올 수도 있고, 검색결과 URL을 가져올 수도 있다. 쉽게 말해 웹페이지 html을 그대로 가져와서 필요한 속성이나 요소 등을 가져 올 수 있는 것이다.
기본 구조
import requests
from bs4 import BeautifulSoup
# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')
# (입맛에 맞게 코딩)
headers변수에 의미를 정확히 파악하진 못했으나 headers=headers는 html에 접근하는 과정에서 코드에서 콜을 날리는 것이 아닌 브라우저 즉 사람이 날린 것처럼 하기 위해 작성됐다고 한다.
data는 작성한 URL에서 HTTP GET Request과정을 거치게 되는 것이다. (이 자체가 사용할 수 있는 html이 아니다.)
soup변수에 html을 저장할 것이다. BeautifulSoup() 라이브러리를 사용했고 첫 번째 인자인 data.text는 html소스 코드를 받는다. 즉 data는 과정이고 data.text를 해야 html소스 코드가 된다. 두 번째 인자인 'html.parser'은 어떤 parser를 이용할 지 명시하며 여기서는 파이썬 내장인 html.parser를 사용했다. (다른 걸로는 lxml.parser도 있다)
html가져오기 이후 원하는 html을 가져오는 방법
html에서 원하는 값을 가져오기 위해서는 select 혹은 select_one을 사용해야한다.
# 선택자를 사용하는 방법 (copy selector)
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디명')
soup.select('상위태그명 > 하위태그명 > 하위태그명')
soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
# 태그와 속성값으로 찾는 방법
soup.select('태그명[속성="값"]')
# 한 개만 가져오고 싶은 경우
soup.select_one('위와 동일')
태그명, 클래스명, 아이디명을 통해 찾을 수 있고 우리는 3주차에서 태그명을 통해 찾았다.
select 와 select_one은 차이가 있는데 이름에서 알 수 있듯이 select는 해당되는 모든 값을 찾을 수 있다. 따라서 리스트 형태로 반환하게 되고, select_one은 한 개만 찾기 때문에 태그 자체를 가져올 수 있다.
최종적으로 가져온 html코드를 사용하기 위해서는 select_one을 통해 태그 자체를 가져오거나, 인덱스를 이용해서 리스트 안에 요소를 꺼내와야한다.
3. dnspython, pymongo
DB를 이용하기 위한 패키지. 다음 DB에서 추가 요약
DB
데이터베이스는 일반적으로 컴퓨터 시스템에 전자적으로 저장되는 구조화된 정보 또는 데이터의 조직화된 모음입니다.
따라서 데이터베이스는 필요한 데이터를 구조 조직화 하여 잘 정리한 후 필요할 때 빠르게 원하는 데이터를 가져와 사용할 수 있다고 볼 수 있을 것 같다.
DB는 크게 SQL과 NoSQL(Not only SQL)이 있다. (더 많이 있지만)
SQL은 엑셀처럼 행/열이 정해진 칸에 데이터를 저장한다. 저장된 데이터가 정형화되어 있기 때문에 분석이나 일관성 부분에서 용이하다. 단, 정해진 칸을 늘릴 때에는 어려움이 있다.
NoSQL은 SQL과 반대의 성향을 갖는다. 딕셔너리 형태로 순서대로 저장하는 방식이다보니 데이터를 쌓는 부분에서는 유리한 대신 정해진 칸이 없다보니 일관성 부분에서 부족함이 있다.
DB는 프로그램이다. 우리가 여러 프로그램을 설치하듯이 DB도 설치하여 사용했다. 그리고 오늘날에는 DB를 Cloud형태로 제공해주는 플랫폼이 많이 생겨나고 있다. Cloud 환경을 이용하면 백업이나 모니터링 부분에서 유리함을 갖을 수 있다.
mongodb Atlas - mongodb에서 제공하는 클라우드
mongodb를 파이썬에서 사용하기 위해서는 dnspython과 mongodb라는 패키지가 필요하다.
사용방법
우선 mongodb 사이트에서 로그인 후 데이터베이스를 만들어야한다. (만들 때 접속할 수 있는 id와 password값을 기억해야한다) 데이터베이스를 만들었다면 파이썬에서 사용할 수 있도록 연결을 해야한다. 이때 자신이 이용할 언어와 버전을 선택하고 url을 복사해오면된다.
기본 구조
from pymongo import MongoClient
client = MongoClient('여기에 URL 입력')
db = client.dbsparta
여기서 URL은 mongodb 사이트에서 connect을 할 때 준 URL 정보를 입력한다. 그리고 db라는 변수에 할당을 하게된다. client는 위 URL을 가져오고 .dbsparta는 데이터 베이스에 폴더(?)이름이다. 즉 dbsparta로 작성하면 데이터베이스에 dbsparta라는 카테고리(?)가 생기고 이 안에 데이터를 담는다는 의미가 되고, 만약 이름을 바꾼다면 그 이름의 카테고리에 데이터를 저장할 수 있다(카테고리가 없다면 새로 만들어진다)
실제 사용 코드
from pymongo import MongoClient
client = MongoClient('mongodb+srv://test:(password)@Cluster0.faljs.mongodb.net/(name)?retryWrites=true&w=majority')
db = client.dbspa
doc = {
'name':'bob',
'age':11
}
db.id.insert_one(doc)
기본 구조에서 URL을 입력하고 데이터를 하나 넣어봤다. URL에서 connect할 때 저장한 password를 작성하고(id는 자동으로 입력되어 있다 왼쪽 test가 id) (name)대신에 자신의 데이터베이스 이름을 입력하면 된다. 처음엔 first...이렇게 작성되어 있는데 나는 첫번째 db이기도하고 하나밖에 없어서 사용하는데 문제는 없었지만, 입력하는 습관을 들여놓으면 좋을 것 같다.
나만의 정리를 해보자면 코드를 복사해서 사용하지만 URL이 맞는지( 비밀번호, 이름 확인) db에 카테고리를 내가 저장하고 가져올 곳으로 잘 작성했는지, 데이터에 접근할 때 콜렉션( 위 코드에 .id. 부분) 이름이 맞는지 확인하고 필요한 상황에 맞게 코드를 작성하면 된다.
데이터를 조작하는 방법
# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)
# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})
# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({'name':'bobby'},{'_id':False}))
# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})
# 지우기 - 예시
db.users.delete_one({'name':'bobby'})
위 방법을 통해 데이터를 조작 할 수 있다.
코드에 db.users가 반복되는데 db는 앞선 코드에서 우리가 접근하는 mongodb를 할당한 값이고 users는 콜렉션이다.
앞선 코드에 dbspa가 카테고리라면 users는 소분류라고 할 수 있겠다. (콜렉션이라 부른다) db.movies.inser_one(doc)이렇게 작성하면 dbspa라는 카테고리 안에 있는 movies라는 소제목 안에 doc에 할당된 데이터를 넣겠다는 의미이다.
그리고 모든 값에 'name':'bobby'를 작성했다. 이 부분이 찾는 데이터의 조건이 되는 것이다. 따라서 'name':'bobby'가 들어간 데이터를 선택 할 수 있는 것이다.
여러개 찾기 코드를 보면 {'_id':False}코드가 있는데 이 코드의 의미는 조건의 맞는(조건이 빈칸이면 모든 데이터) 데이터를 리스트로 받을 것인데 _id값은 빼고 달라는 의미이다.(데이터를 저장하면 자동으로_id값도 저장된다.)
또한 조건에 콤마(,)를 통해 구체적인 조건을 설정 할 수있고, or, and 쿼리 그리고 이상, 이하, 시작하는 단어, 내림차순 등 조건 {} 다음 ,{}에 작성하여 원하는 리스트를 받아 올 수 있다.
개인적으로 헷갈릴 수 있다고 생각하는 부분인데 첫 번째 {}의 값은 데이터를 찾을 조건이라 말했다.
즉 find로 찾을 때 조건만이 아니고 그 조건을 가지고 있는 데이터(딕셔너리 형태)자체를 찾는 것이며,
update_one을 이용하면 해당 조건을 가지고 있는 데이터에서 'age'를 key로 가지고있는 value의 값을 19로 변경한다는 의미이다.( 'name':'bob'을 'age'로 변경하는게 아니다)
지우기도 마찬가지로 딕셔너리 중에서 조건에 사용한 key, value를 삭제하는게 아닌 해당 조건을 포함한 딕셔너리 자체를 지운다.
'개발 일기 및 회고 > 회고' 카테고리의 다른 글
WIL 0516~0521 2주차 회고 (0) | 2022.05.22 |
---|---|
WIL 0509~0515 1주차 (0) | 2022.05.15 |
항해99 사전강의 5주차 회고 (0) | 2022.04.04 |
항해99 사전강의 4주차 회고 (0) | 2022.04.03 |
항해 99 사전강의 3주차 회고 파이썬, mongodb (0) | 2022.04.02 |