Let's say we have a table team_person as below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+======+===========+
| team |    person |
+======+===========+
|   A  |      John |
+------+-----------+
|   B  |     Smith |
+------+-----------+
|   A  |    Walter |
+------+-----------+
|   A  |     Louis |
+------+-----------+
|   C  | Elizabeth |
+------+-----------+
|   B  |     Wayne |
+------+-----------+
 
 
CREATE TABLE team_person AS SELECT 'A' team, 'John' person
UNION ALL  SELECT 'B' team,  'Smith' person
UNION ALL  SELECT 'A' team,  'Walter' person
UNION ALL  SELECT 'A' team,  'Louis' person
UNION ALL  SELECT 'C' team,  'Elizabeth' person
UNION ALL  SELECT 'B' team,  'Wayne' person;
cs

 

To select the table team_person with additional row_number column, either

1
2
SELECT @row_no := @row_no+1 AS row_number, team, person
FROM team_person, (SELECT @row_no := 0) t;
cs

* rownum 초기화 : (SELECT @row_no := 0) t;

 

OR

1
2
3
SET @row_no := 0;
SELECT  @row_no := @row_no + 1 AS row_number, team, person
FROM team_person;
cs

 

will output the result below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+============+======+===========+
| row_number | team |    person |
+============+======+===========+
|          1 |   A  |      John |
+------------+------+-----------+
|          2 |   B  |     Smith |
+------------+------+-----------+
|          3 |   A  |    Walter |
+------------+------+-----------+
|          4 |   A  |     Louis |
+------------+------+-----------+
|          5 |   C  | Elizabeth |
+------------+------+-----------+
|          6 |   B  |     Wayne |
+------------+------+-----------+
cs

 

Finally, if we want to get the row_number group by column team

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT @row_no := IF(@prev_val = t.team, @row_no + 11) AS row_number
   ,@prev_val := t.team AS team
   ,t.person  
FROM team_person t,
  (SELECT @row_no := 0) x,
  (SELECT @prev_val := '') y
ORDER BY t.team ASC,t.person DESC; 
 
+============+======+===========+
| row_number | team |    person |
+============+======+===========+
|          1 |   A  |    Walter |
+------------+------+-----------+
|          2 |   A  |     Louis |
+------------+------+-----------+
|          3 |   A  |      John |
+------------+------+-----------+
|          1 |   B  |     Wayne |
+------------+------+-----------+
|          2 |   B  |     Smith |
+------------+------+-----------+
|          1 |   C  | Elizabeth |
+------------+------+-----------+
cs

 

출처 : riptutorial.com/mysql/example/19572/row-number-and-group-by-using-variables-in-select-statement

 

MySQL - Row Number and Group By using variables in Select Statement | mysql Tutorial

mysql documentation: Row Number and Group By using variables in Select Statement

riptutorial.com

developer-jjun.tistory.com/23

 

[MySQL] ROWNUM을 사용하여 번호매기기

MySQL에서 Oracle처럼 ROWNUM 사용법 SET구문을 사용하여 ROWNUM 값을 초기화 후 조회 SET @rownum:=0; SELECT @rownum:=@rownum+1, b.* FROM buyingboard b WHERE절에서 초기화 SELECT @rownum:=@rownum+1, b.*..

developer-jjun.tistory.com

 

 

Posted by 셋부터넷
,

highcharts 작업시 y축 중간라인의 텍스트가 보이지 않는문제 해결

1
2
3
4
5
6
7
Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function(proceed) {
    var path = proceed.apply(this, Array.prototype.slice.call(arguments, 1));
    if (path) {
        path.flat = false;
    }
    return path;
});
cs

 

출처 : stackoverflow.com/questions/52621676/labels-are-not-rendering-for-plotlines-highcharts

 

Labels are not rendering for plotLines highcharts

