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

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
Posted
Filed under C#

간혹 출력한 엑셀데이터를 서버에 다른 환경에서 사용해야 할 경우 아무래도 시트명으로 읽어 들여야
하기 때문에 서로 업무상, 시트명을 통일하거나 아니면 입맛에 맞게 바꿔야하는경우 가 있다.
(지정하지 않으면,일반적으로  파일명이 시트명이 된다.)

기본 서버객체를 이용하지 않는 이상, 시트명은 지정이안된다, 그럼 서버객체를 이용하면 되지 않느냐?
이용해도 되지만 , 서버에 설치 와 권한 설정 등..귀차니즘 발동, 물론 업무에따라 중요도에 따라 서버객체를
를 이용해도된다. 

(아래는 서버 객체를 이용하지 않고 http header를 이용해서 웹문서를 엑셀문서로 출력시킨다.)

아래는 Http Header 를 excel 로 지정하고 ,  xml로 문서의 포맷을 정하고 html로 출력하여 Excel 문서로 인식하게끔 fake? 하게한다.



<%   
     //  Classic ASP  , ASP.Net , PHP , JAVA 등  서버단 코드에 맞게 엑셀 헤더 설정 
     //  아래 파랑색 코드 그대로 복사 붙이기한후 맨 아래는 기존에 Table 그대로 출력해준다
     //  아래 빨강색 sheet1 부분만 필요한 이름으로 수정
%>
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:LastAuthor>JUBOB</o:LastAuthor>
  <o:Created>2999-09-02T07:46:35Z</o:Created>
  <o:LastSaved>2999-09-02T07:46:35Z</o:LastSaved>
  <o:Version>10.2625</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:DownloadComponents/>
  <o:LocationOfComponents HRef="file:///I:\"/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>sheet1</x:Name>
    <x:WorksheetOptions>
     <x:DefaultRowHeight>270</x:DefaultRowHeight>
     <x:Selected/>
     <x:DoNotDisplayGridlines/>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>12720</x:WindowHeight>
  <x:WindowWidth>24960</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>30</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
 </x:ExcelWorkbook>
</xml><![endif]-->
</head>
<body>
      <Table> 
         <tr>
                <td> 테이블로 만든 데이터 그대로 출력</td>
         </tr>
      <Table>
</body>
</html>
2018/03/21 14:31 2018/03/21 14:31
Posted
Filed under MSSQL
WITH  [임의의명칭] AS ( 사용하고픈 쿼리 ) 
select * from [WITH 에 서 만들어진 임시테이블 활용]


여러 쿼리 WITH 로 쓸경우 ( 컴마로 구분하여 연속적으로 작성한다 마치 WITH 만 생략된 느낌)
WITH [임시테이블명칭] AS (  ~ 사용하고픈  쿼리 ~ )
, [임시테이블 별칭] AS ( ~ 사용 하고픈 쿼리 ~)  
, [임시테이블 별칭] AS ( ~ 사용 하고픈 쿼리 ~)
select * from [WITH 에 서 만들어진 임시테이블 활용]
select * from [WITH 에 서 만들어진 임시테이블 활용]
→ 여기 (다음) 쿼리에서 활용하면 오류남 (WITH 마지막 쿼리만 유효)


1개의 테이블에서 쿼리된 집합결과를 별칭으로 사용
WITH USER1 AS
(
      select * from t_user where regDate = '2018-01-01'
)
select * from USER1


2개의 쿼리를 연결해서 각각의 별칭의 테이블로 사용하기
WITH USER1 AS
(
          select top 10 * from t_user where RegDate > '2018-01-01' and RegDate < '2018-02-01'
) , USER2 AS
(
          select top 10 * from t_user where RegDate > '2018-02-01' and RegDate < '2018-03-01'
( select * from USER1 )
   union
( select * from USER2 )




2개의 쿼리를 연결해서 각각의 별칭의 테이블로 사용 후 조인
WITH USER1 AS
(
          Select top 10 userid from t_user where RegDate > '2018-01-01' and RegDate < '2018-02-01'
) , USER2 AS 
(
     Select top 10 userid from t_user where RegDate > '2018-02-01' and RegDate < '2018-03-01'
) , USERTOT AS 
(
     (select * from USER1)
         union all
     (select * from USER2)
)
 select  UserName  from t_user A  right outer join USERTOT B on A.UserId = B.UserId 

WITH 로 만들어진 별칭에 대해서는  집합의 개념으로 테이블과 같이 다루어 질수있다.
목적에 따라 다르겟지만, 임시 데이터 활용을 위해 임시테이블(세션,메모리,뷰) 을 더 이상 안만들어도 되겟다.
2018/03/20 17:10 2018/03/20 17:10
Posted
Filed under MSSQL
일반적으로 프로그래밍에서 데이터 validation 이나 값의 체크는 DB 단보다는 유저인터페이스인 
어플단에서 1차적으로 필터링을 한다 하지만 Db 프로그래밍에서의 If 문 또한 자주이용하곤하는데

if 문 대신 case 문을 활용하기도 한다. 뭔가 좀더 간렬함 때문인데 , 아래 코드를보면
아래코드는 @a 의 값에 따라 @b 에 값을 할당하는 예제이다.

declare @a tinyint
declare @b char(3) 

set @b = '000' -- 기본으로  
set @a = 4  -- 일부러 없는 값을 넣음


if @a = 1  
   set @b = 'aaa'

if @b = 2 
  set @b = 'bbb'

if @c = 3
  set @b = 'ccc'

select @b  --  @b는?? 당연히  '000' 출력 너무 당연하다

이제 case when ~ then ~ 문을 살펴보자 

declare @a tinyint
declare @b char(3) 

set @b = '000' -- 기본으로  
set @a = 4  -- 일부러 없는 값을 넣음


set @b= case  

                when @a = 1 then 'aaa' 
                when @a = 2 then 'bbb'
                when @a = 3 then 'ccc'
End

select @b  -- @b 는?? Null 을 출력한다.

안타깝게도 case 문에서는  조건에 만족하는 값이 없으면 null 을 리턴한다.
그럼 난 리턴이 아닌 기본값 '000' 을 받고싶다면 아래와 같이 else 문을 활용하여야한다

set @b= case  
                when @a = 1 then 'aaa' 
                when @a = 2 then 'bbb'
                when @a = 3 then 'ccc'
             else @b   -- else 만 추가, 또는 else '000' 초기값 
End

select @b  -- @b 는 정상적으로 '000' 출력한다.

이번 아티클은 if / case 문법이나 용도를 몰라서라기보다,
case 문을 case 처럼(?) 사용하면 잘쓰는데, if 문 처럼(?) 쓰다보면  행하는 실수를 끄적여봣다.
2018/03/15 13:51 2018/03/15 13:51