제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under jQuery

ng-bind 는 angular 의 변수 또는 model 과 연결되는 M-V 의 연결역할을 하는 Directive 이다. 또는, 인터폴레션으로 {{ }} 작성해도 같은 효과를 본다. 근데 공부를 하다보니 , 네임설정에 있어. period 가 들어간 네임이 작동하거나 , 안하는 경우가 있어, 정리해 두기로 했다.

# ng-bind 네임설정  #1  "일반적인 영문 / 영+숫자" 
<body ng-app="myApp">
        <div ng-controller="myCtrl">
            <div>name : <span ng-bind="name"></span></div>            
            <div>name : <span ng-bind="name12"></span></div>            
        </div>
          
        <script type="text/javascript">
                var m = angular.module("myApp" , []);    
                m.controller("myCtrl" , function($scope)
                {                    
                    $scope.name = "pluginn";     // 정상 작동
                    $scope.name12 = "pluginn12"  // 정상 작동
                });
        </script>
</body>
단,네임설정에있어, 숫자만으로 이루어진 명칭 또는 영문+숫자 혼용이 아닌 숫자+영문 인 경우 , 프로그램의 기초와 같은 개념을 갖고있어, 작동되지 않는다. (예, 1111,2342 , 11name  ,11price  모두 오류)


# ng-bind 네임설정  #2   "period 를 붙인 네임 name.nickname "
<body ng-app="myApp">
        <div ng-controller="myCtrl">      
            <div>name.nickname : <span ng-bind="name.nickname"></span></div>            
        </div>
          
        <script type="text/javascript">
                var m = angular.module("myApp" , []);    
                m.controller("myCtrl" , function($scope)
                {                    
                    $scope.name.nickname = "plug~ plug~"; // 오류발생 작동하지 않음
                });
        </script>
</body>
으잉 안된다 이상하네, 아래를 보자.

# ng-bind 네임설정  #3   "period 를 붙인 네임 name.nickname "  by ng-model
<body ng-app="myApp">
        <div ng-controller="myCtrl">      
           <input  type="text" ng-model="name.nickname"/>
            <div>name.nickname:<span ng-bind="name.nickname"></span></div><!-- 정상작동 -->
            <div>{{name.nickname}}</div> <!-- 정상작동(인터폴레이션)-->
        </div>
          
        <script type="text/javascript">
                var m = angular.module("myApp" , []);    
                m.controller("myCtrl" , function($scope)
                {                    
                   //  angluar 가 제어할수있도록, 컨트롤 등록만 해준다
                });
        </script>
</body>
음, ng-model 로 설정된 이름이는 객체처럼 접근이되는 네임이 가능하다. 그럼 예제를 하나더 들어보자


# ng-bind 네임설정  #3   "period 를 붙인 네임 name.nickname "  by Array
<body ng-app="myApp">
        <div ng-controller="myCtrl">     
            <div>name.nickname:<span ng-bind="name.nickname"></span></div> <!-- 정상작동-->
            <div>{{name.nickname}}</div> <!-- 정상작동(인터폴레이션)-->
        </div>
        <script type="text/javascript">
                var m = angular.module("myApp" , []); 

                m.controller("myCtrl" , function($scope)
                { 
                          var name = { nickname : "pluginn" };
                          $scope.name = name;               
                });
        </script>
</body>
작동된다. 결국 period(.) 의 의미는 프로그래밍에서와 마찬가지로 객체의 속성접근으로 봐야한다.
네임에는 . 를 사용하지 말자 , 

ng-Model (예, ng-model="name.first") 또는 배열과같은 객체명의 속성 성격의 period 네이밍은 가능하나, 변수명  자체로서의 period 사용은 자제하기로 하자. 일반적인 프로그래밍에서이 사용방법과 딱히 다를것이
없다.
2018/04/05 13:21 2018/04/05 13:21
Posted
Filed under jQuery
# ng-if
 ng-if  구문안의 조건이 맞으면 본인을 show 틀리면 hide
<body ng-app="myApp">
                <input type="text" ng-model="sbtxt" value="">
                <div ng-if="sbtxt == 'red' ">빨강색</div>
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-switch on ~ ng-switch-when 문

 ng-switch on 에 연결된 ng-model 의 value 에 따라 ng-switch-when 조건에 설정된
 블럭들이 show/hide 됨 , 아래 예제
<body ng-app="myApp">

                <select id="sb" ng-model="sbcolor">
                    <option value="">선택</option>
                    <option value="1">red</option>
                    <option value="2">green</option>
                    <option value="3">blue</option>                                        
                </select>

                <div ng-switch  id="aa" on="sbcolor">                 
                  <div ng-switch-when="1" class="box red"></div>
                  <div ng-switch-when="2" class="box green"></div>
                  <div ng-switch-when="3" class="box blue"></div>
                  <div ng-switch-default class="box black"></div>
                </div>
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">

                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-show , ng-hide
