Kendo UI의 그리드를 사용할떄


특정 값이 들어오면 그리드의 내용을 다른것으로 바꾸는 방법에 대해 알아보자.



예를들어 값이 0으로 들어오면 '미사용'  1로 들어오면 '사용' 이런식으로 말이다.


일반적으로 DB에서 값이 0으로 들어오면 0으로 1로 들어오면 1로 표기가 되는데


켄도의 템플릿(template) 기능을 사용하면 좀더 다양하게 활용이 가능 하다



일반적인 켄도 그리드의 컬럼 설정 스크립트이다.


1
2
3
4
5
columns: [
             {field: "code_ID", width:"80", title: "코드 ID"},
            {field: "code_NAME", width:"130", title: "코드 명칭"},
            {field: "code_TYPE", width:"80", title: "사용여부"}
        ]
cs


위와 같이 필드 아이디와 타이틀 정도만 설정을 해주면


해당 오브젝트의 값이 그대로 들어가게 된다.



템플릿을 이용해 사용여부 code_TYPE에 값이 0으로 들어오면 미사용 1로 들어오면 사용 이라고 표현하기 위한 코드는



1
2
3
4
5
6
columns: [
             {field: "code_ID", width:"80", title: "코드 ID"},
            {field: "code_NAME", width:"130", title: "코드 명칭"},
            {field: "code_TYPE", width:"80", title: "사용여부",
             template:kendo.template("#if (code_TYPE == 0) {# #='미사용'# #} else if(code_TYPE== 1 ){# #='사'# #} else {# #='NFC'# #} #")}
        ]
cs



컬럼을 만들어주는 객체에 template라는 것을 추가해고


위와 같이 코딩하게 되면 IF문을 사용하여 code_type의 값에 따라 다른 내용을 출력 할 수 있게 된다.



템플릿을 사용하면 그리드를 다양하게 활용 할 수가 있다.


개발자가 DB에서 단순 데이터를 출력하기 위해


오라클에서는 DUAL 이라는 아래와 같이 임시의 가상 테이블을 사용한다.



1
2
3
4
/*Orecle*/

SELECT
    SYSDATE
FROM
    DUAL
cs

오라클에서 단순히 현재 시간데이터만을 출력하기 위한 쿼리이다.


그러나 MS SQL에서는 DUAL이 없다


그렇다면 MSSQL에서는 어떻게 출력해야 하나


답은 아주 간단하다


1
2
/*MS SQL*/

SELECT
    getdate() A
cs


위와같이 작성하면 A라는 컬럼명으로 현재 시간이 나타난다.


어차피 존재하지 않는 테이블이기 때문에 from 테이블명을 사용하지 않고


바로 출력하는 것 같다.


제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다


테이블의 값을 변경하기 전에 해당 인덱스의 값이 있는지 확인 하고


insert하거나 update 하는 방법입니다.


ms sql의 exists를 활용하여 아래와 같은 쿼리문을 작성 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
IF EXISTS(
               해당 데이터가 존재 하는지 셀렉트
         )
    BEGIN
        --데이터가 있는 경우 실행할 쿼리
    END
    
    ELSE
        BEGIN
        --데이터가 없는 경우 실행할 쿼리
       END
cs

EXISTS 안에 확인할 데이터를 셀렉트 하는 쿼리를 넣고


데이터가 있는경우와 없는경우 실행할 쿼리를 작성 하면 됩니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
IF EXISTS(
                SELECT CODE_ID FROM tbl
                WHERE CODE_ID = 'code_001'
         )
    BEGIN
        SELECT 99 cnt
    END
    
    ELSE
        BEGIN
        insert into tbl
            (
            DEVICE_ID
              ,CODE_ID
              ,CODE_NAME
            )
        values
            (
              ,'device_001'
              ,'code_001'
              ,''
            )
       END
cs



위의 코드는 code_id라는 컬럼에 code_001이라는 데이터가 있는지 확인하고


있다면 99라는 숫자를 반환하고


없다면 데이터를 입력하게 하는 쿼리 입니다.



insert가 아닌 update도 사용 가능하며 일반 select문도 가능합니다.



값을 입력할때 있는지 확인하기 위해서 컨트롤러에서 DOA까지 두번이나 왕복할 필요가 없겠죠


제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다


개발할때마다 가장 귀찮았던 것 중 하나는 천단위마다 콤마를 찍어주는 것이었다.


처음엔 문자열로 변환하고 글자 개수를 세고 3개를 기준으로 앞뒤를 잘라서 분리하고


