정렬을 할 때, 단순히 오름차순이나 내림차순이 아닌 특정 조건을 기준으로 정렬을 해야하는 경우가 있다.

이런 경우에 ORDER BY부분에서 DECODE나 CASE를 이용하여 표현할 수 있다.


1. CASE 사용방법

SELECT *

  FROM 테이블명

 ORDER BY (

 CASE 컬럼명

 WHEN 조건A THEN 1

 WHEN 조건B THEN 2

 ELSE 3

 END

 )


사실 SELECT 부분에서 많이 사용하는 형태로 익숙한 형태이긴 한데, 정렬부분에서 사용한 적이 없어서 익숙하지 않은 느낌이 들었다.

THEN과 ELSE뒤에 숫자는 출력 순서를 나타낸다.


2. DECODE 사용방법

SELECT *

  FROM 테이블명

 ORDER BY DECODE(컬럼명, 조건A, 1, 조건B, 2, 3)


위의 CASE로 정렬한 것과 같은 내용이며, 역시 숫자는 출력 순서를 나타낸다.

 AngularJS를 제대로 알기 전 개념을 잡는 내용이다.


이전 게시글 클로저(Closures) 개념을 이해하고 난 뒤, 모듈패턴을 공부하면 더 쉬울 거 같다.


모듈패턴은 코드 관리 기법 중 하나로 객체 핸들링을 위한 방법 중 하나이다.

객체에 유효 범위를 줘서 private이나 public과 같은 접근 제한자와 같은 효과를 줄 수 있도록 캡슐화 할 때 사용한다.

그리고 모듈은 자체적으로 필요한 내부 변수 및 함수를 모두 가지고 있어야 성립한다.


아래의 예제는 모듈패턴 중 기본적인 형태를 가진 것이다.

var module = (function() {

var cnt = 0;

return {

incCnt : function() {

return cnt++;

},

decCnt : function() {

return cnt--;

}

}

})();


return이 되는 영역은 public으로 만들어 접근이 가능하고, return 문맥전의 공간은 클로저가 형성되면서 private 영역이 된다. 즉, 외부에서 직접적으로 cnt 변수에 접근하지 못하므로 cnt 변수는 private 영역에 있는 것과 같은 것이다.

모듈패턴이 클로저와 가장 다른 점은 모듈패턴의 return 값은 변수가 아닌 객체이며, 자동호출이 된다는 것이다.


AngularJS를 본격적으로 시작하기 전에 자바스크립트 패턴 이해에 필요한 개념 중 하나인 클로저(Closures)에 관한 내용을 정리


클로저는 외부 함수의 변수에 접근하기 위해 내부 함수를 사용하는 것이다.

클로저는 스코프체인에서 하나의 스코프를 생성해주는 개념으로 생각할 수도 있다.


여기서 스코프(Scope)를 알고 있어야 하는데, 간단하게 스코프(Scope)란 유효범위를 말하는 것으로, 변수 사용 가능 여부를 영역을 구분짓는 것으로 이해하면 쉽다. 그리고 자바스크립트에서는 함수만이 유효범위의 단위가 될 수 있다.

유효범위를 나타내는 스코프(Scope)가 프로퍼티(property)로 각 함수 객체 내에서 연결리스트 형식으로 구성되는데, 이를 스코프체인이라고 한다.

각각의 함수는 자신이 생성된 스코프체인을 참조하여 값을 가지게된다. 함수가 실행되면서 실행 컨텍스트가 생성되고, 이를 바탕으로 새로은 스코프체인을 만들게 되는 것이다. 이 개념을 생각하면 스코프체인 안에 다른 스코프 체인이 존재할 수도 있게 된다.


다시 클로저로 돌아가서.

내부함수는 외부함수의 변수도 접근이 가능하지만 파라미터 값으로도 접근이 가능하다. 단, 배열과 같은 객체에는 접근이 불가능하다. 따라서 클로저는 이런 특징을 이용하여 내부함수로 외부함수를 활용하는 방법이다.


아래에 간단한 예제를 확인해보도록 하자.


function outer() {

var cnt = 0;                                        → ①

var inner = function() {                        → 

return cnt++;

}

return inner;                                       → 

}


var inc = outer();                                     → 


inc();        // cnt === 1                            → 

inc();        // cnt === 2


위의 예제가 클로저를 알기 위한 가장 간단하고 대표적인 예제이다.

①은 outer 함수의 로컬(local) 변수이다. 변수 앞에 var는 변수를 선언하여 지역변수로 사용할 때 사용이 되며, 선언된 위치에 따라 변수의 스코프(scope)를 예측할 수 있다. 예를 들어 함수 내에서 var를 이용하여 변수를 선언해 사용하면 해당 변수의 사용 범위는 함수 내이다. 하지만 var가 없을 경우 전역변수로 사용할 수 있다.

