토이 프로젝트/Spring&Java 갖고놀기

DataPlay project - 1 : java로 Word Cloud 생성기- 크롤링, API, JSON

TerianP 2022. 5. 4.
728x90

DataPlay - 데이터 갖고 놀기 - project

얼마전 친구가 나에게 "너 word cloud 워드 클라우드 만들 수 있어?" 하고 물어왔다.

당연히 나는 모른다고 말했지만 친구는 그래도 나름 코딩 공부 비스무리한 것을 했으니 한번 만들어 줄 수 있겠냐고 이야기를 던졌다.

 

사실 처음에는 거절하려고 했다. 내가 현재 하던 프로젝트도 있고, 공부할것도 많아서 "나 할 줄 몰라"  하면서 넘어가려했다. 다만 거절하기 전에 어떤 로직이 필요한지, 기술이 필요한지 정도는 알아보고 싶었다. 그렇게 여러 내용들을 찾아보다가 java 로도 데이터를 크롤링해올 수 있으며, 나머지를 파싱하고 프론트로 데이터를 보내는 것 뿐이니 의외로 쉽지 않을까...? 라는 바보같은 생각이 들었다. 무엇보다 단순히 웹에서 보여주기 위한 기술이 아니라 데이터를 가져오고 파싱하는 과정은 단순히 word cloud 를 만드는 것 이상의 공부를 할 수 있을 것이라고 생각되었다. 심지어는 결과물이 참 이뻐서 마음에 쏙 들었다ㅎㅎ

결국 그렇게 Data Play 프로젝트 일명 데이터 갖고 놀기 프로젝트라는 나름의 이름을 갖고 작업을 시작했고, 공부하고 구현하면서 다시 한 번 무식하면 사람이 용감해질 수 있다는 것을 깊이 깨달았다ㅠ.ㅠ

 

어떻게 만들까?

어쨌든 그렇게 작업 해보기로 마음을 먹고 워드 클라우드를 구현하는 방법에 대해서 알아보기 시작했다. 짧지만 이것저것 검색해보고 공부하면서 단순해보이지만 의외로 정말 다양한 기술이 들어가야한다는 것을 알았다.

일단 워드 클라우드를 만드는 순서를 간단히 정리하면, 가장 먼저 내가 원하는 단어를 검색해기 위한 기술이 있어야하고, 검색된 여러 데이터를 파싱해야하기 때문에 문자열 데이터를 파싱하는 방법을 알아야한다. 다음으로 파싱한 데이터를 다시 프론트로 보내고, 프론트에서는 클라우드 형식으로 보여줘야 한다.

 

정리하자면 아래 순서대로!!

1. 내가 원하는 단어로 사이트에서 결과 검색해오기 => 네이버 검색 API 사용

2. 검색해온 결과를 잘라서 단어들만 골라내기 => Komoran 형태소 분석기 사용

3. 파싱한 데이터를 프론트로 보내기 => Json 형태로 프론트에 전달

4. 프론트에서 word Cloud 로 이쁘게 만들기!! => anychart , JQcloud 를 사용해서 만들기!

 

 

프로젝트 설명

- 본 코드는 오직 json 데이터 나누고 정리하고, 분석하고, 최종적으로는 해당 단어들을 사용해 워드 클라우드를 만들어 보기 위해 작성하였습니다.
- 때문에 혹시라도 불법적인 사용에 이용하시는 경우 작성자와는 무관함을 알려드립니다.

- Git 에 올라간 파일들 중 네이버 검색 API 에 관한 정보를 넣어둔 - API ID 와 API secret - interface 는 올리지않았습니다. 이 부분은 해당 코드를 사용하시는 분께서 직접 interface 를 만들고 해당 정보를 넣어둔 후 구현하시거나 애초에 따로 빼지 않고 바로 넣어서 사용하시거나 어느쪽을 택해도 무방할 듯 합니다.

- 프로젝트  userDictionary 폴더 내 koreanDic.user 파일은 komoran 에서 사용되는 단어 사전입니다. 이 파일 안에 단어를 적어두면 해당 단어는 komoran 으로 분석 시 하나의 단어로 인식하여 분석됩니다.

  • EX) 엘든링 이란 단어를 검색 시 koreanDic 파일에 엘든링을 적지 않았을 때 => '엘'/'든링' 으로 나눠서 분석됨
  •  koreanDic 파일에 '엘든링'을 적어두었을 때 => '엘든링' 을 하나의 단어로 인식후 분석함