그사이에 콤마를 집어넣는 아주아주 귀찮은 방법을 사용했다가


정규식을 사용하여 아주아주 간편하게 천단위마다 콤마를 찍어줄수 있다는걸 알게 되었다.


로직은 굉장히 간단하다.


1
2
3
4
function numbeComma(number) {
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
 
cs


이게 끝이다.


그동안의 천단위 콤마찍는 귀찮음에서 한번에 해방되는 느낌이다.


예전에 인터넷 돌아다니다 발견했던건데


이거 만든 사람 상줘야 한다.


정규식이라는 개념을 만들어낸 사람도 참 대단하다. 스크립트에서도 그렇고 SQL에서도 그렇고


요즘 정규식이라는걸 참 유용히 잘 사용하고 있다.

쿼리를 작성하다 보면 부등호 (>,<) 를 사용해야 할 때가 있다. 그러나 mybatis에서 사용하면 에러가 나는데


이때 해결방법을 알아 보자.




쿼리에 부등호 기호를 사용하면  


The content of elements must consist of well-formed character data or markup.


라는 경고문구가 나타나기도 한다.


부등호 이외에도 '&' 같은 특수기호에서도 나타난다


이때 해결방법은 간단하다


<![CDATA ]]> 를 사용하면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="loadCartList"  parameterType="userInfoVO" resultType="cartVO">
    
    <![CDATA
    SELECT
        *    
    FROM
        table_name
    WHERE
        coulumA < 10
    AND 
        coulumB > 4
    ]]>
    </select>
cs



이렇게 쿼리를 CDATA로 감싸주면 된다.


혹은


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="loadCartList"  parameterType="userInfoVO" resultType="cartVO">
    
    SELECT
        *    
    FROM
        table_name
    
    WHERE
    <![CDATA
        coulumA < 10
    AND 
        coulumB > 4
    ]]>
    </select>
cs




이런 식으로 사용 할 수도 있다.



방금 댓글을 남겨주신 분이 추가 정보를 달아주셨다


> - &gt;
< - &lt;
>= - &gt;=
<= - &lt;=


CDATA를사용하지 않고 저렇게 HTML에서 사용하던 방식으로도 치환이 가능 하다



1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="loadCartList"  parameterType="userInfoVO" resultType="cartVO">
    
    SELECT
        *    
    FROM
        table_name
    
    WHERE
        coulumA &lt; 10
    AND 
        coulumB &gt; 4
    </select>
 
cs



MariaDB의 외래키 설정을 하던중 처음 보는 에러 메세지가 나타났다


mysql foreign key constraint is incorrectly formed



외래키가 올바르지 않다 뭐 이런 의미인것 같아 저 에러창이 떴던 이유를 찾아보니


1. 한쪽은 not Null 인데 한쪽은 null 허용일때


다시말해 대상이 되는 키가 null이면 참조할때 문제가 발생할수 있기 때문에 나타나는 에러이다.



2. 참조되어지는 컬럼이 PK,unique가 아닐때

 외래키로서의 기능에 에러가 날수 있기 때문에 저 에러 메세지가 뜬다고 한다.


생각해보면 맞는 말이긴 하다.



 

[MySql] , [MaraiaDB] 한로우에 있는 값을 구분자를 이용해 여러 로우로 출력하는 방법.



text_column 

개발자,연봉,올려줘,야근,하기,싫어



한 컬럼 한 로우에 값이 위와 같이 있을떄


기본적으로 출력을 하면 하나의 로우로 출력을 하게 된다.


만약 저 택스트를


text_column 

개발자 

연봉 

올려줘 

야근 

하기 

싫어 




위와 같은 여러줄의 로우로 출력을 하고 싶을때가 있다.


그럴때 사용하는 쿼리는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
 
select
   SUBSTRING_INDEX (SUBSTRING_INDEX(테이블명.컬럼영,'구분자',numbers.n),'구분자',-1) 컬럼명
          
from 
   (select  1 n union  all  select 2  
    union  all  select  3  union  all select 4 
    union  all  select  5  union  all  select  6
    union  all  select  7  union  all  select  8 
    union  all  select  9 union  all  select  10) numbers INNER  JOIN 테이블명
    on CHAR_LENGTH ( 테이블명 . 컬럼영 ) 
      - CHAR_LENGTH ( REPLACE ( 테이블명 . 컬럼영 ,  '구분자' ,  '' ))>= numbers . n-1
cs



방법을 몰라서 구글링하고 스택오버플로우를 뒤지다가 발견한 쿼리다.



답변을 달아준 peterm 에게 감사한다.