ng-show 구문 안의 조건이 맞으면 자신을 show 틀리면 hide 한다.
ng-hide   구문안의 조건이 맞으면 자신을 hide 하고 틀리면 show 한다.
<body ng-app="myApp">

                <input type="text" ng-model="sbtxt" value="">

                <div ng-show="sbtxt=='red' ">빨강색 O</div> <!-- 참이면 보임  -->
                <div ng-hide="sbtxt=='red' ">  빨강색 X</div>  <!-- 참이면 숨김 -->
          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>


# ng-class
ng-class 구문안에 조건에 만족하면 선언한 클래스가 블럭에 적용된다.
ng-class = "{클래스명 : 조건 , 클래스명 : 조건 , 클래스명 : 조건.......}"
<style type="text/css">
    .red {color:#F00}
    .green {color:#0F0}
    .blue {color:#00F}
</style>
<body ng-app="myApp">
       <input type="text" ng-model="sbtxt" value="">
       <div ng-class="{red : sbtxt == 'red' , blue : sbtxt == 'blue' }">안녕하세요</div>          
        </div>
       <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
        <script type="text/javascript">
                var myApp = angular.module('myApp', []);
        </script>
</body>
2018/04/04 14:03 2018/04/04 14:03
Posted
Filed under MSSQL
MSSQL 프로그래밍에세  꽤나 많은 부분을 CRUD 구현하는데, 많은 문장을 작성해 나간다.
WITH 가 Select 에 최적화되어 있다면 MERGE 조인된 테이블의 Insert / Update /Delete 를 구현하는데 최적화 되어있다고 보면 좋겠다.

# MERGE 의 기본 문법 및 의미
MERGE  [Target_Table]  AS TT   -- TT 는 [Target_Table] 의 alias
USING  [Source_Table]  AS TS   -- TS 는 [Source_Table]의 alias
ON ( TT.Column1 = TS.Column1 )  

WHEN MATCHED 
          THEN  [Target_Table]에 대한 처리

WHEN NOT MATCHED BY TARGET   AND  TS.RegDate > '2018-01-01'
           THEN 
[Source_Table] 에 있고 , [Target_Table] 에 없으면, [Target_Table] 에  Insert / Update

WHEN 
NOT MATCHED  BY SOURCE  AND  TT.RegDate < '2018-01-01'
          
THEN  [Source_Table] 에 없고,  [Target_Table] 에 있으면,   [Target_Table]  꺼 처리  Delete / Update

OUTPUT   $action , inserted.* , deleted.*  ;   //  로그보기  MERGE문의 종료는  반디스 세미콜론을  해주어야 한다.
(inserted 는 insert / update 둘다의 의미를 가지고 있으므로 , 따로 updated는 없다.)


2개의 연관된 테이블의 데이터가 "NOT MATCHED" 이긴한데 명시적으로 아래와같이 이용때
  BY TARGET   :  Source 에는 있고, Target 에 없으면
  BY SOURCE  :  Source 에는 없고, Target 에 있을때

 주의  :  WHEN MATCHED 를 제외하고  WHEN NOT MATCHED BY TARGET  처리시  WHEN NOT MATCHED  BY SOURCE 조건도 만족한다면 2개처리한다.   (WHEN MATCHED 를 제외)
1개의 WHEN 조건을 처리하고 종료하는 구조가 아님 , TARGET 과 SOURCE를 2개다 처리하게된다.

예를 들어 BY TARGET 처리 후 BY SOURCE 조건도 만족한다면 SOURCE 조건도 처리함 (코드의 순서와 관계없음)




# 테스트 테이블 및 데이터 만들기
-- 테이블 생성
create table #tbl1 (
 idx tinyint ,  name varchar(20) )
create table #tbl2 ( idx tinyint ,  name varchar(20) )


-- 더미 INSERT
insert #tbl1 values( 1 , 'aaa')
insert #tbl1 values( 2 , 'bbb')

insert #tbl2 values( 3 , 'ccc')
insert #tbl2 values( 4 , 'ddd')
insert #tbl2 values( 5 , 'eee')

-- 데이터 확인
select * From #tbl1
go
select * From #tbl2


# 간략하게 MERGE 이용
MERGE #tbl2 As TT -- Target
USING #tbl1 As TS -- Source
ON (TT.idx = TS.idx)
-- Source 에는 있고 Target 에 있으면, Source 참조로 UPDATE
WHEN MATCHED 
THEN UPDATE SET TT.NAME = TS.NAME
WHEN NOT MATCHED -- BY TARGET 생략시  NOT MATCHED BY TARGET  과 동일
THEN INSERT (idx ,name ) values(TS.idx , TS.name)




# BY TARGET  ,BY SOURCE 를 이용하여, 명시적으로처리
MERGE #tbl2 TT -- Target
USING #tbl1 TS -- Source
ON (TT.idx = TS.idx)
-- Source 에는 있고 Target 에 있으면, Source 참조로 UPDATE
WHEN MATCHED 
THEN UPDATE SET TT.NAME = TS.NAME

-- Source 에는 있고 Target 에 없으면, Source 참조로 Target 에INSERT
WHEN NOT MATCHED BY TARGET  -- AND TS.idx = 5  조건 추가 할 수 있음
THEN INSERT (idx ,name ) values(TS.idx , TS.name)

-- Source 에는 없고, Target 에 있으면 Target 에 Delete or Update
WHEN NOT MATCHED BY SOURCE -- AND TT.idx  >= 2 조건 추가 할 수있음
THEN Delete   -- or THEN UPDATESet idx = 1000 
OUTPUT   $action , inserted.* ,   deleted.*;   -- 로그사용

위 쿼리 실행 


[#tbl1 과 #tbl2 원본 Select]



[위의 Merge 실행후 Log]



[최종결과]
빨강네모 -  NOT MATCHED BY TARGET   - Insert
파랑네모 - NOT MATCHED BY SOURCE  - Delete




[최종결과]

빨강네모 -  NOT MATCHED BY TARGET   를 통해 Insert 만하고 종료하지 않고 ,
파랑네모 - NOT MATCHED BY SOURCE  조건도 만족하는것을 감지하는순간 Delete 도 동시에 처리한다.

정리하자면,
일단 Merge ~ Using ~ On 조건을 통해 Not Matched 조건이 발생하면 1개의 Not Matched(BY TARGET) 의 조건만
처리하지 않고, 
처리 후 다른 Not Matched(BY SOURCE) 조건에 만족하면 연속해서 발생한다.
( 위에 2조건을 만족하게되면 MATCHED 도 만족하게 되지만,  MATCHED 는 일어나지 않음 )
2018/04/02 18:27 2018/04/02 18:27
Posted
Filed under jQuery

모듈로 다루어지는 angular 에서는 각 콘트롤별로 $scope 라는 일종에 개체를 가지게 되는데, 개인적으로는  this 와 꽤
비슷한 느낌이다. (물론 개념적으로는 다르다)

각각의 controller 들은 각각의 $scope 와 연결되어 MVC 를 오가며, 데이터를 전달하고 연결한다. 하지만 각각의 $scope 는 다른 $scope 즉 컨트롤들의 영역을 공유할 수 없다. 간혹 각각 다른 $scope 간의 데이터를 주고 받아야할때가 있는데,  그리도 지금 소개할 ,  $emit , $on , $broadcast 를 활용하는 방법이다.
(단, DOM 구조상 부모 $scope 인 경우,  자식 $scope 의 바인드 변수 접근이 가능함)

간단하게 보자면,
- 같은 노드위치의 $scope 끼리는 $scope 로 데이터를 전달할 수 없다.
- 자식 $scope 에서 부모 $scope 의 함수 및 변수를 호출 할수 있다, (단, 변경할 수 는 없다.)

자식 $scope에서 $emit  메소드를 통해 부모의 이벤트 함수를 호출하여 값을 전달하고, 값을 받은 부모는 다른 자식 $scope의 이벤트 함수를 호출해서 값을 전달해준다.

설명보다는 예제를 통한 설명이 쉬울꺼같아 예제의 주석으로 설명을 대체한다 (나중에 개인적으로 꺼내봤을대도 쉽다 --)

 <!DOCTYPE html>
<html>
<head>
<!-- https://cdnjs.com/libraries/angular.js/ -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.5/angular-cookies.min.js"></script>
</head>
<body ng-app="scopeTest">
          <div ng-controller="ncParent">
                    <div ng-controller="ncChild1">
                              ncChild1-var1 : <span ng-bind="var1"></span> /
                              ncChild1-varA : <span ng-bind="varA"></span>
                    </div>
                    <div ng-controller="ncChild2">
                              ncChild2-var1 : <span ng-bind="var1"></span> /
                              ncChild2-varB : <span ng-bind="varB"></span>
                    </div>
                    <div ng-controller="ncChild3">
                              ncChild3-var1 : <span ng-bind="var1"></span> /
                              ncChild3-varC : <span ng-bind="varC"></span>
                    </div>

                    <button ng-click="fnBroadCast()">자식에게전달</button>
</div>
<!--
          $on("이벤트명" , function(event, data) {})
          $emit() - 특정 범위를 이벤트로 부모에게 전달. - ($rootScope가 아닌 DOM 구조의 부모 이벤트 호출)
          $broadcast() - 특정 범위를 모든 자식에게 전달.- 부모(DOM) 하위 자식의 이벤트 함수 호출
          $emit("호출이벤트명" , 전달할데이터) 
          $broadcast("호출할 자식의 이벤트명" , 전달할데이터) 
          $on , $emit , $broadcase 메소드 메커니즘
          1) 자식1 본인 값을 $emit() 통해 부모에게만, 전달하고 
          2) 그 값을 받은 부모는 $broadcast 로 자식의 이벤트 함수들을 모두 호출
          부모가 $boardcase 로 호출 당하고 싶은 자식들은 $on 메소더를 구현해야놔야한다.
          1)ncChild1 에서 부모로 scope을 전달
          2)ncParent는 $on() 메소드를 사용하여 이벤트를 감지
          3)ncParent가 전달받은 값(범위)을 $broadcast() 메소드를 사용하여 자식요소로 전달

 -->
