가수면

서버 성능? 본문

일지

서버 성능?

니비앙 2022. 11. 6. 01:24

토이 프로젝트 도중 현재 상영작을 포스트 하는 방식에서 문제가 생겼다.

데이터를 크롤링해서 저장하는 과정에서 mongo DB에 순서대로가 아닌 랜덤으로 저장되는 문제가 발생했고, 이를 가져오다 보니 순서가 뒤죽박죽으로 섞여서 출력되는 상황으로 이어졌다.

때문에 페이지를 열 때마다 아예 출력이 안 되거나, 새로고침할 때마다 순서가 달라지는 문제도 있었다.

 

문제 해결 과정

1. 원인 찾기

이를 해결해보기 위해 먼저 팀원이 적어놓은 코드가 정상적인 코드인지를 확인해보기로 했다.

기본 세팅 코드들만 남긴 뒤 돌려보니 정상 작동되는 것을 확인했다.

그러나 다시 

@app.route('/')
def home():
    return render_template('index.html')
    .
    .
    [POST]
    .
    .
    [GET]
    .
    .
    if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

의 형식을 취하는 순간 먹통이 되어버리며 정상으로 작동됐던 코드가 DB에 뒤죽박죽으로 저장되기 시작했다.

 

2. 코드의 효율성

코드가 복잡해 불러오는 속도의 문제가 아닐까 가정해봤다.

해서 팀원이 아래처럼 짜 놓은 아래 코드를,

title_temp = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(2) > li:nth-child(number) > div.box-contents > a > strong'
rank_temp = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(2) > li:nth-child(number) > div.box-image > strong'
rate_temp = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(2) > li:nth-child(number) > div.box-contents > div > strong'
image_temp = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(2) > li:nth-child(number) > div.box-image > a > span > img'

for i in range(1, 4):
    title_tag = title_temp.replace('number', str(i))
    rank_tag = rank_temp.replace('number', str(i))
    rate_tag = rate_temp.replace('number', str(i))
    image_tag = image_temp.replace('number', str(i))

    titles = soup.select_one(title_tag).text
    ranks = soup.select_one(rank_tag).text
    rates = soup.select_one(rate_tag).text
    images = soup.select_one(image_tag)['src']

    doc = {
        'title': titles,
        'rank': ranks,
        'rate': rates,
        'image': images
    }
    db.movies.insert_one(doc)

title_temp2 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(3) > li:nth-child(number) > div.box-contents > a > strong'
rank_temp2 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(3) > li:nth-child(number) > div.box-image > strong'
rate_temp2 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(3) > li:nth-child(number) > div.box-contents > div > strong'
image_temp2 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(3) > li:nth-child(number) > div.box-image > a > span > img'

for i in range(1, 5):
    title_tag2 = title_temp2.replace('number', str(i))
    rank_tag2 = rank_temp2.replace('number', str(i))
    rate_tag2 = rate_temp2.replace('number', str(i))
    image_tag2 = image_temp2.replace('number', str(i))

    titles2 = soup.select_one(title_tag2).text
    ranks2 = soup.select_one(rank_tag2).text
    rates2 = soup.select_one(rate_tag2).text
    images2 = soup.select_one(image_tag2)['src']

    doc = {
        'title': titles2,
        'rank': ranks2,
        'rate': rates2,
        'image': images2
    }
    db.movies.insert_one(doc)

title_temp3 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol.list-more > li:nth-child(number) > div.box-contents > a > strong'
rank_temp3 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol.list-more > li:nth-child(number) > div.box-image > strong'
rate_temp3 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol.list-more > li:nth-child(number) > div.box-contents > div > strong'
image_temp3 = '#contents > div.wrap-movie-chart > div.sect-movie-chart > ol.list-more > li:nth-child(number) > div.box-image > a > span > img'

for i in range(1, 13):
    title_tag3 = title_temp3.replace('number', str(i))
    rank_tag3 = rank_temp3.replace('number', str(i))
    rate_tag3 = rate_temp3.replace('number', str(i))
    image_tag3 = image_temp3.replace('number', str(i))

    titles3 = soup.select_one(title_tag3).text
    ranks3 = soup.select_one(rank_tag3).text
    rates3 = soup.select_one(rate_tag3).text
    images3 = soup.select_one(image_tag3)['src']

    doc = {
        'title': titles3,
        'rank': ranks3,
        'rate': rates3,
        'image': images3
    }
    db.movies.insert_one(doc)

아래와 같이 단순화 시켜봤다.

movieTemps = soup.select('#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(2) > li, #contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(3) > li, #contents > div.wrap-movie-chart > div.sect-movie-chart > ol.list-more > li')
for movieTemp in movieTemps:
    titles = movieTemp.select_one('div.box-contents > a > strong').text
    ranks = movieTemp.select_one('div.box-image > strong').text
    rates = movieTemp.select_one('div.box-contents > div > div > span.percent').text
    images = movieTemp.select_one('div.box-image > a > span > img')['src']
    links = movieTemp.select_one('div.box-image > a')['href']

    doc = {
        'title': titles,
        'rank': ranks,
        'rate': rates,
        'image': images,
        'links': links
    }
    db.movies.insert_one(doc)

그러나 1번의 과정이 반복될 뿐 도저히 원인을 찾을 수 없었다.

 

문제 해결

그러나 이러한 문제들은 서버에 배포하는 순간 말끔히 해결되었다.

로컬 환경에서 돌렸을 땐, '저장-출력'에 문제가 있었던 것들이 EC2에서 돌아가고 도메인으로 배포되는 순간 정상 작동되기 시작했다.

 

 

느낀 점

컴퓨터 기본 지식이 없는 상태이다 보니 정확하진 않지만, 어렴풋이 서버나 웹 구조, DB 등과 관련이 있을 것 같다는 생각이 들었다.

그리고 바로 이게 개발자에게 컴퓨터 공학 지식이 필요한 이유가 아닐까?

'일지' 카테고리의 다른 글

Javascript 기본 복습  (0) 2022.11.13
Git 원리 이해  (0) 2022.11.09
또 다시 줄 이슈  (0) 2022.11.03
줄 정리  (0) 2022.11.02
반응형 웹으로 바꾸기 (허접함 주의)  (0) 2022.11.01
Comments