왜 위와 같은 쿼리를 사용했을때 로우를 나눠서 출력해주는지는 모르겠으나


추가적으로 발견한건


union all select 숫자 << 이 유니온 올 해준 개수만큼 구분자로 구별해 로우로 만들어 준다는 것을 알아냈다.


만약 유니온올을 3개만 했을땐  위의 결과값이


개발자

연봉

올려줘


까지 밖에 나오지 않는다.


아마도 유니언 all을 해서 여러 로우를 임의로 만들어 준다음


구분자로 분리시킨다음 해당 로우에 순서대로 넣어 주는것 같다.


저렇게 검색했을 경우 공백로우값도 함꼐 나타나게 되는데


그럴땐 조건문에 아래와같은 조건을 추가해주면 해결된다.


1
 WHERE SUBSTRING_INDEX ( SUBSTRING_INDEX ( SEARCH_TAG_HISTORY . SEARCH_TEXT ,  ' ' , numbers . n ),  ' ' ,  -1 ) != ' '
cs


Mysql과 MariaDB에서 like와 in을 동시에 사용한 것과 동일한 결과를 출력하는 방법



다른 DBMS는 모르겠지만 mysql에서는 like와 in을 함께 사용 할 수가 없다. 물론 마리아DB도 마찬가지로 사용을 할 수 없다. 


 그러나 개발을 하다보면 like와 in을 동시에 사용할 수 있으면 좋겠다는 생각을 하게 되는데


그에 대한 해결책이다.


방법을 몰라 애멀게 구글에서 like in만 주구장창 검색을 하다가 겨우 찾아낸 방법이다


그리고 이렇게나 간단한 방법이 있는데도 내가 몰라서 개고생 한걸 생각하면 역시 머리가 나쁘면


손발이 고생한다는 말을 되뇌이게 된다.


매우 간단한 방법이다.



1
2
3
4
5
6
7
    SELECT  
             SEARCH_TEXT
        FROM
            search_tbl
        WHERE
               SEARCH_TEXT REGEXP  '헤이|모두들|안녕|내가|누군지|아니'
    
cs




위와 같이 조건을 주게 되면 REGEXP라는 정규식을 사용하면 


like 와 in을 동시에 사용한것과 같이 데이터 베이스의 search_tbl이라는 테이블 안에 있는  SEARCH_TEXT라는 컬럼 로우에


헤이, 모두들, 안녕, 내가, 누군지, 아니   이 6개 단어중에 하나라도 포함이 된 로우는


전부 출력을 해주게 된다.


지저분하게 검색조건에 like를 몇개씩 늘이지 않아도 된다.


저걸 like만으로 사용하게 된다면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        SELECT  
             SEARCH_TEXT
        FROM
            search_tbl
        WHERE
            SEARCH_TEXT like '%헤이%'
        OR
            SEARCH_TEXT like '%모두들%'
        OR
            SEARCH_TEXT like '%안녕%'
        OR
            SEARCH_TEXT like '%내가%'
        OR
            SEARCH_TEXT like '%누군지%'
        OR
            SEARCH_TEXT like '%아니%'
    
cs


이런 장황한 쿼리가 되어 버린다.



REGEXP를 사용하는 정규식에 대해선 아직 잘 모르지만 급하게 like와 in을 동시에 사용 하는 방법과


비슷한 결과를 원한다면 몰라도 원하는 값만 출력해준다면 가져다 쓰면 유용할 듯 하다.


여기에 조금더 응용을 하게 되면 REGEXP 다음에 나오는 정규식을 서브쿼리를 이용해 만들 수도 있다


예를 들어 아래와 같은 쿼리를 구현할 수가 있다


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
        SELECT  
             SEARCH_TEXT
        FROM
            search_tbl
        WHERE
               SEARCH_TEXT REGEXP (
                                        select
                                            REPLACE(GROUP_CONCAT(TAG_NAME),',','|') AS NAME
                                        from
                                            (
                                                SELECT
                                                    DISTINCT TAGLIST.TAG_NAME,
                                                    TAGLIST.ROOT_TAG
                                                FROM
                                                    ITEM_LIST LIST
                                                JOIN
                                                    ITEM_LIST TARGET
                                                ON
                                                    TARGET.ROOT_TAG = LIST.ROOT_TAG
                                                WHERE
                                                    TARGET.TAG_NAME like '조건1'
                                                OR
                                                    TARGET.TAG_NAME like '조건2'
                                                 
                                            ) selectTagList
                                        )
cs



문자열을 바꿔주는 REPLACE와 값을 이어주는 GRUOP_CONCAT 함수를 사용하며