- JSON 과 KOMORAN 을 사용하기 위해서는 Gradle 나 maven 으로 해당 라이브러리 정보를 가져와야합니다. 저는 gradle 를 사용했으며 아래와 같이 넣어두었습니다.

	//	JSON
	implementation 'com.googlecode.json-simple:json-simple:1.1.1'
	implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.3'

	// Data 다루기
	implementation 'com.github.shin285:KOMORAN:3.3.4'

 

아쉬운 점

- 이번 프로젝트는 사실 아쉬운 점이 너무나 많았던 프로젝트였고, 동시에 아직 배울게 정말 많구나 라는 것을 느꼈다.

- 사실 제일 먼저 알아봤던 js 라이브러리는 wordCloud 였는데 도저히 어떻게 사용하지는 모르겠어서...포기하고 일단 편하고 빠르게 나오는 anychart 를 사용했다. 이 부분은 정말 아쉬웠는데 JS 를 공부가 꼭 필요하다는 것을 느꼈다. 

- 다음으로 머신러닝에 관해서이다. 앞서 이야기한 userDictionary 의 경우 사용자가 필요한 단어를 일일히 넣어줘야하는 불편함이 있다. 특히나 최신 단어들, 고유 명사들에 대해서는 여기에 넣고 돌려야 정확한 결과가 도출된다. 사실 이 부분을 해결하고자 매일 특정 시간에 네이버 블로그를 검색하고, 해당 시간에 가장 많이 나왔던 단어를 알아서 userDirctionary 에 넣는 방법을 생각해보았으나...포기했다. 다만 이 부분은 로직만 조금 더 보완하면 할 수 있을 듯 하다.

사실 가장 쉬운 방법은 머신러닝을 통해서 알아서 익히고 추가하고 하는 방법일듯한데...이거야말로 나에게는 너무 먼 이야기고ㅠㅠ 내 역량이 조금만 더 뒷받침되었다면 훨씬 더 좋게 멋지게 만들 수 있었을텐데 얻어가는 것도 많았지만 아쉬운 점도 많았다.

 

Git

코드는 git 에 올려두었고 코드에 대한 자세한 설명은 다음 글부터 하겠습니다

https://github.com/SeJonJ/java-Word-Cloud

 

GitHub - SeJonJ/java-Word-Cloud

Contribute to SeJonJ/java-Word-Cloud development by creating an account on GitHub.

github.com

 

구현 결과

JQcloud
AnyChart


다음 글부터 코드에 대해 이야기하기 전에 크롤링과 API 에 대해서 먼저 이야기하고 넘어가겠다.

API야 말할 필요도 없이 워낙 중요한 기술이고, 데이터가 곧 돈이되는 세상이 되는 지금 크롤링 역시 정말 정말 중요한 내용이라고 생각되기 때문에 가능한 자세하게 정리하고 가려고한다.

 

웹 크롤링 Web Crawlering 이란?

크롤링이란 데이터를 수집하고 분류하는 것을 의미한다. 주로 인터넷상의 웹페이지를 수집해서 분류하고 저장하는 것을 뜻하며 데이터에 어디에 있는지 위치에 대한 분류 작업이 크롤링의 주요 목적이다. 쉽게 이야기하자면 정보의 바다인 인터넷 세상에서 내가 원하는 자료만 딱! 하고 뽑아오는 것을 의미한다.

사실 인터넷은 정확히는 우리가 열어보는 웹 페이지 라는 것은 html 문서로 되어있다. 이러한 html 은 HTML 태그를 기반으로하는 규칙과 구조를 갖는다. 웹 크롤링은 이런 구조를 이용해서 HTML 을 스캔하며 내가 원하는 태그의 내가 원하는 정보만을 똭! 하고 뽑아오는 것이다. 이러한 크롤링을 쉽게할 수 있도록 도와주는 대표적인 라이브러리가 파이썬의 Beautiful soup 와 자바의 JSoup 가 있다. 이중에서도 특히 파이썬의 Beautiful soup 데이터 크롤링과 관련해서 많은 자료가 있고 정말 유명하다.