②는 outer 함수의 로컬(local) 함수이다. 해당 함수의 경우 함수 안에 존재하는 함수이므로 외부에서 바로 접근이 불가능하며, 외부 함수로 우선 접근하여 내부 함수로 접근이 가능하다.

③에서 outer 함수 결과를 리턴한다. 리턴 값이 존재하지 않는 클로저(Closures)도 존재한다.

④에서 outer 함수를 호출한다. outer 함수를 호출할 경우 ③에서 리턴 된 함수가 ④에서 선언한 변수 inc에 저장된다.

⑤에서는 inc에 저장된 함수의 내부 함수인 inner 함수를 호출하여 접근한다.


위의 예제를 이용할 경우 outer 함수를 변수로 선언하여 사용할 때, 해당 변수를 이용하면 이전에 사용했던 cnt 변수에 계속 접근이 가능하다. 또한 inner 함수를 이용하여 변수 조작도 가능하다.

일반적인 스코프(scope)의 개념에서 볼 때, ④, ⑤와 같이 outer 함수 외부에서 함수의 로컬(local) 변수인 cnt로 접근하여 해당 변수의 값을 계속 가지고 있으면서 사용하기란 어렵다. 하지만 위의 예제와 같이 클로저(Closures) 개념을 사용하면 private 개념 적용이 가능하다.


 정리 내용.

특징 

1. 클로저는 function 안에 function이 존재할 때 생성된다.
2. 함수가 정의된 스코프(scope) 이외의 곳에서 사용될 때, private 처럼 사용이 가능하다.
3. 전역변수 사용을 억제하고 변수간의 충돌을 막을 수 있다. 이로인해 이벤트, 애니메이션에서 효과적으로 함수 사용이 가능하다.


단점

1. 메모리를 소모한다.
2. 스코프(scope) 생성에 따른 퍼포먼스 손해가 있다.
3. 직관적인 이해가 어려워 정확한 주석이나 문서와 같은 내용으로 정리를 해두는 것이 좋다.


오라클에 데이터를 넣을 때, 다양한 데이터가 들어갈 수 있지만 textarea와 같은 곳에 들어간 내용은 줄바꿈이 필요할 경우가 있다.

기본적으로 개행을 삽입하기 위해서 아래와 같이 표현할 수 있다.


UPDATE 테이블 명

SET '안녕'||CHR(13)||CHR(10)||'하세요'

WHERE 조건


결과값 : 

안녕

하세요


*) CHR()은 숫자를 아스키코드로 변환해주는 함수이며,

CHR(13) : carriage return(캐리지 리턴) > 현재 라인의 첫 번째 자리에 커서를 위치

CHR(10) : new line(라인 피트) > 커서 위치를 아래쪽으로 이동

각각 위와 같은 의미를 가지고 있으므로 현재 라인 첫번째 자리에서 아래로 커서가 이동하여 '\n'과 같은 줄바꿈을 확인할 수 있다.



반대로 개행을 제거하기 위해서는 아래와 같이 replace를 이용하여 처리할 수 있다.


replace(컬럼명, CHR(13) || CHR(10), '')

replace(replace(컬럼명, CHR(10), ''), CHR(13), '')



javascript에서 URL 파라미터를 가져올 일이 있어서 찾게 되었다.

내가 받은 URL의 형식은

http://highello.tistory.com?param=hi

의 형태로 하나의 값만 가져오면 되는 형태였다.


var param = $(location).attr('search').slice($(location).attr('search').indexOf('=') + 1);


결과값 : hi


위와같이 사용하였다.


물론 많은 값을 가져오는 다양한 방법이 있지만 결과 값으로 'hi'라는 값만 가져오면 되는 경우였기에 위와같이 사용하였다.

더 많은 parameter를 가져오기 위해서는 위의 방법을 사용하는 것이 적절하지 않다.

물론 위의 내용을 조금 수정하여 Parameter로 들어온 값만 가져와서 변경하여 사용하는 것은 가능하다.


JSTL을 사용하면서 필요에 의해 찾게 된 기능 중 하나가 바로 숫자 포맷을 맞추는 것이다.

연도, 월을 선택하는 select 박스를 만들던 중 1월에서 9월까지를 01월에서 09월로 표현하기 위해 찾았다.


우선 사용을 위해서는 상단에 taglib을 추가해야하는데, 추가할 taglib은 아래와 같다.

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