서브쿼리로 정규식의 모양새를 만들어주고 그 결과로 조건을 만드는 방법이다.


REPLACE와 CONCAT함수는 sql 쿼리 작성시에 유용하게 자주 사용되니 알아두자


제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다


select 와 option은 웹사이트를 구현할때 아주 많이 사용되며 유용한 태그 이다.


append 함수와 empty함수를 사용해 셀렉트박스 안에 있는 선택 옵션들을 HTML에 고정으로 만들어 두는 것이 아닌


특정 이벤트가 앞에 있는 셀렉트박스의 다른 값을 선택할때마다 동적으로 내용이 바뀌게 하는 방법을


알아 보도록 하자.



예를들어 1번 셀렉트 박스와 2번 셀렉트 박스가 있을떄


사용자가 1번 셀렉트 박스의 값을 선택할때마다 2번 셀렉트 박스의 선택 옵션의 내용이 바뀌도록 말이다.


혹은 1번 셀렉트 박스의 값이 바뀔때마다가 아닌 그 어떠한 이벤트라도 가능 하다.



1
2
3
4
5
6
7
8
<select id="select1" onchange="itemChange()">
<option>키보드</option>
<option>마우스</option>
<option></option>
</select>
 
<select id="select2">
</select>
cs


먼저 위와 같은 코드로 셀렉트 박스가 2개 있을때


1번 셀렉트 박스의 값이 바뀔때마다 2번 셀렉트 박스의 옵션들이 바뀌도록 만들어 보자




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
function itemChange(){
 
var keyboard = ["갈축","청축","적축"];
var mouse = ["광마우스","유선마우스","비싼마우스","미키마우스"];
var monitor = ["17인치","22인치","24인치","26인치"];
 
var selectItem = $("#select1").val();
 
var changeItem;
 
if(selectItem == "키보드"){
changeItem = keyboard;
}
else if(selectItem == "마우스"){
changeItem = mouse;
}
else if(selectItem == "모니터"){
changeItem =  monitor;
}
 
$('#select2').empty();
 
for(var count = 0; count < changeItem.size(); count++){                
                var option = $("<option>"+changeItem[count]+"</option>");
                $('#select2').append(option);
            }
 
}

cs

   


여기서 주목할 것은


empty()와 append 이다



기존에 들어가 있는 2번 셀렉트 박스 안의 옵션들을 깨끗하게 지우기 위해서 empty함수를 사용 하였고


append 함수를 이용해 셀렉트 박스 안에 만들어진 option을 삽입한 것이다.


이를 응용하면 Ajax를 이용해 위의 스크립트와 같은 하드코딩이 아닌 좀더 다이나믹한 웹서비스를 제공해 줄수도 있다.







JSTL IF, ELSE IF(choose)문 사용 방법.



HTML 페이지를 만들때 굉장히 유용하게 사용하는 JSTL 중에서도 가장 많이 쓰는


IF문의 사용에 대해서 알아보자


1. 단순 IF


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<c:set var="data" value="안녕" />
 
<c:if test="${data eq '안녕'}">
    안녕을 출력 합니다.
</c:if>
 
<!-- 서버에서 result 라는 데이터를 modell을
     통해서 받아 사용하는 경우 (EL 태그 사용) -->
 
<c:if test="${result.data eq '안녕' }">
    안녕을 출력 합니다.
</c:if>
 
<!-- 서버에서 두개의 데이터
    result1과 result2 를 받아서 비교 할때(EL 태그 사용) -->
 
<c:if test="${result1.data eq result2.data}">
    두개의 데이터가 일치 합니다.
</c:if>
cs



위와 같이 사용 할 수 있다.


2. if else , choose문


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<c:set var="data" value="개발자" />
 
<c:choose>
 
    <c:when test="${name eq '개발자'}">
        개발자 입니다.
    </c:when>
 
    <c:when test="${name eq '사장'}">
        개발자가 아닌 사장 입니다.
    </c:when>
 
    <c:otherwise>
        아무것도 아닌 사람 입니다.
    </c:otherwise>
 
</c:choose>
cs
d

if else라는 표현을 사용 하는것이 아닌


choose 라는 문법을 사용한다.




3. 비교 연산자


1) eq (==)


두 값이 동일 할때


2) ne ( !=)


동일 하지 않을때


3. empty ( == null)

값이 null 일때


제 포스팅이 도움이 되었나요? 

그렇다면 공감하기 한번 눌러주세요 블로거에게 큰 힘이 됩니다


+ Recent posts