<script lang="javascript">
var app = angular.module("scopeTest" , []);
app.controller("ncChild1" , function($scope)
{
         $scope.var1 = "Pluginn";
         $scope.$emit("sendVar1" , $scope.var1); // 자신의 부모 이벤트함수(sendVar1) 호출
         $scope.$on("getVar1" , function(event ,data)
         {
                  $scope.varA = data;
         });
});
app.controller("ncChild2" , function($scope)
{
         // 부모로부터 $broadcast 될 함수
         $scope.$on("getVar1" , function(event, data) 
         {
                  $scope.varB = data;
         });
});
app.controller("ncChild3" , function($scope)
{
         // 부모로부터 $broadcast 될 함수
         $scope.$on("getVar1" , function(event , data) 
         {
                  $scope.varC = data;
         });
});
app.controller("ncParent" , function($scope)
{
         $scope.$on("sendVar1" , function(event ,data)
         {
                  // tes1, test2, test3의 parent $scope 로써 자식 $scope 의 binder 접근가능
                  // 자식의 var1 변수로 모두 접근되는것을 볼수있다.
                  $scope.var1 = data;
         });
         $scope.fnBroadCast = function()
         {
                  alert("전달");

                  // 자식 $scope 에 등록된 이벤트 함수를 호출 
                  $scope.$broadcast("getVar1", $scope.var1);   
         }
});
</script>
</body>
</html>
2018/03/27 17:09 2018/03/27 17:09
Posted
Filed under MSSQL
생성된 파일그룹 안에 포함된 파일이 삭제가 안될때.,,

 Alter database [partitionDB] remove file [partitionDB_FG5]  -- 파일  삭제시도
