21.09.14 두 번째 TIL

서태욱·2021년 9월 14일
0

"Done is better than perfect"

누군가는 이런걸 완벽주의 성향이라고도 하던데,
나는 뭔가 계획한대로 시작하지 못하면 그냥 아예 놓아버리는 경향이 있었다.
'원래 7시에 일어나 시작하려 했는데.. 어차피 늦잠 자버린거 잠이나 자자'와 같은 아주 위험한..
그런 나에게 커다란 인식의 전환을 가져다준 문구다. 수험생활 내내 붙들고 살았다. 확실히 도움이 된다. 완벽하기보다는 꾸준하게 무언가를 하는 하루가 되자! 😄


🖊📘오늘 배운 것

<3주차>

파이썬

파이썬은 캠프 과정 시작하기 전 조금 건들어본 적이 있어서 그런지
친숙한 느낌이 들었다. 기초 문법으로 기본적인 연산 방법이랑 함수, 자바스크립트에서도 배운 조건문과 반복문을 활용해서 연습했다.

DB

데이터베이스를 공부하는 이유? 데이터를 잘 갖다 쓰려고! 마치 책장에 잘 정리해서 나중에 꺼내볼 수 있도록 하는 것.

DB의 두 종류
SQL: 엑셀에 가까운 느낌. 칸을 나누고 정함
정형화된 데이터 분석에 용이
(MS-SQL, My-SQL)

NoSQL: Dictionary형태와 가까움.
자유롭지만 일관성은 떨어짐 (MongoDB)

우리가 사용하는 것은 pymongo!
insert

doc = {'name':'bobby','age':21} #이렇게 dictionary를 만들어주고,
db.users.insert_one(doc)

find

same_ages = list(db.users.find({'age':21},{'_id':False}))
#{'age':21} 이 부분이 find 해야 할 "조건"이 된다. {'_id':False} 이건 Robo 3T에서 나타나는 _id 부분을 나타내지 말라는 의미.

{'_id':False}로 빨간 박스 부분을 없애주었다.😃

update

db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

delete

db.users.delete_one({'name':'bobby'})

(delete는 많이 쓰지는 않는다고 한다.)

  • 한걸음 더

    update를 이용해서 숫자값을 바꾸다보면 Robo 3T에서 위의 빨간 원과 같이 숫자 앞 버튼이 다른 데이터와 다르게 찍히는 것을 알 수 있다.
{'$set':{'star':0}}
#{'$set':{'star':'0'}}

다른 숫자 데이터는 문자열인데 비해 바꾼 매트릭스의 별점은 숫자이기 때문에 발생하는 문제. 0을 ''안에 집어 넣어 주면

이제 다른 데이터와 같게 되었다. 이런 디테일들을 놓치지 않고 잘 갈무리 하는 것이 통일성과 작업의 효율을 위해서 무척 중요하다고 느꼈다.


과제

원래 1,2주차는 과제 하지 않고 그냥 넘겼었는데 3주차는 쉬워보여서(?) 한번 도전해 보기로 했다.

과제는 지니뮤직 홈페이지에 있는 특정일자 1~50위 곡의 순위, 제목, 가수 이렇게 세가지 항목을 크롤링(스크래핑)하는 것.

연습하면서 네이버 영화 가지고 연습해 본 적이 있어서 초기 코드 세팅은 어렵지 않았고, 필요한 부분의 경로를 찾아서 적절하게 코드 안에 넣어주는 일도 괜찮았다.

난관은 불러온 데이터값에 있는 각종 여백이나 불필요한 부분들을 없애는 것이었는데...
강사님이 strip()코드를 적절히 구글링해서 적용시켜보라고 힌트를 주셨기 때문에 곧바로 실행에 돌입.

다른 건 문제가 없었는데 순위를 불러오는 과정에서 '0위 상승'이라는 문구가 같이 찍히는 것이었다...
이건 그냥 단순히 여백을 없애는 strip()으로는 해결 불가.

여기서 왜 '구글링'을 잘 해야 한다는 것인지를 깨달았다. "파이썬 특정 문자 선택"이라고 검색하니까 '슬라이싱'이라는 마치 요리법이 생각나는 [1:3]과 같은 형태의 코드를 알 수 있었다. 근데 또 문자의 배열 순서인 줄 알았더니 문자 앞에서부터 간격 부분을 카운팅 한다는 것에 놀라버림..

어쨌든 무사히 숙제를 마칠 수 있게 되어 기뻤다.

for tr in trs:
    number = tr.select_one('td.number').text[0:2].strip()
    title = tr.select_one('td.info > a.title.ellipsis').text.strip()
    gasu = tr.select_one('td.info > a.artist.ellipsis').text
    print(number, title, gasu)

