반응형
반응형

Spring Boot가 아닌 환경에서는 기존처럼 xml만들고, web.xml 수정하고, decorator.html만 만들어서

대충 추가만 해주면 되는데,


Spring Boot는 내부적으로 해주는 일이 많다보니,

FilterRegistrationBean이라는 것을 사용해서, SiteMesh설정이 되어 있는 Filter를 등록해주어야 한다.


SiteMeshFilter 설정

public class SiteMeshFilter extends ConfigurableSiteMeshFilter {

    @Override
    protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
       builder.addDecoratorPath("/*", "/decorator/decorator.ftl");
    }
}




Spring Boot Application 설정


@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
    
    @Bean
    public FilterRegistrationBean siteMeshFilter() {
        FilterRegistrationBean filter = new FilterRegistrationBean();
        filter.setFilter(new SiteMeshFilter());
  
        return filter;
    }
}
별도의 xml이 필요없어서 좋다.


반응형
,
반응형

플랫폼 팀이 해야할 실시간 동접 그래프 구현을 안해주길래..

직접 만들어보는걸로 하고..

이것저것 찾다보니 jquery를 이용해서 차트를 그릴 수 있는 훌륭한 라이브러리인 jqplot을 사용해보기로 하였다.

http://www.jqplot.com/

front쪽은 잘 만들어진거 잘 가져다만 써도 거의 모든게 해결이 되는것 같음..


일단 기본 프레임워크 Spring Boot로 잡고, ui표현은 가장 익숙한 jquery + freemarker를 사용하기로 하였다.


가지고 있는 API가 현재 서버에 소켓이 몇 개 붙어있는지 정도만 가져올 수 있는 API였기 때문에,

지난 시간의 동접 파악을 위해 dbms를 이용해야 한다.


dbms는 mysql 깔고 이리저리 귀찮게 하지 않기 위해, embedded hsqldb를 사용하였고,

쿼리 작성도 귀찮아서 spring jpa를 사용하였다. 

findAll을 이용해서 데이터를 가져오려고 생각해보니, 데이터 제한이 있어야 될 것 같아서 날짜로 내림차순 후 top keyword를 사용하여

개수 제한을 두어, 데이터 량이 넘치면 차트가 서서히 밀리도록 구현함.


이제 문제는 데이터 수집인데.. 이것도 별도 데몬을 띄워서 스케줄링으로 돌리긴 너무나도 귀찮아서

Spring Boot가 올라갈 때 Quartz세팅을 하여, 올라가는 순간부터 API를 호출하여 데이터를 수집하는 방식으로 하였다.


이제 남은건 차트 표현인데, 너무나도 간단하게 잘 만들어져 있음.


최초에 API를 통해서 x, y좌표의 데이터를 배열형식으로 리턴받아, jqplot에 전달을 하고,

setTimeout + ajax call을 적용하여, ui단에서 실시간으로 갱신이 되도록 하였다.


위에서 설명한걸 소스로 표현하면, 대충 아래와 같은 느낌임. (UI단만;)


<link href="css/jquery.jqplot.min.css" rel="stylesheet" />
 
<script src="js/jquery-2.1.4.min.js"></script> 
<script src="js/jquery.jqplot.min.js"></script>
<script src="js/jqplot.dateAxisRenderer.min.js"></script>
<script src="js/jqplot.highlighter.min.js"></script>