파일그룹
'partitionDB_FG5'(비어있지않으므로제거할수없습니다
. -- 오류발생
 

-- DB 축소실행 ,
DBCC SHRINKFILE ('partitionDB_FG5' ,EMPTYFILE);  -- 그룹의  파일명(물리 파일명 아님)
 
-- 삭제 재시도,
Alter database [partitionDB] remove file [partitionDB_FG5]  -- 삭제 완료

삭제완료, 이제  [FG5] 파일그룹에 [partitionDB_FG5] 를 다시 추가해보자
-- DB 축소 명령어 후 partitionDB_FG5 파일을 FG5그룹에 다시 추가하려고하는데, 

Alter DataBase [partitionDB] add FileGroup [FG5]
Alter DataBase [partitionDB] add File  (Name ="partitionDB_FG5", FileName = "물리파일") 
                                                                                                              To FileGroup  [FG5]

Backup log 를 실행하여  .. 어쩌구 저쩌구 ... LSN .... 오류발생

그럴땐, Log 파일 까지 비워줘야 한다. 로그파일 축소 (MSSQL 2008 이전과 이후 버전 방법이 다르다 아래참고)

[ MSSQL 2008 이전 ]
---------------------------------------------------------------------------------------------------------------------------------------------
BACKUP LOG [DB명] WITH TRUNCATE_ONLY -- DB 로그 축소
BACKUP LOG [DB명] WITH NO_LOG -- DB 로그 삭제

[MSSQL 2008 이후]
---------------------------------------------------------------------------------------------------------------------------------------------
ALTER DATABASE
 [partitionDBSET RECOVERY SIMPLE  -- 복구모델 SIMPLE 로변경

DBCC SHRINKFILE([partitionDB_log])  -- 로그 축소 (로그명)
ALTER DATABASE [partitionDBSET RECOVERY FULL -- 복구모델 다시 FULL 로 변경




-- 다시 파일그룹에 추가해보자 
Alter DataBase [partitionDB] add FileGroup [FG5]
Alter DataBase [partitionDB] add File  (Name ="partitionDB_FG5", FileName = "물리파일") 
                                                                                                              To FileGroup  [FG5]

sp_helpfile
go
sp_helpfilegroup

 잘 된다..
 
2018/03/22 17:51 2018/03/22 17:51