위의 taglib을 추가하였으면 fmt JSTL을 JSP에서 사용할 수 있다.


월을 두자리 숫자로 나타내기 위해 사용한 formatNumber은 아래와 같다.

<fmt:formatNumber value='month' pattern='00' />


물론 실제 사용할 때는 selected의 option부분을 forEach문을 이용하여 사용하였기에 value에는 forEach문의 변수가 들어가도록 넣었다.

그리고 selected의 값을 위해 if를 사용하여 비교(선택된 값인 month변수의 값이 있는 경우)를 하였다.

<c:forEach var="i" begin="1" end="12">

<option value="<fmt:formatNumber value='${13 - i}' pattern='00' />"

<c:if test="${13 - i eq month*}">selected="selected"</c:if>>

<fmt:formatNumber value='${13 - i}' pattern='00' />

</option>

</c:forEach>

기존에 숫자 포맷을 맞출 필요가 없을 때는 해당 부분에 <c:out>을 사용하여 값을 보여줬었다.


*) 위에 type은 정의하지 않았는데 number를 기본 값으로 가지며, number, percent, urrency가 존재한다.


JSTL을 이용하여 합계를 구하는 방법이 필요할 때가 있다.

(기본적으로 <c:set>, <c:out>을 사용한다.)


개인적으로는 forEach문과 함께 사용하는 경우가 많은 것 같다.

보통 가장 우측이나 하단에 합계에 관련되어 숫자를 계산하기에 적합하다.


아래 형태는 우측에 합계를 나타낼 때 자주 사용할 수 있는 형태이다.

<c:forEach items="${output}" var="data">

<c:set var="row_sum" value="0" />

<tr>

<td>

<c:set var="row_sum" value="${row_sum+ data.num_1}"

</td>

<td>

<c:set var="row_sum" value="${row_sum+ data.num_2}"

</td>

……

<td>

<c:set var="row_sum" value="${row_sum+ data.num_n}"

</td>

<td>

<c:out value="${row_sum}" />

</td>

</tr>

</c:forEach>


아래 형태는 하단에 합계를 나타낼 때 자주 사용할 수 있는 형태이다.

<c:set var="col_sum" value="0" />

<c:forEach items="${output}" var="data">

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_1}"

</td>

</tr>

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_2}"

</td>

</tr>

……

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_n}"

</td>

</tr>

</c:forEach>

<tr>

<td>

<c:out value="${col_sum}" />

</td>

</tr>


두가지 모두를 사용해서 한 테이블을 나타낼 수도 있고, 각각 필요한 걸 사용할 수도 있다.

굳이 <c:set>이 <td>안에 들어가지 않더라도 사용하는데는 문제가 없으나 기본 위치를 저렇게 생각하고 사용하면 개인적으로 편리한 것 같다.

우측 합계와 같이 변수를 따로 몇개 더하지 않아도 된다면 굳이 <c:set>을 사용하지 않고, <c:out>안에서 더하더라도 상관 없을 것 같다.

크롬을 새로 설치하여 사용할 경우 늘 검색시 새 탭으로 여는 설정을 하려고 찾는다.

매번 같은 작업을 하는데도 매번 헷갈려서 헤맨다.

기본적으로 크롬을 이용할 경우 링크 된 걸 클릭하면 새탭에서 뜨는 것이 아니라 검색했던 화면에서 바로 이동이 된다.

이 경우 그 탭을 실수로 꺼버리거나 검색된 사이트에서 많은 페이지 이동이 있으면 검색 목록으로 돌아가는데 어려움이 있다.

새 탭에서 창을 띄우기 위해 컨트롤 키(CTRL)를 누르고 링크를 누르면 새 탭에서 창이 뜬다.

하지만 매번 컨트롤 키를 누르고 링크를 누르는 수고로움을 감수할 필요는 없다.


새 탭으로 열기를 하기 위해서 일단 구글에서 아무 단어로든 검색을 하면 검색 목록을 확인할 수 있다.

이때 검색 창 우측 방향에 보면 설정을 확인 할 수 있다.

설정을 누르면 아래로 리스트가 뜨는데 여기서 '검색 환경설정'을 눌러 들어가면 된다.



화면에 들어가면 아래와 같은 화면이 보이게 된다.



검색 설정 하단에 검색결과 여는 창이라는 목록을 확인 할 수 있다. 여기서 하단에 있는 선택한 검색결과를 새 브라우저 창에서 열기로 선택(기본적으로 체크가 되어있지 않다.)하여 저장을 누르면 설정이 끝난다. 이 후, 검색을 해서 링크를 클릭해보면 새 탭에서 그 링크가 뜨는 것을 확인할 수 있다.