<script>
  var plot;
  var chartData = [[0,0]];    // 초기화를 []로 해주면 차트가 안그려짐. ㅠㅠ
  
  $(document).ready(function() {
      renderChart();
      update();
  });
  
  function renderChart() {
      plot = $.jqplot('chart', [chartData], {
          title: 'Current User'
          , axes: {
              xaxis: {
                 renderer:$.jqplot.DateAxisRenderer     // X축을 날짜로 표현할 것이다.
                 , tickOptions: {
                     formatString: '%m-%d %H:%M:%S'   // 이건 다 아시는 dateformat임.
                     , showLabel: false           // 데이터가 많아지면 X축이 보이지도 않을 정도가 되서 제거
                     , showGridline: false        // 데이터 많아지면 세로라인때문에 눈이 아프더군.. 그래서 제거
                 }
                , tickInterval:'5 minutes' // X축 간격을 5분 주기로 띄운다.     
             }
          }
          , series: [{
             color: '#5FAB78'
          }]
          , highlighter: {        // X축이 뭔지는 알아야 되니깐 마우스 오버 기능을 활용하기 위해 추가함
              show: true,
              sizeAdjust: 7.5           
          }
          , cursor: {
              show: false
          }
      });
  }
  
  function getChartData() {
      $.ajax({
         url: 'getCurrentUser'
         , type: 'GET'
         , success: function(data, textStatus, jqXHR) {
             chartData = data;
           
             plot = $.jqplot('chart', [chartData], {
               title: 'Current User'
               , axes: {
                   xaxis: {
                      renderer:$.jqplot.DateAxisRenderer
                      , tickOptions: {
                          formatString: '%m-%d %H:%M:%S'
                          , showLabel: false
                          , showGridline: false
                      }
                      , tickInterval:'5 minutes'
                   }             
               }
               , series: [{
                   color: '#5FAB78'
               }]
               , highlighter:{
                   show: true,
                   sizeAdjust: 7.5           
               }
               , cursor: {
                   show: false
               }
             }).replot();    // 다시 그릴 땐 replot을 활용해야 함.
          }
          , error: function(e) {
             console.log(e);
          }
      });
  }
  
  function update() {
      getChartData();
      setTimeout(update, 1000 * 60 * 2);      // 2분 주기로 갱신
  }
 </script>



body에는 <div id="chart"></div> 이런거 하나 추가해주면 된다.


주석 달려있는 것들만 삽질한 부분이고, 나머지는 그냥 아무거나 붙여다가 적용해도 문제없음.


생각대로 표시가 안되는게 있으면, 무조건 js 파일 누락이니, 다시 확인해야 함. 

반응형
,
반응형

millisecond 형태의 숫자를 Date (yyyymmdd) 형태로 바꾸어서 보여주어야 하는 경우가 있었다. 


new Date(millisecond)와 같이 변환을 하면되는데, 나는 yyyymmdd만 보고 싶은데 어떤 시간대인지까지 모든 정보가 포함되어 표시가 되게 된다.


문자열 자르는게 익숙한 분들은 그렇게 하면되는데, 난 문자열 가지고 이리저리 조잡하게 하는걸 싫어하기 때문에, 알아본 결과 Date에 내장함수처럼 포함을 시켜버리는게 가장 편했던 것 같다.


Date.prototype.yyyymmdd = function() {         
         var yyyy = this.getFullYear().toString();                                    
         var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
         var dd  = this.getDate().toString();             
                             
         return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};  


 


이런 형태로 선언해 놓으면, date 타입을 가진 모든 객체에서 위 함수가 이용이 가능하다. 

하지만 이것도 결국 내부적으로는 문자열 자르는 조잡한걸 한다는게 함정. 

 

예전 유지보수 할 때 prototype이 뭔가 했었는데, 이제야 알게 된 것 같다. 

반응형
,
반응형

ajax통신을 마친 이후, success callback에서 현재 객체(this)의 상태값을 바꾸어야 하는 경우가 있을 수 있다.


하지만, jquery에서 제공하는 $.ajax의 경우 success callback을 등록하면, this에 response데이터가 들어간다.


이런 경우에 context: this라고 $.ajax통신 시에 argument로 포함해서 던지면,

proxy 형태로 가져올 수 있도록 처리가 되어, callback에서도 사용가능하도록 세팅이 된다.


아래와 같이!



$.ajax({
      url: 'item/get'
      , type: 'post'
      , dataType: 'text'
      , data: data
      , context: this    // 이걸 추가해야됨.
      , success: function(response) {
                   // 여기서 this를 사용하고 싶음!
      }
      , error: function(e) {
           console.log(e);
     }
});
반응형

'개발 > Front-End' 카테고리의 다른 글

[Jqplot] 실시간 차트 구현  (0) 2016.06.10
[Javascript] 날짜 포맷 변환  (0) 2016.06.10
[CSS] 텍스트 말줄임  (0) 2016.06.10
[HTML] favicon 추가  (0) 2016.06.10
[JavaScript] byte formatter  (0) 2016.06.10
,
반응형

아래와 같이 스타일을 추가한다.


<style>
    .vf_ellipsis { 
         overflow:hidden; 
         text-overflow:ellipsis; 
         -o-text-overflow:ellipsis; 
         -ms-text-overflow:ellipsis; 
         white-space:nowrap; 
         position:relative; 
         float:left;
         width:auto; 
         max-width:360px; 
    }
</style>



실제 사용은 <p class="vf_ellipsis">입력 텍스트</p>


텍스트가 너무 길어지면 ... 으로 표시되어, UI가 깔끔해진다.

