Eggs Sunny Side Up
본문 바로가기
프레임워크(Framework)/Spring

알고리즘_Java 로직 + ajax 비동기통신

by guswn100059 2023. 6. 12.

Console 오류

Mapped Statement 에서 Statement는 mybatis sql쿼리문의 id값

ex) session.selectList("getMonthData", vo); 에서

"getMonthData" => Statement

 

bean을 못찾는다는 오류

=> Controller에서 url매핑값이 중복되진 않았는지 확인!


BroadCastMapper => DAO

package kr.smhrd.mapper;

import java.util.ArrayList;

import org.apache.ibatis.annotations.Select;

import kr.smhrd.entity.BroadCast;

// @Mapper => 버전 업그레이드로 생략 가능
public interface BroadCastMapper {
	
	// 남, 여, 전체 시청률 평균을 조회하는 기능
	// 조회한 결과 행이 하나이기 때문에 BroadCast로 받아오기
	// session.selectOne();
	public BroadCast select();

	// 월별 데이터 조회
	public ArrayList<BroadCast> getMonthData();

	// 연령대별 데이터 조회
	public BroadCast getSData();
	
	// 출연진 TOP5 조회
	@Select("SELECT FIXING_CAST_NM, CAST_NM FROM BROADCAST WHERE PROGRAM_NM = '뮤직뱅크'")
	public ArrayList<BroadCast> getCastCount();
	
}

 

BroadCastRestController

package kr.smhrd.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashSet;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import kr.smhrd.entity.BroadCast;
import kr.smhrd.entity.CastCount;
import kr.smhrd.mapper.BroadCastMapper;

@RestController // @Controller + @ResponseBody
public class BroadCastRESTController {
	// -> 비동기통신 요청을 처리해주는 Controller
	// -> 웹페이지 화면에 데이터를 돌려주는 역할
	// -> 메소드를 선언할 때 @ResponseBody 생략이 가능

	@Autowired
	private BroadCastMapper mapper;

	// 월별 데이터 조회할 수 있는 url
	@RequestMapping("/getMonthData")
	public ArrayList<BroadCast> getMonthData() {
		System.out.println("요청이 들어오닝");
		ArrayList<BroadCast> result = mapper.getMonthData();
		return result;

	}

	// 연령대별 데이터 조회
	@RequestMapping("/getSData")
	public BroadCast getSData() {
		System.out.println("요청");
		BroadCast result = mapper.getSData();
		return result;
	}

	// 출연진 Top5 조회
	@RequestMapping("/getCastCount")
	public ArrayList<CastCount> getCastCount() {
		// 1. DB에서 데이터 조회
		ArrayList<BroadCast> result = mapper.getCastCount();

		// 2. 조회한 결과값 화면에 출력될 수 있는 형태로 변환
		// 1개의 column안에 여러 명의 이름이 들어있음
		// 연예인 이름을 전부 담을 수 있는 ArrayList<String>
		ArrayList<String> cast_nm = new ArrayList<String>();

		for (BroadCast b : result) {

			// 2-1) result안에 들어있는 MC이름을 가져와서 ','를 기준으로 쪼개기
			String[] temp1 = b.getFixing_cast_nm().split(",");
			// 2-2) result안에 들어있는 cast_nm을 가져와서 ,를 기준으로 쪼개기
			String[] temp2 = b.getCast_nm().split(",");
			// 2-3) 쪼갠 데이터들을 하나의 공간에 보관하기
			for (String s : temp1) {
				cast_nm.add(s);
			}
			for (String s : temp2) {
				cast_nm.add(s);
			}

		}
		System.out.println(cast_nm);
		
		// 2-4) 전체 연예인 명단에서 중복을 제거
		// Collection => 객체 자료구조들 (ArrayList, List, HashMap ...)
		// HashSet => 중복값을 허용하지 않는 자료구조 => 데이터를 꺼내려면 iterator 사용해야함
		// LinkedHashSet => 순서가 있는 중복값을 허용하지 않는 자료구조
		LinkedHashSet<String> castingHashSet = new LinkedHashSet<String>(cast_nm);
		System.out.println("중복제거한 결과값 >> "+castingHashSet);
		
		// 2-5) 최종적으로 리턴해줄 자료형
		// CastCount => 이름 : 횟수
		ArrayList<CastCount> resultList = new ArrayList<CastCount>();
		
		for(String c:castingHashSet) {
			
			if(!c.equals("")) {
			// 2-6) 연예인 이름 당 몇 번 등장했는지 횟수를 카운트
			// Collections.frequency(객체를 담고있는 컬렉션, 개수를 세고 싶은 객체)
			int count = Collections.frequency(cast_nm, c);
			// 2-7) 결과값은 resultList에 담아주기
			resultList.add(new CastCount(c, count));
			
			}
		}
		
		// 2-8) resultList
		// => 객체를 정렬 => count 기준으로 정렬
		// 객체를 정렬하는 방법
		// (1) 정렬하고 싶은 객체가 Comparable 인터페이스를 상속
		// (2) Comparator라는 인터페이스를 구현 ★사용★
		
		// 익명함수 방법 1. 
//		Collections.sort(resultList, new Comparator<CastCount>() {
//
//			// compare => 비교하는 함수
//			@Override
//			public int compare(CastCount o1, CastCount o2) {
//				return o2.getCount() - o1.getCount();
//				// 양수 => 내림차순 정렬
//				// 음수 => 오름차순 정렬
//			}
//		});
		
		// 익명함수 방법 2. 람다식 표현
		// => 익명함수를 호출할 때 많이 사용하는 방식(한줄로 간단히 표현할 수 있는 경우만 사용가능)
		// 사용법 : (매개변수) -> 리턴해줘야하는 결과값
		Collections.sort(resultList, (o1, o2)->o2.getCount()-o1.getCount());
		
		System.out.println("최종결과 >> "+ resultList);
		

		return resultList;
	}

}

 

index.jsp

변환과정 : jsp --> .java --> .class --> .html

<!-- Content Row -->
                    <div class="row">

                        <!-- Content Column -->
                        <div class="col-lg-6 mb-4">

                            <!-- Project Card Example -->
                            <div class="card shadow mb-4">
                                <div class="card-header py-3">
                                    <h6 class="m-0 font-weight-bold text-primary">출연진 TOP5</h6>
                                </div>
                                <div class="card-body" id="top5">
                                    
                                    
                                </div>
                            </div>
                        </div>
                    </div>

                </div>
                <!-- /.container-fluid -->
<script >
    	$(function(){
    		$.ajax({
    			url : 'getCastCount',
    			dataType : 'json',
    			success : function(res){
    				console.log(res);    				
    				console.log(res[0].name); 
    				
    				// DOM -> Document Object Model
    				// 1. id값이 top5인 태그를 가져오기
    				// document.getElementByID('top5')
    				// == document.querySelector('#top5')
    				// == $('#top5')
    				// jquery, 순수js => 요소(태그)를 조작하는 메소드들 공부!!
    				
    				// 2. 태그에 추가하기
    				
    					
    				for(let i = 0; i<5; i++){
    					$('#top5').append(
    						`<h4 class="small font-weight-bold">
                            \${res[i].name} <span class="float-right">\${res[i].count}번</span>
                            </h4>
                            <div class="progress mb-4">
                                <div class="progress-bar bg-danger" role="progressbar" style="width: \${res[i].count}%"
                                    aria-valuenow="\${res[i].count}" aria-valuemin="0" aria-valuemax="100"></div>
                            </div>`)
                     }
    				
    			},
    			error : function(){
    				console.log('실패!');
    			}
    		})
    	})
    
    
    
    </script>

댓글