I'm trying to render plotLines on Highcharts. But somehow I'm not able to render labels on plotLines. Here is the code snippet: var chart = new Highcharts.Chart({ chart: { ren...

stackoverflow.com

 

Posted by 셋부터넷
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    DATE_FORMAT(m1, '%Y-%m') AS standardDate
FROM(
    SELECT 
        ('2020-01-11' - INTERVAL DAYOFMONTH('2020-01-11')-1 DAY) +INTERVAL m MONTH as m1
    FROM(
        SELECT @rownum:=@rownum+1 as m FROM
        (SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4) t1,
        (SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4) t2,
        (SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4) t3,
        (SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4) t4,
        (SELECT @rownum:=-1) t0
    ) d1
) d2 
WHERE m1 <= '2020-09-30' 
ORDER BY m1
cs

 

참고 : stackoverrun.com/ko/q/4011597

 

mysql에서 두 날짜 사이의 월 목록을 얻는 방법

mysql에서 두 날짜 사이의 월 목록을 가져 왔습니다. For Example:My Input is From date 23-01-2013 To Date 01-04-2014 Output Should be Jan 2013, Feb 2013, March 2013, . . . Jan 2014, Feb 2014, Mar 2014, Apr ...

stackoverrun.com

 

 

Posted by 셋부터넷
,

예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
function(chartData) {
    Highcharts.chart('monitoringDonutChart', {
        credits: {
            enabled: false,
            position: {
                align: 'center',
                verticalAlign: 'middle'
            }
        },
        chart: {
            height: 250,
            width: 300,
            marginTop:  null,
            margin: null,
            animation: true,
            events: {
                load: function() {
                    var chart = this,
                    value = 0;
                    chart.series[0].yData.forEach(function(point, index) {
                        if(index == 0){
                            value += point;
                        }
                    });
                    
                    //파이챠트 중간에 텍스트 추가 후 상,하 센터정렬
                    chart.renderer.text(value, nullnull, chart.resetZoom, {
                        }).attr({
                           align: 'center',
                           verticalAlign: 'middle'
                        }).add().css({fontSize: '20px'}).align({
                           align: 'center',
                           verticalAlign: 'middle',
                           x: 0,
                           y: 0
                        }, falsenull);
                    
                }
            }
        },
        title: { 
            enabled: false,
            useHTML:true,
            text: null,
            verticalAlign: 'bottom'
        },
        plotOptions: {
            pie: {
                dataLabels: {
                    enabled: false
                },
                animation: false,
                showInLegend: true
            },
        },
        legend: {
            enabled: false
        },
        series: [{
            name'사용량',
            type: 'pie',
            innerSize: '75%',
            colors: ['#ffcc00''#c0c0c0'],
            data: chartData
        }, ],
    });
}
cs

 

참고)

- 도넛형태 : stackoverflow.com/questions/54434360/aligning-labels-in-highchart-donut

 

Aligning labels in highchart donut

I'm trying to make a highchart donut with a legend on the side, I'm really struggling to get the data labels to be more centered. At the moment each of them are in a different place, an image of

stackoverflow.com

- 중간에 텍스트삽입 : stackoverflow.com/questions/38072913/how-to-add-text-via-chart-renderer-text-in-highcharts

 

How to add text via chart.renderer.text in Highcharts?

I have succeeded adding additional text to my charts, like here. This, I achieved through adding a "function(chart)" to my "var chart = new Highcharts.Chart" $.get('xxx.csv', function(data) { ...

stackoverflow.com

 

- 가운데 정렬 : stackoverflow.com/questions/22310677/add-buttons-in-chart-of-highcharts-at-runtime

 

Add buttons in chart of Highcharts at runtime

I need to add some custom buttons (with onclick events), without overwrite the exporting buttons value, 'cause I wanna include new buttons without lost the custom buttons previously defined in cha...

stackoverflow.com

 

 

Posted by 셋부터넷
,

어느날 아래와 같은 구조를  가진 테이블을

 idx

area1 

area2 

area3 

area4 

area5 

 1

 10

20 

30 

40 

50 

 2

 11

21 

31 

41 

51 

 

 

아래와 같이 변경 해야 하는 경우가 닥치고 말았다

no

position 

value 

 1

 area1

 10

 1

 area2

 20

 1

 area3

 30

 1

 area4

 40

 1

 area5

 50

 2

 area1

 11

 2

 area2

 21

 2

 area3

 31

 2

 area4

 41

 2

 area5

 51

 

해결책 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT
    `no`,
    CASE 
        WHEN x=1 THEN 'area1'
        WHEN x=2 THEN 'area2'
        WHEN x=3 THEN 'area3'
        WHEN x=4 THEN 'area4'
        WHEN x=5 THEN 'area5'
    END `position`,
 
    CASE 
        WHEN x=1 THEN area1
        WHEN x=2 THEN area2
        WHEN x=3 THEN area3
        WHEN x=4 THEN area4
        WHEN x=5 THEN area5
    END `value
FROM (
    select * from default_data a,
    (
        select 1 AS x
        union all select 2 AS x
        union all select 3 AS x
        union all select 4 AS x
        union all select 5 AS x
    ) b
)
ORDER BY `NO`, `NUMBERS` ASC;
cs

 

[출처] Mysql 가로 컬럼 형태를 세로 rows 형태 로 변경|작성자 RS

Posted by 셋부터넷
,

Spring Security 설정 후 로그인을 해보면 아이디나 비밀번호가 틀려도 모두 BadCredentialException만 발생해서 두 가지 에러상황을 따로 처리할 수 없다. 해당 이슈를 구분할 수 있는 setHideUserNotFoundException설정이 기본 true로 설정되어있어 그렇다고한다. 더 강한 보안을 위해서 그렇다고 하는데 잘 이해가 안간다... 

 

암튼 이 설정값은 AuthenticationProvider 생성 시에 false로 수정할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
    DaoAuthenticationProvider bean = new DaoAuthenticationProvider();
    bean.setHideUserNotFoundExceptions(false);
    bean.setUserDetailsService(userDetailsService);
    bean.setPasswordEncoder(passwordEncoder());
    
    return bean;
}
 
@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(this.daoAuthenticationProvider());
}
cs

Security Config 설정파일에서 AuthenticationProvider 생성 시 해당 값을 false로 지정한 뒤 적용한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public void onAuthenticationFailure(
    HttpServletRequest request, 
    HttpServletResponse response, 
    AuthenticationException e) throws IOException, ServletException {
 
    String sErrMsg = "";
    if (e instanceof UsernameNotFoundException) {
        sErrMsg = "존재하지 않는 사용자입니다.";
    } else if (e instanceof BadCredentialsException) {
        sErrMsg = "비밀번호가 틀립니다.";
    } else {
        sErrMsg = "기타 인증오류입니다.";
    }
    
    ...
}
cs

AuthenticationFailureHandler를 구현한 핸들러에서 UsernameNotFoundException을 처리할 수 있다.

 

참고)

cyr9210.github.io/2019/09/30/Security/usernamenotfound/

 

인증 시, UsernameNotfoundException 발생 안함 문제(BadCredentials Exception만 발생)

SpringSecurityDebug인증 시, UsernameNotfoundException 발생 안함 문제(BadCredentials Exception만 발생)

cyr9210.github.io

www.programmersought.com/article/8509702354/

 

2019-01-10 springboot + spring-security The error message when logging in is "Bad Credential" instead of specific information...

In the background, if the username is incorrectly logged in, there is a specific error exception message returned. But in the front-end interface, I only saw "Bad Credential" instead of specific error messages. Keep track of the code and find the problem h

www.programmersought.com

codevang.tistory.com/268

 

스프링 Security_로그인_로그인 실패 대응 로직 [3/9]

- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6..

codevang.tistory.com

 

Posted by 셋부터넷
,

MySQL에서 특정날짜 사이의 날짜 목록 모두 가져오기

1
2
3
4
5
6
7
8
9
select * from 
(select adddate('2010-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where selected_date 
between '2018-09-10' and '2018-10-31'
cs

 

 

참고 : stackoverflow.com/questions/9295616/how-to-get-list-of-dates-between-two-dates-in-mysql-select-query

 

How to get list of dates between two dates in mysql select query

I want list of dates lies between two dates by select query. For example: If i give '2012-02-10' and '2012-02-15' I need the result. date ---------- 2012-02-10 2012-02-11 2012-02-12 2012-0...

stackoverflow.com

 

 

Posted by 셋부터넷
,

출처: https://zamezzz.tistory.com/310 [배워가는블로거]

 

 

너무 많은 데이터 행을 처리할 때는 너무 느리고 모든 데이터를 다루기가 힘듭니다.

 

이를 해결하기 위해서 제공해주는 방법이 바로 server-side processing입니다.

 

 Server-side processing paramter

 

server-side processing은 데이터를 그리기 위해 javascript에서 서버측으로 ajax 요청을 합니다.

 

서버에서는 이 ajax요청을 받아 해당하는 데이터만 다시 리턴해주게 됩니다.

 

그럼 먼저 서버로 보내는 파라미터 종류를 살펴보겠습니다.

 

- draw

  count. ajax요청에 의해 그려질 때 dataTable이 순차적으로 그려지는 것을 보장하기 위해 사용
- start
  페이징 첫번째 레코드 값
- length
  현재 페이지에 그려질 레코드 수
- search[value]
  전체 테이블 데이터 검색을 위한 변수 값
- search[regex]
  전체 테이블 데이터 검색을 정규 표현식으로 처리해야할 경우 사용 디퐅르 false
- order[i][column]
  ordering을 적용해야하는 컬럼
- order[i][dir]
  ordering 방향 (asc or desc)
- column[i][data]
  i번째 컬럼의 데이터 값
- column[i][name]
  i번째 컬럼명
- column[i][searchable]
  i번째 컬럼이 검색이 가능하게 할 것인지 플래그 (t/f)
- column[i][orderable]
  i번째 컬럼이 ordering이 가능하게 할것인지플래그 (t/f)
- column[i][search][value]
  i번째 컬럼의 검색을 위한 변수 값
- column[i][search][regex]
  i번째 컬럼의 검색을 정규 표현식으로 처리할 경우 사용 (false)

 

다음은 리턴되는 파라미터입니다.

- draw
  요청하는 draw와 같은 의미입니다. count
- recordsTotal
  필터링 전 전체 레코드 수
- recordsFiltered
  필터링 후 전체 레코드 수
- data
  테이블에 그릴 데이터 (array)
- error
  error 발생 시 표시할 메시지 (optional)

 

 Server-side processing example

 

이제 실제 사용방법에 대해 예제를 보겠습니다.

 

먼저 html 코드입니다. 별도 데이터를 가져올 필요가 없어 매우 단순해졌습니다.

 

<tbody>부분이 사라졌습니다.

<table id="exampleTable" class="table table-bordered">

  <thead>

    <tr>

      <th>Seq</th>

      <th>Name</th>

      <th>Age</th>

      <th>Date</th>

    </tr>

  </thead>

</table>

 

다음은 js코드입니다. 몇 개의 옵션이 추가되었지만, 그래도 매우 간단합니다.

 

serverside 옵션과 processing 옵션이 추가되었습니다.

$("#exampleTable").DataTable({

    "serverSide": true,
    "processing": true,
    "ajax": {
        "url": "/example",
        "type": "POST",
        "dataSrc": function(res) {
            var data = res.data;
            return data;
        }
    },
    "columns" : [
        {"data": "seq"},
        {"data": "name"},
        {"data": "age"},
        {"data": "date"},
    ]

});

 

필요한 option을 사용했고, "/example" 로 ajax 요청을 하여 dataSrc를 받아옵니다. 

 

그리고 이를 columns으로 넣는 간단한 코드입니다.

 

이제 server 코드를 보겠습니다. 먼저 리턴 데이터를 위한 dto를 구성하겠습니다.

 

return paramters와 같은 모양으로 구현하면 됩니다.

@Data
public class DataTableDto {
    private int draw;
    private int recordsTotal;
    private int recordsFiltered;

    private List data;

    public List getData(){
        if(CollectionUtils.isEmpty(data)){
            data = new ArrayList();
        }
        return data;
    }

}

 

dto를 생성하였으면 이를 이용해 이제 service 로직은 구현해야 합니다.

 

jpa를 사용하는걸로 생각하여 간단하게 구현한 서비스 코드입니다.

@PostMapping(value = "/example")
@ResponseBody
public DataTableDto example(DataTableDto dto, @RequestBody MultiValueMap<String, String> formData){
    int draw = Integer.parseInt(formData.get("draw").get(0));
    int start = Integer.parseInt(formData.get("start").get(0));
    int length = Integer.parseInt(formData.get("length").get(0));

    int total = (int)exampleRepository.count();
    List data = exampleRepository.findData(start, length);

    dto.setDraw(draw);
    dto.setRecordsFiltered(total);
    dto.setRecordsTotal(total);
    dto.setData(data);

    return dto;
}

 

request parameter인 formData는 위에서 설명한 ajax 요청 시 서버로 보내는 파라미터 입니다.

 

여기서 필요한 draw, start, length만 꺼내어 사용했습니다.

 

그리고 DB에서 데이터를 조회하였고, 이를 dto로 다시 조립하여 리턴해줍니다.

 

이를 실행시키면 아래와 같은 테이블이 완성됩니다.

 

이렇게 하면 dataTables의 server-side processing 구현이 완료되었습니다.

 

동적으로 필요한 데이터만 가져와 그려주기 때문에 좋은 성능을 가집니다.

 

하지만 search를 위해서는 추가 구현을 해주어야 합니다. 기본 search는 현재 데이터만을

 

대상으로 제공하기 때문입니다.

 

 

 Server-side processing search

 

search를 위해서는 추가로 몇 개의 파라미터를 더 사용해야 합니다.

 

위의 파라미터에서 살펴보았던 search[value] 를 사용하면 전체 검색이 가능합니다.

 

하지만 column별 검색을 제공하고 싶다면 아래 2개의 파라미터를 사용해야 합니다.

- column[i][searchable] 
- column[i][search][value] 

 

그렇다면 검색을 위해 사용되는 주요 파라미터는 총 5개입니다.

 

draw, start, length, column[i][searchable], column[i][search][value]

 

이 5개를 이용하여 검색예제를 구현해보겠습니다.

 

먼저 검색창 부터 만들어야합니다. 기존 검색창은 따로 컬럼이 구분되어 있지 않아요.

 

그래서 먼저 기본 검색창에 hidden 옵션을 주어 숨기고, 간단한 검색창을 만들었습니다.

 

검색창 hidden 옵션은 이렇게 하시면 됩니다. $("#exampleTable_filter").attr("hidden", "hidden");

 

그리고 커스텀한 검색창은 기호에 맞게 구현하시면 됩니다. 저는 select box를 이용하였습니다.

 

column[i]의 순서대로 0은 seq, 1은 name, 2는 age, 3은 date로 설정하였습니다.

그리고 위 search 버튼의 클릭이벤트는 아래와 같이 작성합니다.

$("#searchBtn").click(function () {
    var numCols = table.columns().nodes().length;
    for(var i=0; i<numCols; i++) { table.column(i).search(''); }

    var searchType = $("#searchType").val();
    var searchValue = $("#searchValue").val();

    table.column(searchType).search(searchValue).draw();
})

 

처음 2줄은 table을 init하는 과정입니다. 기존 검색으로 table의 파라미터에 설정된 다른

 

검색 파라미터 값을 초기화시키는 작업입니다.

 

그리고 dataTable의 search() API를 이용하여 searchType과 searchValue를 서버로 전달합니다.

 

예를 들어 name을 'AAA'로 search를 실행하고 서버에서 전달받은 formData를 log로 찍어보면

 

아래와 같은 모습입니다. 

{
draw=[1], 
columns[0][data]=[seq], columns[0][name]=[], columns[0][searchable]=[true], columns[0][orderable]=[false], columns[0][search][value]=[], columns[0][search][regex]=[false], 
columns[1][data]=[name], columns[1][name]=[], columns[1][searchable]=[true], columns[1][orderable]=[false], columns[1][search][value]=[AAA], columns[1][search][regex]=[false], 
columns[2][data]=[age], columns[2][name]=[], columns[2][searchable]=[true], columns[2][orderable]=[false], columns[2][search][value]=[], columns[2][search][regex]=[false], 
columns[3][data]=[date], columns[3][name]=[], columns[3][searchable]=[true], columns[3][orderable]=[false], columns[3][search][value]=[], columns[3][search][regex]=[false], 
start=[0], length=[10], search[value]=[], search[regex]=[false]
}

 

중간의 columns[1][search][value]=[AAA]가 보이시나요 ?

 

저희가 검색을 위해 사용해야 할 파라미터입니다.

 

String nameParam = formData.get("columns[1][search][value]").get(0);

 

이러한 방식으로 파싱해서 사용하면 됩니다. 그리고 이 변수를 통해 DB셀렉트를 하고

 

필요한 데이터를 리턴해주면 됩니다. 

int total;
List data;


if(nameParam.lenght() > 0) {
    total = (int)exampleRepository.countByName(nameParam);
    data = exampleRepository.findDataByName(nameParam, start, length);
} else {
    total = (int)exampleRepository.count();
    data = exampleRepository.findData(start, length);
}

 

위의 코드를 실행하고 'AAA'를 검색해보면 아래와 같은 결과를 얻을 수 있습니다.

 

 

그리고 필요에 따라서는 multiple search를 할 수 있고 Like 검색 또한 할 수 있습니다.

 

쿼리만 조금 복잡할 뿐 변수를 받아 쿼리를 작성하고 가공한 후 해당 데이터를 리턴해주면

 

되는 모두 동일한 로직입니다. 

 

그럼 dataTables의 server-side processing과 search 에 대한 정리를 마치겠습니다.

 

감사합니다.




'Template > dataTables.js' 카테고리의 다른 글

dataTables.js 사용법 및 예제  (0) 2020.10.06
Posted by 셋부터넷
,

출처 : ponyozzang.tistory.com/220

 

DataTables는 HTML의 <table>을 데이터 그리드 형식으로 사용하기 위한 라이브러리입니다.

장점은 다음과 같습니다.

○표 <table>에 다음과 같은 기능을 빠르게 구현·추가할 수 있다.

・표시 건수 제어 기능

・페이징 기능

・정렬 기능

・필터 기능

・스크롤 기능

○서버에서 테이터(JSON)를 받아 표시할 수 있다. 

○표 디자인이 깔끔하다.(Bootstrap 디자인에도 맞출 수 있음)

라이센스는 MIT이고, 사용하기 위해서는 jQuery가 필요합니다.

 

DataTables의 기본적인 사용방법을 설명하겠습니다.

 

설명 환경

DataTables 사용하기 위해서는 최소한으로 DataTables JS 파일과 CSS 파일, jQuery가 필요합니다.

동작 확인을 바로 확인할 수 있도록 HTML을 사용하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.css"/> 
    <script src="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.js"></script>
    <script>
        jQuery(function($){
            $("#foo-table").DataTable();
        });
    </script>
    <title></title>
</head>
<body>
    <table id="foo-table" class="table table-bordered">
        <thead>
            <tr><th>No</th><th>지역선택</th></tr>
        </thead>
        <tbody>
            <tr><td>1</td><td>서울</td></tr>
            <tr><td>2</td><td>경기도</td></tr>
            <tr><td>3</td><td>충청남도</td></tr>
            <tr><td>4</td><td>충청북도</td></tr>
            <tr><td>5</td><td>전라남도</td></tr>
            <tr><td>6</td><td>전라북도</td></tr>
            <tr><td>7</td><td>경상남도</td></tr>
            <tr><td>8</td><td>경상북도</td></tr>
            <tr><td>9</td><td>강원도</td></tr>
            <tr><td>10</td><td>제주도</td></tr>
            <tr><td>99</td><td>해외</td></tr>
        </tbody>
    </table>
</body>
</html>
cs

 

<table>에 DataTables 적용하기

예를 들어 위 샘플처럼 테이블에 id="foo-table" 이라고 아이디를 지정한 경우에는 다음과 같은 코드로 DataTables을 적용할 수 있습니다.

1
2
3
4
5
<script type="text/javascript">
jQuery(function($){ 
    $("#foo-table").DataTable(); 
}); 
</script>
cs

위 jQuery는 </body> 앞에 넣어주면 됩니다. 

 

jQuery작성 방법은 

1
2
3
jQuery(function($){}) 
$(function((){})
$(document).ready(function(){})
cs

어느것을 사용해도 상관없습니다.

 

주의할 점은 .dataTable() .DataTable()을 주의해야 합니다.

대문자 또는 소문자로 작성해도 동작은 하지만 소문자 .dataTable() 로 작성한 경우에는 반환값이 jQuery 오브젝트이고, 대문자 .DataTable()로 작성한 경우에는 반환값이 DataTable의 API 오브젝트가 됩니다.

.dataTable()의 경우 .dataTable().api()를 사용하여 API 오브젝트를 취득할 수 있습니다.

 

DataTables 기능 및 표시 기능 숨기기

DataTables은 기본적으로 표시 건수, 검색, 정렬, 정보 표시, 페이징 기능이 추가되어 표시됩니다.

번호

 항목

 내용

 1

 표시 건수

 10, 25, 50, 100건 단위로 표시 가능

 2

 검색

 출력된 표에서 검색 가능

 3

 정렬

 클릭하면 열을 오름 차순, 내림 차순으로 정렬

 4

 정보 표시

 표시 건수 등 여러 정보를 표시

 5

 페이징

 1페이지, 2페이지... 등 페이지를 나눠서 표시

 

기능이 필요하지 않는 경우에는 기능을 숨길 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
$("#foo-table").DataTable({
    // 표시 건수기능 숨기기
    lengthChange: false,
    // 검색 기능 숨기기
    searching: false,
    // 정렬 기능 숨기기
    ordering: false,
    // 정보 표시 숨기기
    info: false,
    // 페이징 기능 숨기기
    paging: false
});
cs

 

초기 표시시 정렬하기

DataTables은 초기 표시할 때에도 정렬을 시킬 수 있습니다.

1
2
3
4
5
$("#foo-table").DataTable({
    // 2번째 항목을 오름 차순 
    // order : [ [ 열 번호, 정렬 순서 ], ... ]
    order: [ [ 1, "asc" ] ]
});
cs

 

order는 [ [ 열 번호, 정렬 순서 ], ... ] 형식으로 설정합니다.

・열 번호는 0부터 시작합니다. 0은 1번째 항목, 1은 2번째 항목입니다.

・정렬 순서는 오름 차순 = "asc", 내림 차순 = "desc"로 설정합니다.

・복수의 항목으로 정렬하고 싶은 경우에는 다음과 같이 설정합니다.

 

예문) 1번째 항목은 오름 차순 + 2번째 항목은 내림 차순

1
order:[ [ 0, "asc" ], [ 1, "desc"] ]
cs

 

화면을 초기 표시할 때 정렬을 하고 싶지 않은 경우에는 다음과 같이 설정합니다.

1
2
3
4
$("#foo-table").DataTable({
    // 초기 표시에 경우 정렬 안함
    order: []
});
cs

 

스크롤바 설정(scrollX, scrollY)

표가 화면보다 큰 경우 스크롤바를 추가로 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
$("#foo-table").DataTable({
    // 가로 스크롤바를 표시
    // 설정 값은 true 또는 false
    scrollX: true,
 
    // 세로 스크롤바를 표시
    // 설정 값은 px단위
    scrollY: 200
});
cs

기본 테이블 형식에 스크롤바를 추가하는 작업은 매우 번거롭습니다.

테이블에 스크롤바를 만들어야 할 때 DataTables를 사용하는 것은 간단한 방법 중 하나입니다.

 

DataTables의 넓이 설정

DataTables에서 직접 넓이를 조절할 수 있습니다.

조절할 때에는 columnDefs 사용하여 넓이를 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
$("#foo-table").DataTable({
    // 스크롤바 설정
    scrollX: true,
    scrollY: 200,
 
    // 열 넓이 설정
    columnDefs: [
        // 2번째 항목 넓이를 100px로 설정
        { targets: 1, width: 100 }
    ]
});
cs

targets 설정 방법

종류

 내용

 예

 숫자

 정해진 번호를 설정

 targets: 0

 배열

 복수 사용시 배열 이용

 targets: [0, 1, 2]

 문자열

 설정한 클래스명 설정

 targets: "name-column"

 

컬럼 항목 숨기기 (columnDefs visible)

표에는 표시할 필요는 없지만 값을 저장해둬야 하는 항목이 있는 경우가 있습니다.

또는 기존에 표시되고 있는 항목을 비표시 해야 하는 경우도 있습니다.

이러한 경우 DataTables 설정으로 원하는 열만을 숨길 수 있습니다.

 

열을 숨길 때도 columnDefs 사용하여 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$("#foo-table").DataTable({
    // 스크롤바
    scrollX: true,
    scrollY: 200,
 
    // 열 설정
    columnDefs: [
        // 1번재 항목 열을 숨김
        { targets: 0, visible: false },
    
        // 2번째 항목의 넓이를 100px로 설정
        { targets: 1, width: 100 }
    ]
});
cs

 

표시 건수 설정(lengthMenu/displayLength)

한 페이지에 보여줄 데이터 건수를 정하는 표시 건수 부분도 변경할 수 있습니다.

표시 건수 단위는 lengthMenu로, 표시할 때 보여줄 기본값은 displayLength로 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
$("#foo-table").DataTable({
    // 표시 건수를 10건 단위로 설정
    lengthMenu: [ 10, 20, 30, 40, 50 ],
 
    // 기본 표시 건수를 50건으로 설정
    displayLength: 50, 
    scrollX: true,
    scrollY: 200,
    columnDefs: [
        { targets: 0, visible: false },
        { targets: 1, width: 100 }
    ]
});
cs

 

페이지 수, 표시 건수, 정렬 상태를 보존하기(stateSave)

일람 페이지에서 다른 페이지로 이동한 뒤, 다시 원래의 일람 페이지로 돌아오는 경우에 보고 있었던 페이지나 정렬 상태, 표시 건수들을 저장해뒀다가 다시 보여줄 수 있도록 해줍니다.

1
2
3
4
5
6
7
8
9
10
$("#foo-table").DataTable({
    // 현재 상태를 보존
    stateSave: true,
    scrollX: true,
    scrollY: 200,
    columnDefs: [
        { targets: 0, visible: false },
        { targets: 1, width: 100 }
    ]
});
cs

 

JSON 파일 데이터를 데이터 그리드에 표시하기

아래 샘플과 같은 data.json 이라는 JSON 파일이 있다고 가정하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[
 
    { "id": 1, "name": "서울" },
 
    { "id": 2, "name": "경기도" },
 
    { "id": 3, "name": "충청남도" },
 
    { "id": 4, "name": "충청북도" },
 
    { "id": 5, "name": "전라남도" },
 
    { "id": 6, "name": "전라북도" },
 
    { "id": 7, "name": "경상남도" },
 
    { "id": 8, "name": "경상북도" },
 
    { "id": 9, "name": "강원도" },
 
    { "id": 10, "name": "제주도" },
 
    { "id": 99, "name": "해외" }
 
]
cs

 

JavaScript에서는 아래 샘플과 같이 JSON 데이터를 데이터 그리드에 표시할 수 있습니다.

1
2
3
4
5
6
7
$("#foo-table").DataTable({
    ajax: { url: "data.json", dataSrc: '' },
            columns: [
                { data: "id" },
                { data: "name" }
            ]
});
cs

 

HTML에서는 표의 열은 헤더(<thead>)만 작성하고, 열의 개수는 JavaScript의 columns에서 설정한 개수와 똑같이 작성해줘야 합니다.

1
2
3
4
5
<table id="foo-table" class="table table-bordered">
    <thead>
        <tr><th>No</th><th>지역선택</th></tr>
    </thead>
</table>
cs

 

columnDefs를 사용한 경우에는 아래와 같이 작성하면 됩니다.

(targets 과 data 를 지정)

1
2
3
4
5
6
7
$("#foo-table").DataTable({
    ajax: { url: "data.json", dataSrc: '' },
            columns: [
            { targets: 0, data: "id" },
            { targets: 1, data: "name" }
    ]
});
cs

 

DataTables의 기본적인 사용방법을 알아봤습니다.

 

 

 

 

'Template > dataTables.js' 카테고리의 다른 글

dataTables.js Server-side processing  (0) 2020.10.06
Posted by 셋부터넷
,

Oracle의 계층형쿼리(Connect By Prior~)를 MySQL로 대체하여 표현해보자~

 

ex) 계층구조를 갖는 메뉴데이터를 계층쿼리로 표현

 

-------- 테이블 생성

CREATE TABLE 'tb_addr' (
    'a_idx' INT NOT NULL AUTO_INCREMENT COMMENT '주소번호',
    'a_pidx' INT NOT NULL COMMENT '부모 주소번호',
    'a_title' VARCHAR(100) NOT NULL COMMENT '주소명'
    PRIMARY KEY ('a_idx')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

-------- 쿼리(메뉴 계층구조 표현 및 정렬)

SELECT
  o_title, a_idx, IFNULL(lTB.a_pidx, 0) as a_pidx, IFNULL(cnt, 0) as sub_cnt, path
FROM(
  WITH RECURSIVE tmp1 AS
  (
      SELECT 
        a_idx, a_title, a_title as o_title, a_pidx, 
        a_title AS path,
        CONCAT(a_idx,',',a_title) AS sort_str,
        1 AS lvl
      FROM tb_addr WHERE a_pidx is null
      UNION ALL
      SELECT 
        e.a_idx, e.a_title, e.a_title as o_title, e.a_pidx, 
        CONCAT(t.path,'/',e.a_title) AS path, 
        CONCAT(t.sort_str,'>',CONCAT(e.a_idx,',',e.a_title)) AS sort_str, 
        t.lvl+1 AS lvl 
      FROM tmp1 t 
      JOIN tb_addr e 
      ON t.a_idx = e.a_pidx
  )
  SELECT 
    CONCAT(REPEAT(' ', lvl*4), a_title) as a_title, o_title,
    a_idx, a_pidx,
    path, sort_str, lvl
  FROM tmp1 
) lTB
LEFT JOIN(
  select a_pidx, count(a_pidx) as cnt from tb_addr group by a_pidx
) AS rTB
ON(lTB.a_idx = rTB.a_pidx)
ORDER BY sort_str

Posted by 셋부터넷
,