앞서 작성했던 글과 마찬가지로 구글에서 제공하는 Analytics API 예제(v3)를 사용해 쿼리를 작성하는 방법을 적어보려한다.

API로 원하는 값을 얻기 위해서는 계정 연동 이후, 쿼리를 정확히 보내야 한다.


쿼리를 무작정 만들어 보내는 것 보다 구글에서 계정 ID를 확인 하기에 유용했던 사이트 처럼 쿼리의 결과값을 확인하기에 좋은 사이트가 존재한다.

https://ga-dev-tools.appspot.com/query-explorer/


페이지를 가면 해당 화면을 확인 할 수 있다.

다만 조건은 현재 입력해 놓은 것이므로 다를 수 있는데, 쿼리에 보낼 ids는 위에 select a view 부분에서 사이트를 찾으면 변경 가능하다.

start-date와 end-date는 today, NdaysAgo와 같은 형식으로 사용 할 수 있으며, 정확한 날짜 입력을 원할 경우 YYYY-MM-DD형식으로 입력이 가능하다.


날짜 아래의 parameter들은 텍스트 박스를 누르면 셀렉트 박스처럼 변수들이 보이게 되는데, 여기서 원하는 변수를 골라 클릭하면 된다.

변수에 대한 설명은 아래 사이트에서 상세히 확인할 수 있다.

(사실 설명을 읽어도 바로 이해하기가 어려운 부분이 있어서 궁금하면 한 번 적용해보는게 확인이 더 빠른 것 같다.)

https://developers.google.com/analytics/devguides/reporting/core/dimsmets


그리고 Run Query라고 적힌 파란색 버튼을 누르면 화면 하단에 결과값이 확인된다.

구글로 보내진 쿼리와 쿼리로 받아온 결과값을 확인할 수 있다.



실제 예제에 쿼리를 작성하는 방법은 위의 화면으로 확인한 결과가 원하는 결과를 준다면 실제 예제에서 아래와 같이 적용할 수 있다.



날짜의 경우 차이가 있지만 '7daysAgo'대신 '2017-02-08'과 같이 값을 바꿔 넣으면 된다.

다면 sort에서 확인할 수 있듯이 문자입력시 이스케이프 문자를 넣어 '\문자'를 입력해주어야하는 것일 잊지 말자.

Google Analytics API를 사용하면서 가장 기초적으로 필요한 내용이 다양한 사이트 중 내가 원하는 사이트의 통계를 가져오는 것이다.

사이트를 하나만 관리할 경우 한 사이트의 통계만 가져오면 되므로 신경을 쓰지 않아도 되지만, 그렇지 않을 경우 원하는 사이트의 통계를 가져와서 확인을 해야한다.


제일 먼저 해야 할 일은 각 사이트의 VIEW ID를 가져오는 것이다.

VIEW ID의 경우 추적 ID와는 다르며, 숫자로만 이루어져있다.

https://ga-dev-tools.appspot.com/account-explorer/


위에 연결된 URL로 들어가면 다음과 같은 화면을 확인 할 수 있다.

Account, Property, View 세가지 셀렉트 박스가 있는데 원하는 사이트를 선택하면 아래에

Account, Property (Tracking ID), View, Table ID (ids)를 확인 할 수 있다.


여기서 기존에 제공되는 예제에서 변형하여 사용하기 위해서 필요한 것은 세번째에 있는 View에 있는 숫자로 된 ID이다.


예제 소스 중


해당 부분을 찾았으면 위의 View 값을 대체해서 넣으면 된다.

126번째 라인에 firstProfiledId에 보면 response에 첫번째 아이템의 아이디를 가져오도록 되어있다.

이 부분에 확인할 사이트의 View를 넣고 실행을 실행을 시키면 원하는 사이트의 통계가 나오는 것을 확인할 수 있다.


위의 예제대로 실행을 할 경우

예제를 확인하면 ID가 6066으로 끝나는 것을 확인 할 수 있다.

다른 사이트를 확인하기 위해 다른 사이트의 아이디를 넣으면


끝자리가 4766으로 끝나느 것을 확인 할 수 있다. 그리고 결과 값으로 나온 세션의 값도 달라진 것을 확인할 수 있다.


*) 개인적으로 다양한 사이트를 활용해서 사용할 경우 사이트 마다 매칭되는 각 변수를 만들어 변수에 화면의 View 값을 하나씩 넣어두고, 조건에 따라 넣어 사용하도록 하는 방식이 제일 유용하게 활용할 수 있는 방식이라 생각한다.

+ Recent posts