물론 여기서 끝이 아니다. 가져온 결과가 XML 이냐 JSON 이냐에 따라서 코드가 달라지고 심지어 결국 내가 원하는 정보를 뽑아왔다고 하더라도 HTML 문서안에 적혀있는 내용을 그대로 가져온 것이기 때문에 이를 다시 분류하고 분석하고 조립하는 과정이 필요하다.

 

API Application Programming Interface 란 000 이다!!

개발할때 무엇인가를 만들때 참으로 많이 쓰는 말 API. 이 API 에 대해서 대충은 이해하고 있었지만 정확히 뭔 소린지 이해를 못하고 있었다. 이번 기회를 통해서 정리해보았다.

 

먼저 위키백과 님의 설명을 들어봅시다.

API(Application Programming Interface, 응용 프로그램 프로그래밍 
인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.

 

- API 란 누군가 혹은 어디선가 제공하는 기능(서비스)의 연결통로

네이버 지도에는 내가 원하는 위치를 찍어두면 해당 위치까지 어떻게 가는지 시간을 얼마나 걸리는지 어떤 교통수단이 있는지 돈이 얼마나 드는지 등등 편의를 제공해주는 기능이 있다.

어느날 네이버는 생각했을 것이다. 이 기능을 다른 사람들에게 제공할 수는 없을까? 하고 말이다. 물론 기능을 제공하는 것은 좋다. 다만 분명 이러한 기능을 구현하는 '코드'를 제공하는 것은 좋은 생각이 아니라고 생각했을 것이다. '코드'를 제공했다가는 누군가 위조, 변조할 가능성이 있고, 네이버 자체에서는 분명 이러한 기능을 만드는데 돈과 시간이 들었는데 쉽게 제공할 이유가 없다.

그렇다면 어떻게 '기능'만을 제공할 수 있을까? 바로 그 답이 API 이다. 네이버 지도라는 기능을 API 로 만든 후 사람들에게 URL 로 제공한다. 사람들은 실제로 네이버 지도가 어떤 코드로 어떤 로직으로 내부적으로 처리되는지는 알 수 없지만, 네이버 지도라는 '기능' 자체는 가져다가 쓸 수 있게 된다. 동시에 다른 사람들이 코드에 손을 대서 이렇게 저렇게 바꾸는 문제도 방지할 수 있다.

바로 이렇게 다른 사람이 혹은 회사가 만든 기능(서비스)를 그대로 가져다 사용할 수 있게 하는 연결통로가 바로 API 이라고 할 수 있다. 

 

- API KEY , OPEN API

물론 당연하게도 회사들이 자신들이 만든 기술을 쉽게 사람들이 사용하도록 두지는 않을 것이다. 자신들도 이익을 남겨야하니까. 그래서 API 를 사용할 수 있는 KEY, 즉 기능의 연결통로로 들어갈 수 있는 열쇠를 만들어 제공한다. API 사용 요청 시 (유료)API KEY 를 확인하고 허가된 KEY 에 대해서만 API 기능을 제공한다. 

 

그러나 몇몇 회사들은 이러한 불문율을 깨고 자신들의 기능을 펑펑 사용할 수 있도록 만들었다. 이것이 바로 OPEN API 이다. OPEN API 는 말 그대로 열려있는 API 기능으로 특정한 누군가에게만 제공하는 것이 아니라 모두에게 해당 기능을 마음껏 사용할 수 있도록 한다. 물론 예외도 존재한다. 예컨데 네이버와 구글 검색 API 의 경우 하루의 검색량의 한도가 존재한다. 이 검색량을 넘어가면 건당 돈을 내야한다. 아마도 한계없이 놔두면 너무나 많은 요청 때문에 서버가 뻗을 수 있기 때문이 아닐까...생각한다. 돈도 벌어야하고.

 

그렇다면 왜 OPEN 으로 해두는 것일까? 나는 '데이터' 때문이라고 생각한다. 예를 들어 네이버 로그인의 경우 대표적인 OPEN API 인데 이를 통해서 네이버는 로그인 API 를 통해 가입하는 사이트에 대한 정보를 얻을 수 있다. 예컨데 10대, 20대 남성들이 게임 사이트에서 네이버 API 를 사용해서 네이버 아이디로 로그인 한다면 네이버는 10, 20대 남성들이 자주 사용하는 게임 사이트에 대한 정보를 얻을 수 있다. 마찬가지로 남성들이 어떤 쇼핑 사이트에 많이 가는지 역시 '데이터' 정보로서 고스란히 저장할 수 있다.

이는 네이버로서는 엄청난 자산이 된다. 추후 해당 연령대의 사람들이 네이버에서 로그인 했을 때 메인 페이지를 그 사람이 많이 가는 사이트, 관심있는 사이트에 대해 띄워주고 쇼핑몰을 띄워준다면...? 

물론 당연히 나의 생각일 뿐이지만 어쨌든 데이터가 힘이고, 돈이 되는 앞으로 세상에서 OPEN API 를 통해 얻을 수 있는 장점은 정말 무한하다고 생각한다.

 

출처 : ㅋhttp://sahilsk.github.io/articles/so-youre-writing-api-client/

 

JSON JavaScript Object Notation

JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식

JSON 은 참으로 위대한 자료형이다. JSON 이 정말 좋다고 생각하는 이유는 사람이 가장 쉽게 이해할만한 방식으로 데이터를 만들고 전달 할 수 있다는 점 때문이다. 아래의 JSON 으로 만들어진 JQCloud 정보를 잠깐 보자

// $("#wordcloud").jQCloud(data, {
//     width : 800,
//     height : 600,
//     shape : 'rectangular',
//     autoResize: true,
//     classPattern: null,
//     colors: ["#800026", "#bd0026", "#e31a1c", "#fc4e2a", "#fd8d3c", "#feb24c", "#fed976", "#ffeda0", "#ffffcc"],
//     fontSize: {
//         from: 0.1,
//         to: 0.02
//     }
// });

 코딩에 대해 전혀 모르는 사람도 딱 보면 어느정도 확인 할 수 있는 부분들이 보인다. 바로 { } 중괄호 안의 내용들이다. 다른 것들은 모르지만, 적어도 width 가 800 이고, heigth 는 600 이라는 것이 확인된다. 또한 shape 는 사각형 형태를 취하고 color 색상은 뭔가 안에 있는 내용이다 까지 감을 잡을 수 있다. 이것이 바로 json 의 위대한 점이다. 데이터를 사람이 확인하고 이해하기 좋은 형태로 만들고 보다 간단하게 표현이 가능하다. 

 

JSON 은 아래 형식을 취한다. 아주 단순하게 KEY 와 그에 해당하는 값 VALUE 만 있으면 짠! JSON 이 만들어지는 것이다. 다만 주의해야할 점은 KEY 와 VALUE 모두 String 즉 문자열에 대해서는 " " 쌍따옴표를 이용해서 표기해야한다는 점이다.

또한 json 은 json 안에서 내용 중첩이 가능하다. 예컨데 아래처럼 employees 안에 다시 배열 형태로 json 을 만들어서 이름과 성을 표기해놓았다. 그렇게 되면 추후 employees 를 가져와서 확인하면 고스란히 name 과 lastname 이 들어있는 것을 확인 가능하다.

1. 기본 표기

JSON이름{ KEY : VALUE }

json 안에 내용 중첩
{
  "employees": [
    {
      "name": "Surim",
      "lastName": "Son"
    },
    {
      "name": "Someone",
      "lastName": "Huh"
    },
    {
      "name": "Someone else",
      "lastName": "Kim"
    } 
  ]
}

 

JSON 은 서버와 클라이언트 간 정보 전달에서 정말 많이 사용한다. 나 역시 WORD CLOUD 도 JSON 으로 데이터를 만들어서 서버와 웹을 왔다갔다하면서 기능을 만들었다. JSON 에 대해서는 다음 코드 설명 부분에서 직접 보면서 확인하는게 훨씬 좋다고 보기 때문에 개념 정리 정도만 하고 넘어가도록 하겠다.

댓글