본문 바로가기
Java

Spring - Java 로 워드클라우드(Wordcloud) 기능 만들기(d3.js)

by 나는 코딩왕 2021. 2. 2.
  • Java로 워드클라우드 기능을 구현함에 앞서 글자크기는 DB 데이터 중 동일한 컬럼에서의 중복값으로 크기를 정했습니다
  • d3.js는 인터넷이 되는 환경에서의 코드로 작성했습니다

 

 

 

1. 동일한 컬럼에서의 중복값 찾기 쿼리 - 제목과 제목컬럼에 대한 동일 값의 카운트를 글자의 크기로 담고자 AS MOUNT 에 담았어요

<select id="wordcloudlist" resultType="WordcloudDTO">
		SELECT 
			SUBJECT 
			,count(*) AS MOUNT 
		FROM 
			TABLE 
		GROUP BY 
			SUBJECT 
		HAVING count(*) >1
</select>

 

 

2. Java 단에서 리스트를 json형식으로 넘기기

@RequestMapping(value="/wordcloudtest.do", method = RequestMethod.GET, produces = "application/text; charset=UTF-8" )
@ResponseBody
public String wordcloud(HttpServletRequest request,WordcloudDTO WordcloudDTO) throws Exception{
		
		
		List<WordcloudDTO> list = dao.list(WordcloudDTO);
		
		String json = null;
		try {
			json = new ObjectMapper().writeValueAsString(list);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
			
		
		
		return json;
	
}

 

 

3. Jsp 화면단에서 표현하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="https://rawgit.com/jasondavies/d3-cloud/master/build/d3.layout.cloud.js" type="text/JavaScript"></script>

       <style>
         body {
         font-family:"Lucida Grande","Droid Sans",Arial,Helvetica,sans-serif;
         }
        .legend {
             border: 1px solid #555555;
              border-radius: 5px 5px 5px 5px;
              font-size: 0.8em;
              margin: 10px;
               padding: 10px;
         }
        .bld {
              font-weight: bold;
         }
        </style>



</head>
<body>

      
           <div id="wordcloud" align="center" >
           </div>
<script>


	 var wordcloudlist = $.ajax({
		
		type: "GET",
	    url: "wordcloudtest.do",
	    dataType: "json",
	    contentType: "application/json; charset:UTF-8", 
	    async: false
		}).responseText; 
   
    var wordcloudtest = [{"subject":"맨유","mount":40},{"subject":"맨사타","mount":15},{"subject":"첼시","mount":10},{"subject":"토트넘","mount":35},{"subject":"리버풀","mount":30},{"subject":"인천유나이티드","mount":20}];
    
  	  var x = JSON.parse(wordcloudlist);
       var y = wordcloudtest   
  
    console.log("Json데이터 ",x)
    console.log("11",y)
    
  
    
    var color = d3.scale.linear() //선형적인 스케일로 표준화를 시킨다.
            .domain([0,1,2,3,4,5,6,10,15,20,100])//데이터의 범위, 입력 크기
            .range([0.50]);//표시할 범위, 출력 크기
            //ex)"#ddd", "#ccc", "#bbb", "#aaa", "#999", "#888", "#777", "#666", "#555", "#444", "#333", "#222"

    d3.layout.cloud().size([800, 300]) //[width,height]
            .words(x)
            .rotate(0)
            .fontSize(function(d) { return d.mount; })
            .on("end", draw)
            .start();
    
    function draw(words) {
        d3.select("#wordcloud").append("svg")//wordcloud 테이블에 svg를 붙이고
                .attr("width", 850)
                .attr("height", 350)
                .attr("class", "wordcloud")
                .append("g")
                .attr("transform", "translate(320,200)")
                .selectAll("text")
                .data(words)
                .enter().append("text")
                .style("font-size", function(d) { return d.mount + "px"; })
                .style("fill", function(d, i) { return color(i); })
                .attr("transform", function(d) {
                    return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
                })
                .text(function(d) { return d.subject; });
    }
    
</script>       
</body>

</html>

 

json 형식으로 받을시 wordcloudtest 형식처럼 받아야해요

 

 

이상입니다~!!

 

 

댓글