반응형
,
반응형
<link rel="shortcut icon" type="image/png" href="favicon.ico"/>

HEAD 태그에 위 구문만 넣어주면 된다.

href에는 웹주소도 가능함.


사이즈는 16 * 16에 png형식으로 만들어주어야 함.

반응형
,
반응형

SVN에 있는 폴더 및 파일을 트리구조로 보여주고, 다운로드를 할 일이 생겼는데,

Size정도는 보여주어야 할 것 같아서, 가져와보니 byte형식이었다.


그래서 편의를 위해 MB, KB... 정도는 보여주어야 한다는 욕심때문에, 검색해보니 역시나 있었다.


아래와 같이 function을 구현해서 사용하면 잘 나온다.



function bytesToSize(bytes) {
    var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
    if (bytes == 0) return '';
    var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
    if (i == 0) return bytes + ' ' + sizes[i]; 
    return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
};
반응형
,
반응형

ajax를 이용하여, file upload를 할 때, 아무런 옵션을 주지 않고 send하게 되면, illegal invoice 어쩌고하는 오류가 발생할 수 있다.


이런 경우 아래와 같이 contentType, processData를 false로 해주면, 에러가 발생하지 않고 업로드가 잘 되는 걸 볼 수 있다.



 var data = new FormData();
    $.each($('#file_id')[0].files, function(i, file) {          
        data.append('file', file);
        });

    $.ajax({
        url: 'api/fileupload'
        , type: 'post'
        , dataType: 'text'
        , data: data
        , cache: false
        , contentType: false
        , processData: false
        , error: function(e) {
            console.log(e);
        }
    });    
반응형
,
반응형

가끔 일을 하다보면 HTML내에서 또 HTML파일을 생성해달라고 하는 (HTML파일 제작툴?) 요청사항이 올 때가 있습니다. 

 

그런 경우에 zxml이라는 라이브러리를 이용해서 구현이 가능합니다.

 

다운로드 : http://www.nczonline.net/downloads/

 

압축파일로 되어 있고, 압축을 풀면, sample 소스 등이 나오는데,

실제로 우리가 필요한 건 zxml.js 파일 하나 뿐입니다.

 

DOM방식으로 구현을 해야되서, 소스가 지저분해질 수 밖에 없더군요.

(다른 좋은 방법이 있으면 소개좀.. ㅠㅠ)

 

간단하게 예제코드를 통해 작성법을 소개하도록 하겠습니다.

 

아래 html 코드를 zxml을 통해 만들어 보도록 하겠습니다.


<head>
<title>test</title>
<meta http-equiv="Cache-Control" content="no-cache" />
</head>
// document 생성
var oXmlDom   = zXmlDom.createDocument();
 
//  
var htmlContainer  = oXmlDom.createElement("html");
 
// <head> </head>
var headContainer  = oXmlDom.createElement("head");

// <title>test</title>  
 var titleContainer  = oXmlDom.createElement("title");
// 태그 사이에 값을 넣어주는 역할
 titleContainer.appendChild(oXmlDom.createTextNode("test"));
 
// <meta />
 var metaContainer  = oXmlDom.createElement("meta");
// <meta http-equiv= /> : 속성 추가
 var attHttpEquiv = oXmlDom.createAttribute("http-equiv");
// 추가된 속성에 값 추가 <meta http-equiv="Cache-Control" />
 attHttpEquiv.value = "Cache-Control";
// meta태그에 위 속성 적용
 metaContainer.attributes.setNamedItem(attHttpEquiv);
// <meta http-equiv="Cache-Control" content="no-cache" /> 위와 동일
 var attContent  = oXmlDom.createAttribute("content");
 attContent.value = "no-cache";
 metaContainer.attributes.setNamedItem(attContent);
 
// <head> 안에 title과 meta를 추가
headContainer.appendChild(titleContainer);
headContainer.appendChild(metaContainer);
 
//  안에 head 추가
htmlContainer.appendChild(headContainer);
 
// document에 html 추가
oXmlDom.appendChild(htmlContainer);
 
// 리턴
return oXmlDom.xml;
반응형

'개발 > Front-End' 카테고리의 다른 글

[Jquery] $.ajax 사용 시 success callback에서 this 객체 사용하기  (0) 2016.06.10
[CSS] 텍스트 말줄임  (0) 2016.06.10
[HTML] favicon 추가  (0) 2016.06.10
[JavaScript] byte formatter  (0) 2016.06.10
[Jquery] Ajax Fileupload Option  (0) 2016.06.10
,
반응형