저처럼 이름을 잘 못 짓는 사람들에게 있어서 닉네임 정하는 건 정말 힘든 일입니다. 남들이 보고 재밌어할 닉네임을 정하고 싶은데 딱히 떠오르는 아이디어도 없었고요. 필요하면 만드는 게 공돌이 마인드인 만큼 이번 주말의 프로젝트로는 닉네임 생성기를 만들어보겠습니다.
0. 있는 거 살펴보기
이미 좋은 닉네임 생성기가 있다면 만들 필요가 없으니 먼저 닉네임 생성기들이 어떤 상태인지 살펴봤습니다.
웹툴이라는 사이트의 닉네임 생성기는 외국어만 되는 것 같습니다. 저는 한글 닉네임만 만들 생각이니까 겹치지 않네요. 두 글자 닉네임 생성기 사이트도 있습니다. 몇 번 눌러보니 등록된 글자 중 랜덤으로 2개를 합쳐서 만들어주는 것 같습니다. 독특한 이름도 있지만 어색하거나 어감이 이상한 것도 꽤 나오는 것 같네요. 랜덤 단어 생성 사이트도 검색에 잡혔습니다. 작동 방법이 조금 어려웠는데 제가 원하는 느낌은 아니었습니다.
제가 좋아하는 닉네임은 색다른 두 개의 단어가 합쳐져 독특한 느낌을 주는 걸 좋아합니다. 전설의 공익요원, 할머니와 곽철용 같이 서로 어울리지 않는 단어가 뭉쳐진 게 재밌더라고요. 그럼 이걸 어떻게 만들어볼지 설계를 해봅시다.
1. 단어 뭉치 가져오기
먼저 닉네임에 들어갈 단어 뭉치가 필요합니다. 위키 낱말 사전에는 26,714개가 검색됩니다. 명사만 했는데도 상당하네요.
단어가 어마어마하게 많으니 직접 하나씩 옮기다간 하루가 다 지나갈 것입니다. 시간을 아끼기 위해 간단한 웹 크롤러를 만들어봅시다.
1.1 웹 크롤러 만들기
웹 크롤러는 웹에 존재하는 데이터를 갈퀴로 긁어오듯 가져오는 도구를 뜻합니다. 구글, 네이버, 다음 같은 검색 사이트는 크롤러를 돌려 사이트 인덱싱을 하는데 쓰이지만 저희는 간단하게 타깃 사이트의 원하는 데이터만 가져오는 형태로 만들어봅시다.
필요한 건 axios와 cheerio 모듈입니다. axios는 HTTP 메서드를 쏴주는데 편리한 도구이고, cheerio는 DOM 셀렉팅을 하는 데 사용할 겁니다. DOM 셀렉팅은 jQuery 사용자 분들은 $('.target-class') 형태로 사용해보셨을 겁니다.
위의 링크를 참고해(카피해) 빠르게 만들어봅시다.타깃 클래스와 타깃 URL 부분만 수정하면 됩니다.
이렇게 간단하게 단어만 빼낼 수 있습니다.
아래 콘솔 창에 보시면 단어만 획득한 것을 보실 수 있습니다. 그럼 이제 여러 페이지에 대해서 크롤링을 진행해봅시다. 한 페이지 데이터를 획득한 후에 다음 페이지에 저장된 URL을 획득해 다시 단어를 획득합니다.이를 반복하면 27,000여 개의 단어를 다 리스트업 할 수 있을 겁니다.
$('#mw-pages > a:last-child').attr('href')
위의 선택자를 통해서 다음 페이지 버튼에 저장된 href값을 획득합니다. /w/index.php?title=.... 형태로 되어있는데 origin(https://ko.wiktionary.org)이 빠져있으므로 origin값은 추가로 입력해주도록 합니다.
적당히 루프를 만들어 돌려보니 잘 작동합니다. 한 페이지 로드할 때마다 시간이 꽤 걸리긴 하지만 큰 문제는 없는 것 같습니다.
1.2 100퍼센트 초과?
한 페이지에 200개씩 26,714개의 단어만 가져오면 끝(135개 내외의 페이지)인 줄 알았는데 이상하게 100%를 초과해도 계속 진행됐습니다.
???
이럴 줄 알았으면 url 체크라도 해둘걸 싶습니다. 아무래도 페이지 진행 중 문제가 생긴 걸로 보이는데, 마지막 단어의 마지막 페이지에서 정상적으로 루프가 멈추는지 테스트해봤습니다. 문제는 last-child 선택자였습니다.
마지막 페이지에서 :last-child <a>는 이전 페이지였고, 이전 페이지로 들어가고, 마지막 페이지로 가는 걸 반복하고 있었던 겁니다. 다음 페이지 버튼만 선택될 수 있도록 text 검사를 추가로 하면 될 것 같습니다.
마지막 <a>의 텍스트가 "이전 페이지"이면 루프 종료
이제 다시 돌려봅시다.
단어 개수는 맞는데 제가 퍼센트 비율을 잘못 계산했나 보네요. 50%에서 완료되는 걸 보니 2를 곱했어야 했네요. 이렇게 수학을 못하는데도 코딩을 하네요;;
2. 단어 합쳐주기
어쨌든 위키 낱말 사전을 통해서 26,714개의 단어를 가져왔습니다. 데이터는 가져왔지만 슬프게도 적절하지 못한 데이터도 섞여있습니다.
ㄲ, ㄳ도 명사라니..
2.1 초성 지워주기
ㄲ, ㄳ, ㄵ 같은 초성만 있는 것도 명사라니 한글의 세계는 정말 깊었습니다. 그렇다고 초성만 있는걸 닉네임에 넣을 순 없으니 이걸 빼보겠습니다. 뺀 방법은 26,714개의 단어 중 한 글자 단어만 필터링한 후, 초성만 지우는 코드를 짤 수도 있겠으나 가, 나, 다, 라...로 시작하는 단어를 찾아 그 앞에 있는 초성만 지워주면 더 빨리 할 수 있었습니다. 한 2분 만에 초성은 다 지울 수 있었습니다.
2.2 단어 합치기
이제 단어를 합쳐봅시다. "A의 B", "A와 B", "A에 간 B"으로 테스트해봅시다.
저세상 닉네임 만들기 성공!
세상에나... 정말 생각지도 못한 닉네임들이 나타나고 있네요. 긴장도, 묘적, 마전, 과랭, 몰선묘법 모두 처음 들어보는 단어입니다. 어쨌든 제가 좋아하는 스타일의 근본 없는 닉네임이 잘 나오고 있습니다.
그럼 이제 웹사이트로 만들어봅시다.
3. 사이트 만들기
이 사이트는 클릭하면 랜덤 닉네임만 나오면 됩니다. 제 예전 프로젝트인 바삭한 햇빛과 구조가 똑같네요!