문제의 strip() 부분


<4주차>

4주차는 Flask 패키지를 파이썬에 설치하고 시작했다. 서버를 만들었을 때 구동하기 편하도록 코드를 모아둔 것이라고 이해하면 된다.

API(Application Programming Interface)는 일종의 은행창구와 같다고 한다.

구현하는 방식은 가지가지나, 여기서 우리가 다루는건 GET과 POST. GET은 주로 데이터를 조회하고 POST는 생성, 변경, 삭제에 쓴다.

모두의 책리뷰

POST 이용하기
오늘 들은 부분까지는 POST를 이용해서 책 리뷰를 작성, 제출하면 서버로 넘기는 기능을 구현해 보았다.
사실 '구현'이라는 단어를 사용하기도 민망한데, 대부분 주어진 뼈대를 가지고 몇 가지만 바꾸는 것이기 때문이다. 그렇게 하는 것도 제대로 잘 안되었는지 리뷰 작성하기 버튼을 눌렀을 때 alert로 msg를 띄우는 기능이 작동하지 않았다.
아무리 구석구석 뜯어봐도 어디가 잘못된 것인지 알 수 없어 그냥 전부 지우고 처음부터 다시 차근차근 작성 해 나갔다.
마음같아서는 끝까지 물고 늘어져서 어느 부분을 잘못해서 그런 결과가 나온 것인지를 알아내고 싶었지만.. 마음엔 원이로되 육신이 약하도다!

이번에는 다행히 잘 작동하는 것을 확인 할 수 있었다.

def write_review():
    title_receive = request.form['title_give']
    author_receive = request.form['author_give']
    review_receive = request.form['review_give']

    doc = {
        'title':title_receive,
        'author':author_receive,
        'review':review_receive
    }
    db.bookreview.insert_one(doc)

    return jsonify({'msg': '저장 완료!'})
    #문제가 된 것 같은 부분. 이건 새로 작성해본 것이고 이전 것은 따로 어디 적어두질 못해 비교를 못하는 게 아쉽다.

GET 이용하기
이번에는 실제로 리뷰를 작성하는 경우 그 데이터를 페이지에 반영해서 보여주는 역할을 하는 GET을 이용해 보았다.

function showReview() {
            $.ajax({
                type: "GET",
                url: "/review",
                data: {},
                success: function (response) {
                    let reviews = response['all_reviews']
                    for (let i = 0; i < reviews.length; i++) {
                        let title = reviews[i]['title']
                        let author = reviews[i]['author']
                        let review = reviews[i]['review']

                        let temp_html = `<tr>
                                        <td>${title}</td>
                                        <td>${author}</td>
                                        <td>${review}</td>
                                       </tr>`
                        $('#reviews-box').append(temp_html)
                    }
                }
            })
        }

아직도 익숙하지 않아서 코드를 보고 있으면 눈이 팽팽 돈다. 다만 색으로 구분지어주고 있어서 천천히 생각하면 이제 어디까지 그 코드의 영역인지 정도는 어렴풋이 파악이 가능한 것 같다. for문은 칠때마다 오타가 넘쳐나고.. 영타 연습도 해야 하는데 강의 듣고 따라해 보는 것만 해도 시간 없음여기서도 temp_html 지정할 때 $를 빼먹어서 한참을 들여다 보아야 했다.


❓의문점

  • Process finished with exit code 0
    강의를 따라가다가 코드를 제대로 작성했는데 실행하니 위와 같은 문구가 떴다. 찾아보니 정상 작동한 것이라는데, 결과 값은 나오지를 않아서 강의를 따라가기 애매해졌다.

    -> 오타문제였다. (아주 사소하고 간단한 오류인데 나는 발견하지 못한 것을 슬랙을 통해서 캠프 사람들에게 물어보아 해결했다. 커뮤니케이션이 왜 중요하다고 하는지 알 것 같았고, 나도 다른 사람들의 질문을 해결해주고 싶다는 생각도 했다.)
    근데 오타를 쳤는데도 왜 정상작동이라는 코드 0이 떴을까?

총평

캠프 시작하면서 체력 유지 하려고 아침 운동도 다시 시작했고, 최대한 스트레칭 하면서 하려고 하는데도 솔직히 힘들다. 내용도 어려워서 따라가기 벅차긴 하지만, 직접 타이핑한 무언가로 뚝딱 유용한 기능들이 만들어지고 사람들이 실제로 그걸 사용해 볼 수도 있게 된다는 것이 신기하다.

☑해야할 일

  • 코드 단순 타이핑 지양하고 흐름이 어떻게 이어져서 그 기능이 발현되는 것인지를 이해하려고 노력하기
  • 영타 타이핑 연습
profile
re:START

0개의 댓글