JKUN

Welcome To The Jkun.net

블로그 포스트 검색결과


전체 에 해당되는 글 477개가 검색 되었습니다.

  1. 2017.07.27 개인정보 - 온라인 쇼핑몰 서버위치에 관하여
  2. 2017.07.21 wrapplyzer 정보 숨기기
  3. 2017.06.21 [Codeigniter] 코드이그나이터 넷빈즈로 개발환경 구성
  4. 2017.06.21 [OA/EXCEL] 엑셀 공백 문자열 및 특수문자 공백 제거 매크로
  5. 2017.06.09 MariaDB - JSON 테이블
  6. 2017.05.22 자바스크립트 오버로딩
  7. 2017.02.02 MySQL 정규식으로 치환 함수
  8. 2017.02.02 UNIXTIME 관련 함수
  9. 2016.10.25 [ER-WIN] Names Option
  10. 2016.10.24 윈도우 콘솔 UTF-8
  11. 2016.09.23 A4 용지 출력
  12. 2016.08.21 [펌] 홍보영상 직접 제작해서 수백만원 절약해보자
  13. 2016.07.26 [펌] NoSQL 종류
  14. 2016.07.26 [JIRA] JIRA REST API 이슈등록
  15. 2016.06.19 [BootStrap 3] ScrollSpy
  16. 2016.06.19 [BootStrap 3] popover Example
  17. 2016.06.19 [BootStrap 3] popover live
  18. 2016.06.19 jQuery PlugIn - 커스텀 스크롤 라이브러리
  19. 2016.06.19 [BootStrap] Tooltip Styling
  20. 2016.05.17 Include File List
  21. 2016.04.24 [펌] 커버링인덱스
  22. 2016.04.05 [IIS] PHPManager Windows 10 설치오류
  23. 2016.04.01 [파워포인트] 트루타입이 아닙니다
  24. 2016.03.21 ERWinGenerateSQLForMySQL - ERWIN 에서 생성된 mysql 스크립트 변환
  25. 2016.03.09 디자인 패턴 종류
  26. 2016.03.09 [펌] 자바스크립트에서 strict mode를 사용해야 하는 이유
  27. 2016.03.09 [펌] +function() 의 원리
  28. 2016.03.09 지식공유 서비스 - SlimWiki
  29. 2016.02.29 프로젝트 환경 [ Taiga + HipChat + BitBucket + SourceTree + Vagrant (NgineX/PHP/MariaDB) + IDE(PHPStorm) ] (1)
  30. 2016.01.21 jquery attribute (속성 존재여부)

Blog

개인정보 - 온라인 쇼핑몰 서버위치에 관하여

2017.07.27 13:32 Business


링크 : http://tip.daum.net/question/93685852


온라인 쇼핑몰 구축에 따른 개인정보 해외이전

회사에서 인터넷 쇼핑몰을 구축하면서 해외 클라우드를 이용하여 

서비스를 제공하고자 합니다. 
해외 클라우드는 서버 임대형 서비스이며 해당 사업자는 개인정보 접근에 대한 권한은 없으며 단지 서버 구축 및 운영만 담당하고 있습니다. 
이와 같은 사항에 대해서 방통위의 해석을 문의 합니다.



인터넷쇼핑몰 구축시 회원의 DB를 해외 클라우드 서비스를 이용하는 경우 별도의 동의가 필요한 사항인지 문의하신 것으로 판단됩니다. 
정보통신망 이용촉진 및 정보보호 등에 관한 법률(이하 정보통신망법)은 개인정보에 관한 사업자의 의무사항을 규정하고 있습니다. 정보통신망법 제63조에 따르면 이용자의 개인정보가 국외로 이전되는 경우 사업자는 이용자에게 이전에 관한 내용을 알리고 동의를 받도록 하고 있습니다. 
따라서 해당 쇼핑몰 회원정보가 해외 클라우드 서버에 저장되어 보관된다면 이는 해외이전에 해당되므로 이용자에게 이용자의 개인정보가 해외클라우드 서버에 저장되는 사실을 고지하고 이용자의 동의를 받아야 할 것입니다. 
<관련법령> 정보통신망 이용촉진 및 정보보호 등에 관한 법률
[시행 2017.3.23.] [법률 제14080호, 2016.3.22., 일부개정]

제63조(국외 이전 개인정보의 보호) ① 정보통신서비스 제공자등은 이용자의 개인정보에 관하여 이 법을 위반하는 사항을 내용으로 하는 국제계약을 체결하여서는 아니 된다.

② 정보통신서비스 제공자등은 이용자의 개인정보를 국외에 제공(조회되는 경우를 포함한다)·처리위탁·보관(이하 이 조에서 "이전"이라 한다)하려면 이용자의 동의를 받아야 한다. 다만, 정보통신서비스의 제공에 관한 계약을 이행하고 이용자 편의 증진 등을 위하여 필요한 경우로서 제3항 각 호의 사항 모두를 제27조의2제1항에 따라 공개하거나 전자우편 등 대통령령으로 정하는 방법에 따라 이용자에게 알린 경우에는 개인정보 처리위탁·보관에 따른 동의절차를 거치지 아니할 수 있다.  <개정 2016.3.22.>

 ③ 정보통신서비스 제공자등은 제2항에 따른 동의를 받으려면 미리 다음 각 호의 사항 모두를 이용자에게 고지하여야 한다.

1. 이전되는 개인정보 항목

2. 개인정보가 이전되는 국가, 이전일시 및 이전방법

3. 개인정보를 이전받는 자의 성명(법인인 경우에는 그 명칭 및 정보관리책임자의 연락처를 말한다)

4. 개인정보를 이전받는 자의 개인정보 이용목적 및 보유·이용 기간

④ 정보통신서비스 제공자등은 제2항에 따른 동의를 받아 개인정보를 국외로 이전하는 경우 대통령령으로 정하는 바에 따라 보호조치를 하여야 한다. [전문개정 2008.6.13.]  끝.



관련법령 : 정보통신망 이용촉진 및 정보보호 등에 관한 법률제63조(국외 이전 개인정보의 보호)
작성부서 : 방송통신위원회 사무처 이용자정책국 개인정보보호윤리과, 02-500-9000

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

wrapplyzer 정보 숨기기

2017.07.21 14:42 Development/Web Browser


https://hacklog.mu/hide-your-website-applications-version/


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[Codeigniter] 코드이그나이터 넷빈즈로 개발환경 구성

2017.06.21 14:49 Development/PHP


회사에서 일을 하며 울며 겨자먹기식으로 어쩔 수 없이,

NetBeans PHP 로 IDE 환경구성하며 프로젝트를 진행하고 있습니다.


이에 어떻게하다 보니 그럭저럭 쓸만하게 PHP & CodeIgniter 환경구성을 하게되어 포스팅하게 됩니다.

넷빈즈 다운로드는 다음과 같이 링크합니다.



먼저 필요한 파일은 첨부파일을 다운로드 받아 넷빈즈 플러그인 디렉토리 또는 개별적으로 설정하신

디렉토리에 압축해제 하세요.


netbeans-codeIgniter-modules.zip

ㄴ org-nbphpcouncil-modules-php-ci-0.6.0.nbm

ㄴ org-nbphpcouncil-modules-php-ci-repository-0.6.0.nbm


그리고 코드이그나이터 공식웹사이트에 접속하셔서 코드이그나이터를 다운로드 받으시기 바랍니다.

일단은 스피드한 포스팅 전개를 위해 첨부합니다. 버전은 3.0.6 입니다.


CodeIgniter-3.0.6.zip


링크 : 코드이그나이터 다운로드



이제 준비는 끝났습니다. 넷빈즈에 대한 순차적인 설정입니다.


1. 먼저 넷빈즈의 Tools > plugins 를 실행합니다.



2. 그리고 다운로드된 플러그인을 설치하는 탭으로 이동합니다.


저는 윈도우즈 USERS/계정/AppData/... 로 시작하는 경로에 압축을 풀었습니다.

이건 특별한 제한은 없지 싶습니다.


C:\Users\JKUN\AppData\Roaming\NetBeans\8.2\plugins


하여 위 두 파일들을 차례대로 선택하여 "열기" 클릭!

그럼 아마 인스톨하든지 할겁니다. 여기는 재량껏 Next! Next! Next!

그럼 이제 프레임워크 정보에 코드이그나이터 추가된 것을 확인하실 수 있습니다.

위 경로는 Tools > Options > PHP (Tab) > Framework & Tools (Tab) > CodeIgniter 입니다.


3. 이제 Base Files 에 다운로드 받은 코드이그나이터를 적용시켜주는 단계입니다.


아 참 저 Base Files 를 선택하면 나오는 목록에 Name 은 Edit 버튼을 이용하여 이름을 변경하였습니다.


4. 이제 프로젝트 속성창에서 프레임워크를 코드이그나이터의 Enabled 를 체크합니다



 그럼 프로젝트 옆에 CI 불꽃 아이콘이 나타납니다.


그리고 코드상에서 한번 테스트해서 보면은~~



이야~ ㅋㅋㅋ 되지요?

다들 즐코 PHP/CI 하시길 바랍니다.


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[OA/EXCEL] 엑셀 공백 문자열 및 특수문자 공백 제거 매크로

2017.06.21 12:02 Utility Tip&Tech


Alt + F11 조합을 누르면 VBA 가 실행하면 Sheet 모듈 스크립트 작성창이 나타난다.


해당 스크립트에 다음 서브프로시저를 입력.

Sub trimSpaceAll()
  Dim C As Range, R As Range

  Application.ScreenUpdating = False
  Set R = ActiveSheet.UsedRange


  For Each C In R
    If Not IsError(C) And C <> "" Then
      C.Value = LTrim(C.Value)
      C.Value = RTrim(C.Value)
      C.Value = Replace(C.Value, " ", " ")
    End If
  Next C

  Application.ScreenUpdating = True
End Sub


그리고 다시 엑셀로 돌아와 Alt + F8 을 누르고 실행하면 된다.

특별한거 없는 단순 거르는 코드.


위 코드는 다음 블로그를 참조하여 약간 변경하였습니다.

http://mwultong.blogspot.com/2007/01/excel-vba-trim-trailing-spaces.html

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

MariaDB - JSON 테이블

2017.06.09 10:07 DataBase/MariaDB


마리아 디비에서 보면 JSON 테이블 형태가 존재하는것 같다.

일단은 테스트를 해봐야하나 ㅋㅋ

차후 로 미루고 메모포스팅을.


Guide : https://mariadb.com/kb/en/mariadb/connect-json-table-type/

Blog Post : http://estenpark.tistory.com/350


위에 포스팅에서 꽤 상세하고 자세하게 포스팅되어있어 그대로 따라해보면 될듯.

저작자 표시
신고

'DataBase > MariaDB' 카테고리의 다른 글

MariaDB - JSON 테이블  (0) 2017.06.09
현재 0 개의 댓글이 있습니다.
Comment

Blog

자바스크립트 오버로딩

2017.05.22 10:59 Development/JavaScript


출처 : http://webclub.tistory.com/404


진작에 구글링 할걸...ㅡㅡ;;;

엄밀히 말하자면 비스무리흉내 ㅋㅋ 그래도 너무 편하다;;


function sum() {
    var result = 0;
    for (var i = 0; i < arguments.length; i++) {
	result += arguments[i];
    }
    return result;
}
console.log(sum(10, 20));// 30
console.log(sum(10, 20, 30));// 60 
console.log(sum(10, 20, 30, 40)); // 100 
console.log(sum(10, 20, 30, 40, 50)); //150

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

MySQL 정규식으로 치환 함수

2017.02.02 15:41 DataBase/MySQL


MySQL 정규식으로 치환 함수

DELIMITER $$

CREATE FUNCTION  `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000))
RETURNS VARCHAR(1000)
DETERMINISTIC
BEGIN 
 DECLARE temp VARCHAR(1000); 
 DECLARE ch VARCHAR(1); 
 DECLARE i INT;
 SET i = 1;
 SET temp = '';
 IF original REGEXP pattern THEN 
  loop_label: LOOP 
   IF i>CHAR_LENGTH(original) THEN
    LEAVE loop_label;  
   END IF;
   SET ch = SUBSTRING(original,i,1);
   IF NOT ch REGEXP pattern THEN
    SET temp = CONCAT(temp,ch);
   ELSE
    SET temp = CONCAT(temp,replacement);
   END IF;
   SET i=i+1;
  END LOOP;
 ELSE
  SET temp = original;
 END IF;
 RETURN temp;
END$$

DELIMITER ;

본문 : https://techras.wordpress.com/2011/06/02/regex-replace-for-mysql/

저작자 표시
신고

'DataBase > MySQL' 카테고리의 다른 글

MySQL 정규식으로 치환 함수  (0) 2017.02.02
UNIXTIME 관련 함수  (0) 2017.02.02
[펌] 커버링인덱스  (0) 2016.04.24
[링크] MySQL에서 사용하는 Lock 이해  (0) 2015.09.22
MySQL Split - 문자열 자름 처리.  (0) 2015.09.21
참조키 강제 해제  (0) 2015.06.03
현재 0 개의 댓글이 있습니다.
Comment

Blog

UNIXTIME 관련 함수

2017.02.02 15:39 DataBase/MySQL


1. UNIXTIME(타임스탬프) → DATE 

 FROM_UNIXTIME('1485874832', '%Y%m%d %H%i%s') 

2. DATE → UNIXTIME

UNIX_TIMESTAMP()
UNIX_TIMESTAMP('YYYY-MM-DD HH:mm:ss')


저작자 표시
신고

'DataBase > MySQL' 카테고리의 다른 글

MySQL 정규식으로 치환 함수  (0) 2017.02.02
UNIXTIME 관련 함수  (0) 2017.02.02
[펌] 커버링인덱스  (0) 2016.04.24
[링크] MySQL에서 사용하는 Lock 이해  (0) 2015.09.22
MySQL Split - 문자열 자름 처리.  (0) 2015.09.21
참조키 강제 해제  (0) 2015.06.03
현재 0 개의 댓글이 있습니다.
Comment

Blog

[ER-WIN] Names Option

2016.10.25 22:16 DataBase


ERWIN 을 쓰다보면 가끔 네이밍 설정을 안해줘서,

짜증에 직면할때가 있다.



여기서 해당하는 부분에 Macro Name 을 수정하면 된다.

특히 키 그룹은 반드시 변경 ㅡㅡ^;;


%KeyType_%TableName OR %KeyType_%TableName_%PK()

추가적인 설명은 Macro ToolBox 버튼을 누름 


이와 같이 자세히 확인할 수 있으나... 일단은 키 그룹 빼곤;;;

ㅋㅋ


아 그리고 유용하게 사용되는 엔티티명에 코멘트 적용시키는 스크립트.

Schema Generation 에서 Post-Script 옵션에 체크해준다.

%ForEachTable() {
	COMMENT ON TABLE %TableName IS '%EntityName';
	%ForEachColumn() {
		COMMENT ON COLUMN %TableName.%ColName IS '%AttName';
	}
}


구글링도중에 아주 나이스한 포스트 추가 링크겁니다

http://e2xist.tistory.com/468


더보기


저작자 표시
신고

'DataBase' 카테고리의 다른 글

[ER-WIN] Names Option  (0) 2016.10.25
memsql  (0) 2013.12.30
FreeSQLFormatter [SQL정렬]  (0) 2012.02.13
NoSQL  (0) 2011.01.14
ERStudio  (0) 2010.08.24
현재 0 개의 댓글이 있습니다.
Comment

Blog

윈도우 콘솔 UTF-8

2016.10.24 15:03 OS/Windows


C:\>chcp 65001
Active code page: 65001

저작자 표시
신고

'OS > Windows' 카테고리의 다른 글

윈도우 콘솔 UTF-8  (0) 2016.10.24
[IIS] PHPManager Windows 10 설치오류  (0) 2016.04.05
액세스 거부 폴더 삭제  (0) 2014.11.02
데스크탑을 멀티로 사용해보자  (0) 2013.10.16
ATTRIB - 폴더에 읽기전용 권한  (0) 2013.08.13
ICACLS - 콘솔에서 폴더권한 지정  (0) 2013.08.13
현재 0 개의 댓글이 있습니다.
Comment

Blog

A4 용지 출력

2016.09.23 11:06 Development/HTML / XHTML


웹페이지에서 프린트 출력할때 유용합니다.

HTML

<page size="A4">
	<h1>A4 용지 세로 1 이어서</h1>
</page>
<page size="A4">
	<h1>A4 용지 세로 2 이어서</h1>		
</page>
<hr is-divide="true">
<page size="A4" is-divide="true">
	<h1>A4 용지 세로 1 분리</h1>
</page>		
<page size="A4" is-divide="true">
	<h1>A4 용지 세로 2 분리</h1>		
</page>
<page size="A4" layout="portrait">
	<h1>A4 용지 가로</h1>		
</page>
<page size="A5">
	<h1>A5 용지 세로</h1>		
</page>
<page size="A5" layout="portrait">
	<h1>A5 용지 가로</h1>		
</page>
<page size="A3">
	<h1>A3 용지 세로</h1>		
</page>
<page size="A3" layout="portrait">
	<h1>A3 용지 가로</h1>				
</page>


CSS

body {
	background: rgb(204,204,204); 
}
page {
	  background: white;
	  display: block;
	  margin: 0 auto;
	  margin-bottom: 0.5cm;
	  box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
page[size="A4"] {  
	  width: 21cm;
	  height: 29.7cm; 
}
page[size="A4"][layout="portrait"] {
	  width: 29.7cm;
	  height: 21cm;  
}
hr[is-divide="true"] {
	height:0; margin:0; padding:0; border:none !important;
}
[is-divide="true"] {
	page-break-after: always;
}
page[size="A3"] {
	  width: 29.7cm;
	  height: 42cm;
}
page[size="A3"][layout="portrait"] {
	  width: 42cm;
	  height: 29.7cm;  
}
page[size="A5"] {
	  width: 14.8cm;
	  height: 21cm;
}
page[size="A5"][layout="portrait"] {
	  width: 21cm;
	  height: 14.8cm;  
}
@media print {
	  body, page {
		margin: 0;
		box-shadow: 0;
	  }
}


JAVASCRIPT

window.onload = function() {
	window.print();
};

Inline HTML Full Code

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
		body {
		  background: rgb(204,204,204); 
		}
		page {
		  background: white;
		  display: block;
		  margin: 0 auto;
		  margin-bottom: 0.5cm;
		  box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
		}
		page[size="A4"] {  
		  width: 21cm;
		  height: 29.7cm; 
		}
		page[size="A4"][layout="portrait"] {
		  width: 29.7cm;
		  height: 21cm;  
		}
		hr[is-divide="true"] {
			height:0; margin:0; padding:0; border:none !important;
		}
		[is-divide="true"] {
			page-break-after: always;
		}
		page[size="A3"] {
		  width: 29.7cm;
		  height: 42cm;
		}
		page[size="A3"][layout="portrait"] {
		  width: 42cm;
		  height: 29.7cm;  
		}
		page[size="A5"] {
		  width: 14.8cm;
		  height: 21cm;
		}
		page[size="A5"][layout="portrait"] {
		  width: 21cm;
		  height: 14.8cm;  
		}
		@media print {
		  body, page {
			margin: 0;
			box-shadow: 0;
		  }
		}
		</style>
		<title>Page Print Example</title>
	</head>
	<body>
		<page size="A4">
			<h1>A4 용지 세로 1 이어서</h1>
		</page>
		<page size="A4">
			<h1>A4 용지 세로 2 이어서</h1>		
		</page>
		<hr is-divide="true">
		<page size="A4" is-divide="true">
			<h1>A4 용지 세로 1 분리</h1>
		</page>		
		<page size="A4" is-divide="true">
			<h1>A4 용지 세로 2 분리</h1>		
		</page>
		<page size="A4" layout="portrait">
			<h1>A4 용지 가로</h1>		
		</page>
		<page size="A5">
			<h1>A5 용지 세로</h1>		
		</page>
		<page size="A5" layout="portrait">
			<h1>A5 용지 가로</h1>		
		</page>
		<page size="A3">
			<h1>A3 용지 세로</h1>		
		</page>
		<page size="A3" layout="portrait">
			<h1>A3 용지 가로</h1>				
		</page>	
		<script type="text/javascript">
			window.onload = function() {
				window.print();
			};
		</script>
	</body>
</html>


아 구글링 중에 설명을 깔끔하게 잘 해주신 분입니다.

http://noveloper.github.io/blog/css/2015/04/12/how-to-divide-print-space.html


추가적으로 확인해야 하는 부분은

프린트도 크로스 브라우징 검증 작업은 필요합니다.

인터넷 익스플로러도 감안해서 폰트는 포인트(pt) 로 작성하시는게 정신건강상.. ㅎㅎ

그리고 인터넷 익스플로러에서는 상황에 따라 페이지 설정을 브라우저 기능 설정단에서 바꾸어줘야

하는 경우가 있습니다.





저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[펌] 홍보영상 직접 제작해서 수백만원 절약해보자

2016.08.21 17:19 Business



본문 : https://brunch.co.kr/@andrewyhc/19


Mac 의 iMovie 와 Garage Band 를 이용하여 홍보영상 제작하는거란다.

곧 사용해 보고 싶은 ㅎㅎ

재미있겠다!ㅎㅎㅎㅎ

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[펌] NoSQL 종류

2016.07.26 11:45 DataBase/NoSQL



출처 : http://paraffa.tistory.com/47

----------------------------------------------------------------------------------------

1. MongoDB / C로작성 됨

----------------------------------------------------------------------------------------


1.1 MongoDB란?

  - MongoDB는 10gen 사에서 개발된 높은 성능과 확장성을 가지고 있는 데이터베이스 입니다.

    NoSQL 데이터베이스에서는 문서형 데이터베이스로 분류됩니다. C언어로 개발되었다.

    공식사이트 : http://www.mongodb.org


1.2 왜 MongoDB를 사용하는가?

  - 스키마를 고정하지않는다.

  - 시리얼라이즈 시키면 문제가 없어질까?

    - json등을 사용하여 시리얼라이즈시킨 데이터를 관계형 데이터베이스에 입력하면된다.

      > 가독성이 떨어진다.

      > 성능저하를 검토하여야한다.

  - 스키마 없는 데이터베이스

    - MongoDB는 스키마가없는 데이터베이스이다.

    - RDB와 마찬가지로 임의의 key값에대한 복잡한 검색이 가능하다.

    - RDB와 비교해 응답속도가 빠르고, 인덱스를 추가하여 처리속도를 더 빠르게 할 수 있다.


1.3 특징

  - MongoDB는 스키마를 정의할 필요가 없음.

  - 문서형 데이터베이스는 데이터를 입력할때 데이터 구조 정보를 포함하여 BSON(JSON을 바이너리화한것)

    형식으로 저장하고, 이것을 value로 key와 짝짓습니다.


1.4 장점

  - 스키마 없이사용이 가장 큰 장점입니다.

  - 스키마가 없기 때문에 프로그램 코드만 수정하면 됩니다.

  - 스키마와 프로그램 코드사이의정합성에 신경쓰지 않아도 된다.

  - 검색조건을 유연하게 지정할 수 있습니다. 

    > 정규표현을 통한 검색부터 배열 데이터에 특정 값이 포함되어 있는지등.


1.5 단점

  - MongoDB에서는 JOIN이나 트랜잭션성 처리가 불가능하다.

  - MongoDB에서는 데이터 갱신 및 입력시 바로 디스크에 쓰지 않는다는 것입니다.

    > 디스크에 쓰기가 비동기식으로 이루어진다. 때문에 경우에 따라 데이터가 유실될 가능성도 있다.

      이것과 트레이드오프로 빠른 응답속도가 가능한 것 입니다만 데이터가 사라질 수 있다는 점에 

      주의해야 한다.

1.6 도입사례

  - 해외의 도입사례

    > foursquare

    > preferred infrastructure

    > 아메바피아


1.7 구체적인 이용 예

1.7.1 샘플1

  - MongoDB의 구체적인 예로 앙케이트 응답 데이터를 다루는 경우를 생각해보겠습니다. 

    MongoMapper라는 라이브러리를 사용해서 구현하도록 하겠습니다. 먼저 앙케이트 응답 데이터를 다룰 answers콜렉션에 대한 모델을 정의합니다.

    클래스 정의 내부에 MongoMapper:Document를 include하고있는것 외에는 특별히 다른 부분은 없습니다.


  - 컬럼을 정의하지 않아도 MongoDB를 사용할 수 있습니다만 이번예에서는 user_id와 enquete_id를 명시적으로 정의해 두었습니다.

    컬럼을 정의하면 validation 가능(이번경우 user_id, enquete_id가 필수 항목이 됨), Accessor 설정, 대응클래서에 매핑됨

    이라는 잇점이 있기 때문입니다. 물론, 단순히 알기쉽고 관리가 편하다는 이유도 있습니다.


  - 여러 데이터 형식 입력 가능

  - 콜렉션을 다른 콜렉션에 추가

  - 응답 데이터를 저장한다.

  - 스키마 변경없이 대응 가능


1.7.2 샘플2

  - 다른 예로 분석 데이터 스토리지로 사용하는 경우에 대해 생각해 보겠습니다.로그 데이터를 분석하여 그 분석 결과를 MongoDB에 저장하는 케이스입니다.

    서비스이용 상태를 조사한다거나 서비스를 개선하기위해 로그데이터를 해서 PV나 UU, 그외 여러가지데이터를 만들어 내는 경우가 있을것 입니다만

    그 데이터를 어떻게 관리하면 좋을까요?

    

    > 관계형 데이터베이스에서의 운용

      - 단,로그 데이터 분석에서는 어떤 컬럼이 필요할지 알 수 없습니다. 이제까지 필요하지 않았던 컬럼도 어떤 분석에서는 필요해질 수 있습니다.

        그러므로 분석용 테이블을만들어서 해당 테이블에 모든 분석 테이터를 보존하고 필요할 경우 새로운 컬럼을 추가한다거나 아니면 다른 테이블을

만들어서 저장하는 방법이 있습니다.


      - 동일한 테이블에 모든 분석 데이터를 저장하고 필요할 때마다 새로운 컬럼을 추가한다면 운영이 번거로워지고 특정 분석에서만 사용하는 불필요한

        컬럼이 많아질 수 있습니다. 그렇다고 해서 분석 데이터만다 별도 테이블을 만든다면 테이블 수가 무척 많아지게 될 것 입니다.


    > MongoDB를 사용한 운용

      - 로그 데이터를 분석하면 여러가지 형식의 데이터가 얻어질 것이라고 생각합니다만, MongoDB라면 스키마에 신경쓰지 않고 여러 데이터를 저장 할 수

        있습니다. 새로운 데이터를 저장해야 할 경우에도 스키마 변경 없이 바로 추가해서 기록할 수 있는 유연함이 MongoDB의 가장 큰 장점입니다.

'이 데이터는 앞으로 이용 할 수도 있다'는 일시적으로 사용할 데이터도 가볍게 저장할 수 있어서 편리합니다.


1.7.3 Tip

  - MongoDB의 지리 공간 인덱스라고 불리는 인덱스를 사용하는 것이 가능합니다. (1.7.0 이상)위도와 경도정보를 인덱스로 사용하여 검색할 수 있습니다.

    최근 GPS를 사용한 서비스가 늘어나고 HTML5에서는 Geolocation  API를 제공하는 등 위치 정보가 점점 더 중요해질 것이라고 생각합니다. 

    

    # 지리 공간 인덱스를 이용하는 컬럼으로 "2d"를 지정

    # 복합 인덱스도 사용 가능

    > db.place.ensureIndex({location:"2d"})


    # 데이터 입력

    > db.place.find({location:{$near:[139.65,35.65]}}).limit(5)


----------------------------------------------------------------------------------------

2. Cassandra (key-value형 스토어) / 자바기반

----------------------------------------------------------------------------------------

2.1 Cassandra란?

  - Cassandra는 facebook에서개발하여 현재는 Apache프로젝트로 진행되고 있는 오픈소스 소프트웨어이다.

    NoSQL데이터베이스에서는 key-value형으로 분류된다. Google의 BigTable을 바탕으로 개발되고 

    컬럼 단위로 관리되어 컬럼형으로 분류하기도 한다.


2.2 왜 Cassandra를 사용하는가?

  - 대량의 데이터를 다루는데 효과적

    > 여러장소에 분산된 다수의 저가 서버를 이용하여 대량 데이터를 다루기 위해 만들어진 데이터 스토어로

      대량의데이터를 다루는 데특화되어 있습니다.다량의데이터를 다수의 서버에 분산시키며 분산된 데이터를 여러

      서버에 복제해 두는 방식으로, 읽기와 쓰기가 모두 뛰어나다. 또한 데이터를 메모리에 보관해 두고 일정 조건 후

      디스크에 입력하는 영속성과 휘발성 key-value가 혼합된 방식으로 관계형 데이터베이스에 비해 속도가 크게 빠릅니다.


    > memcached처럼 관계형 데이터베이스의 cache로 사용할 수 있지만, 다수가 이용하는 대랴의 데이터에 특화되어 개발된

      만큼 관계형 데이터베이스와 대등하게 단독 데이터베이스로 사용하는 경우가 많습니다.


2.3 특징과 사용케이스

  - Cassandra는 Row key를 인덱스로가지는 key-value형 스토어입니다. 또한 컬럼을 기본으로 데이터를 다루는 컬럼형 NoSQL

    데이터베이스로 행 중심인 관계형 데이터베이스와는 달리 디스크에 데이터를 컬럼 단위로 연속하여 저장한다.

    컬럼(열)단위로 관리되기 때문에 동일한 데이터라도 행단위로 관리하는 것보다 디스크에 많이 저장할수 있습니다


  - 컬럼이 기본 단위로 컬럼에는 컬럼 이름과 값, time stamp가 포합니다. Row key로 식별되는 한 행에는 여러 개의 

    컬럼이 포함될 수 있으며 한 Row에서 저장할 수 있는 컬럼 개수는 20억개 , 각 Row key의 최대 크기는 64KB이다.

    각 컬럼은 Column family에  속하며 Column family는 Keyspace에 포함됩니다. Column family 중 Super Column family는

    Column family를 자식 column으로 가질 수 있습니다. Keyspace는 관계형 데이터베이스에서 스키마나 테이블 스페이스라

    불리는 것과 유사합니다. Keyspace단위로 복제 및 관련 정책을 관리하여보통 어플리케이션 하나 당 Keyspace를 하나씩 

    생성합니다.


  - 어플리케이션에서 Column family의 정렬 기준을 시간이나 이름으로 지정할 수 있습니다.

    Cassandra의 또다른 특징은 분산된 환경에 적합하며 확장성이 뛰어나다는 것입니다.

    앞에서도 이야기했듯이 동일한 데이터가 여러 서버에 복제되어 있어 단위 서버에 문제가 발생하더라도 가용성이 보장됩니다.

    하지만 확장성과 가용성이 좋은 대신 관계형 데이터베이스에 비해 데이터 신뢰도는 떨어지는 편입니다.

    기본 구성에서는 데이터에 대한 입력이나 변경이 비동기식으로이루어지고 중앙에서 관리하는 서버가 별도로 없기 때문에

    분산된 데이터사이에 정합성이 맞지 않는 경우가 발생할 수 있습니다.

    이를 보완하기 위해 데이터 읽기 요청이 발생한 경우 해당 데이터를가지고 있는 여러 서버에 요청을 발행하여 결과값을 비교해 보고 time stamp가

    가장 최신인 데이터를 반환하는 등의 로직을 제공하고 있습니다. 이때 time stamp가 오래된 응답을 보낸 서버는 최신의 데이터로 갱신하도록 합니다.


  - 데이터의 신뢰도를 높이기 위해 동일한 데이터를 가지고 잇는 여러 서버에서 데이터를 가져와서 비교하다 보면 성능에영향을 미칠 수 있습니다.

    따라서 Cassandra에서는 읽기 및 쓰기에대한 각각의 Consistency Level을 지정하여 성능과 신뢰도 수준을 조정하도록 하고 있습니다.

    Consistency Level이 All인 경우에는 읽기 및 쓰기 요청이 발생할 경우 복제된 데이터를가진 모든 서버에서 응답을 보내와야 완료됩니다.

    이경우 데이터베이스의 유연성 및 성능은 떨어지지만 데이터 신뢰도는 높아지게 됩니다.

    Consistency Level이 One일경우에는 읽기 및 쓰기 요청이 발생하였을 때 해당 데이터를 가지고 있는 하나의 서버를 대상으로 해당 연산을

    처리하고 완료하게됩니다. 데이터 신뢰성은 떨어지게되지만 분산에 대한 유연도와 응답 성능은 높아집니다.

    마지막으로QUORUM으로 설정해 두면 읽기 및 쓰기 요청이 들어온 데이터를 복제하여 가지고 있는 일정 대술의 서버에서 응답을 보낼 경우 완료하게 됩니다.

    참고로 Facebook에서 권장하는 Consistency Level은 One이나 replication factor(복제 서버수)를 3으로 둔 QUORUM입니다.

    

    ※ consistency level

    > Level           Write                                    Read

    > ANY | 요청한 내용이 적어도 한 node에 저장됨 |             - 

    > ONE | 요청한 내용이 적어도 한 node의 commit log 및 table에 저장된 후 요청자에게 응답함 | 가장 가까운 고의 replica에서 응답을 받아서 반환한다. Read repair 설정이 되어 있으면 Cassandra는 백그라운드 스레드에서 신뢰도 체크를 실시.

    > QUORUM | 요청자에게 응답하기 전에 quorum of replicas에 저장됨 | quorum of replicas의 응답 중 가장 최근 time stamp의 응답을 반환 |

    > LOCAL_QUORUM |요청자에게 응답하기 전에 local데이터 센터 내의 quorum of replicas에 저장됨. 데이터 센터 사이의latency로 인한 지연을 줄이기위한 설정 | 단일 데이터 센터의quorum of replicas의 응답중 가장 최근 time stamp의 응답을 반환. 데이터센터 사이의 latency를 줄이기 위함 |

    > EACH_QUORUM | 각 데이터센터의 quorum of replicas에 저장한 후 요청자에게 완료를 알림.| 각 데이터 센터의 quorum of replicas의 응답중 가장 최근 time stamp의 응답을 반환|

    > ALL | 모든 replica가 저장해야 함. 그러지않으면 해당 연산은 실패 | 모든 replaica에서 준 응답중 가장 최근 time stamp 값을 반환.하나라도 응답이 오지 않으면 실패 | 


  - key-value형 스토어 데이터 분산에는 memcached 등과 마찬가지로 Consistent Hashing 방식을 이용하고 있습니다.


2.5 장점

  - 대량의 데이터를 다수의분산된 서버에서관리해야 할 경우 적합합니다. 특히 많은 사람들이 이용하며 대량으로 쓰기가 발생하는 서비스에 좋습니다.

    데이터는 일단 메모리에 쓰여지며 데이터가 일정 크기가 되면 디스크로옮겨지게 됩니다.


  - Consistent Hashing 방식을 이용하여 데이터를 분산한다. Consistent Hashing방식에 로드 밸런싱을 위한 알고리즘을 더하여 요청이 적은 서버를

    요청이 많은 서버 구간으로 옮기는 방식으로 로드 밸런싱을 구현하고 있습니다. 따라서 대량의 요청이 소수의 서버에 몰리는 것을 막아 장애를방지하고

    성능을 높일 수 있습니다. 또한 신규로 서버가 추가되는 경우 로드 밸런싱을 고려하여 요청이 많은 구간에 우선 추가되어 부하 관리가 효율적으로 

    이루어지게 됩니다.


  - 신규 서버를 분산 시스템에 추가할 경우 서비스 중단없이 손쉽게 추가할 수 있는 것도 큰장점 입니다. 서비스 요청이 많아져서 신규로 서버를 추가하는경우,

    중앙에서 관리하는 별도 서버가 없기 때문에 새로 추가되는 서버만 기동하면 서비스에 해당서버가 추가되게 됩니다. 즉, 기존에 서비스를 제공하던 서버를

    재기동해야 하는 등의 서비스 중단이 필요 없습니다.


  - 아마존 다이나모 방식을 구현하여 데이터 일관성 대신 연속적인 서비스제공에 중점을 둔 구조로 가용성이 굉장히 뛰어납니다. 데이터 복제 설정도 동일한

    서버 랙을 사용하지 않는 서버에 복제본을 둔다거나 다른 데이터 센터에 복제본을두는 등 다양하게 구현할 수 있습니다.중앙에서관리하는 별도 서버가 없고

    데이터 복제를 기본으로 하고 있기 때문에 단일 노드의 장애 발생시 서비스에미치는 영향이 거의없습니다. Consistency Level을 통해 업무 특성에 맞춰 가용성과

    신뢰도의 정도를 조정할 수 있습니다.


  - Apache Foundation에서개발하고 있으며 여러 사이트에서 활용하고 있어 커뮤니티가 활발하며 사용 사례가 많습니다.따라서우녕ㅇ시 참고할 만한 자료가 다른 

    NoSQL데이터베이스에 비해 풍부한 편입니다. 커뮤니티가활발하여 문제발생시 유사 사례를 찾거나 의견을 구하는 것도 비교적 쉬운 편입니다.


2.6 단점

  - 컬럼형 데이터베이스로 Row형 데이터베이스인 관계형 데이터베이스와는 다른생소한 개념이라 진입장벽이 높습니다. 따라서많은 사용자를 대상으로 대량 데이터를

    다루는 서비스가 아닐 경우 굳이 Cassandra를 고집할 필요는 없을 것입니다.

  

  - 복잡한 조건의 검색이 불가능 합니다. Row key와 컬럼 두가지에대한 인덱스만 가능하기 때문에 데이터는 대량이지만 검색 조건은 단순한 서비스에 적합니다.

  

  - Super Column family의하위 컬럼에 대한 인덱싱은 불가능합니다.

    key 값을 토한 범위 검색은 데이터 분산 방식을 OrderPresservingPartitioner로 설정하여 key값을 통해 데이터를 서버에분배했을 때문 가능하는 등의

    검색 관련 제약사항이 있습니다.


  - 데이터에 대한 갱신 및 입력시 Atomic한 처리가 어렵습니다. 데이터에 대한Lock을 사용하려면 Zookeeper와 같은 전체분산 서버를 관리하는 프로그램을 추가해서

    별도로 설정해야 합니다. 데이터에 대한 동시 갱신 요청이 발생할 가능성이 높거나 Atomic한 트랜잭션이 필요한 서비스에서는다른 데이터베이스를 고려하는 것이 

    좋을 겁니다.


  - 지금 버전 1이 정식으로 나오지 않은 안정적이지 않은 시스템이라느 것도 불안요소가 될수 있습니다.

    커뮤니티가 매우 활발하여 계속해서새로운 기능을 추가하고이슈를 해결하고 있지만 그만큼 새로운 내용에 항상 촉각을 세우고 있어야한다.


2.7 도입사례

  - Facebook을 비롯하여 여러 유명 해외 서비스에서 사용하고 있습니다.

    > Facebook

    > Twitter

    > Digg

  또한 대량 데이터를 다루는 많은 사이트에서 도입을 검토하고 있습니다.


  - 사용케이스 : 시작은 Facebook에 최적화 되어 개발되었기 때문에 다수의 쓰기가 발생하는 대형 웹서비스에 적합합니다.

    앞서 이야기했듯이 Atomic한 처리가필요한 서비스보다는 동일 row에 대한 동시 갱신 요청이 적은 경우나 높은 데이터 신뢰도가 필요하지 않은 서비스에

    적합할 것입니다. 대량 데이터의 입력 성능이 뛰어나기 때문에 실시간 입력 요청이 많은 서비스에 좋습니다. 또한 대량의 데이터의 실시간 분석에도 적합니다.

    Twitter에서는 실시간 분석에 활용하고 있습니다.

    > 사용자가 많으며 사용자에의한 데이터입력이 빈번하게 발생하는 대량의데이터를 다루는 시스템

    > 빈번하게 변경되는 데이터에대한 실시간 분석용 시스템

    > 대량의데이터를 다루며 신뢰성보다 가용성이 중요한 시스템


  - 다른 key-value형 NoSQL 데이터베이스와는 달리 Cassandra는 관계형 데이터베이스를 대체하는 대량 데이터용 스토어로 사용되는 경우가 많습니다. 

    대량의 데이터를 다수 서버에 분산하여 많은 사용자가접속하여 쓰는 구성은 관계형 데이터베이스를 통해서는 효율적으로 지원하기 어렵습니다.

    대량 데이터 분산 처리용으로 나온 NoSQL데이터베이스에서는 HBase와 함께 Cassandra가 가장 앞서나가고 있습니다.


2.8 구체적인 이용 예

2.8.1 사용자 검색 정보 스토리지

  - 많은사용자가 이용하는 대규모 검색 사이트의 경우를 생각해 보겠습니다. 사용자가 많고 실시간으로 기록되눈 데이터(검색시도)가 많으며 데이터는 대부분

    텍스트 데이터로 이루어집니다. 검색 사이트에서 검색 정보를 기록하여 활용한다면 어떤 데이터베이스를 이용하는 것이 좋을까요?


  - 관계형 데이터베이스에서의 운용

    물론 관계형 데이터베이스로 관리하는 방법도 생각할 수 있습니다. 하지만 1000만명의 사용자가 하루 12시간, 시간당 20만건만 검색한다고해도

    1000000x20x12, 즉 24억 행의 데이터가 매일 추가됩니다. 매일 24억 행씩 증가하는 데이터라면 입력하려는 프로세스 간 경합으로 성능이 많이 떨어지게 될것입니다.

    뿐만 아니라 관계형 데이터베이스 응답 시간과 데이터 규모를 고려한다면 고가의 장비를 도입해야 할 것입니다.


    고가의 장비를 도입해서 관계형 데이터베이스로 해당 데이터를 관리한다고해도테이블 구조가 간단할 뿐더러 높은 실시간 데이터 일관성이 필요하거나 join등의 복잡한

    연산이 필요한 서비스가 아니기 때문에 낭비라는 생각이 자꾸 듭니다.

  

  - Cassandra를 사용한 운용

    이런 경우에는 Cassandra가 좋은 대안이 될 것입니다. 실시간으로 정확하게 제공하는 서비스가 아니기 때문에 높은 신뢰도를 제공하는 데이터베이스일 필요가 없습니다.

    검색 정보 데이터를 활용할 때도 데이터 구조가 간단하기 때문에 JOIN이나 복잡한 연산보다 통계성 분석이 주를 이룹니다. 대량의중요도가 높지 않은 데이터를 모두 저장해

    서 의미있는 비지니스 데이터로 활용하기 위해서는 저비용으로 대량의 데이터를 관리하며 고가용성과 유연성을 제공하는 Cassandra가 좋을 것입니다.



----------------------------------------------------------------------------------------

3. HBase (컬럼형 스토어) / 자바기반

----------------------------------------------------------------------------------------

3.1 HBase란

  - HBase란 2006년 차드 월터스와 짐 캘러만에 의해 시작되어 현재는 Apache 프로젝트로 개발이 진행되고 있는 오픈소스 소프트웨어입니다.

    NoSQL 데이터베이스에서는 컬럼형 데이터베이스라고 분류됩니다.

    공식 사이트 : http://hbase.apache.org


3.2 왜 HBase를 사용하는가?

  - 대용량 데이터를 안정적으로다루는 데 효과적

    > HBase는 Cassandra와 마찬가지로 Bigtable의 영향을받은, 대량 데이터를 효율적으로 다루기 위한 목적으로 개발된  NoSQL 데이터베이스

      입니다. 대용량 데이터를 다루는 NoSQL 데이터베이스중 Cassandra와 함께 가장 많이 사용되고 있습니다만, Cassandra와는 구별되는 뚜렷한

      특징을 가지고 있습니다. Cassandra는 성능을 우선시 할 경우 데이터 일관성이 보장되지 않을 수 있다고 말씀 드렸습니다. 대량 데이터를

      우수한 성능으로 데이터 일관성을 보장하면서 다뤄야 할 때는 어떻게 해야 할까요? 이부분에서 장점으로 가지고 있는 것이 HBase입니다.

      

      HBase는 중앙에 전체 분산 시스템을 통제하는 마스터를 두고 복제된 전체 데이터의 일관성을 관리 하기때문에 분산된 복제 데이터 사이의

      일관성을 보장하며 제약이 있지만 트랜잭셔성 처리도 지원이 가능합니다.


  - 대량 데이터분석 처리지원에 적합

    > 대량 데이터 분석 및 처리를 위해 사용되는 Hadoop의 산하 프로젝트로 시작된 데이터베이스로 HDFS 및 MapReduce등과 함께 사용하기에

      최적화 되어 있습니다. MapReduce를 지원하는 다른 데이터베이스도 있지만 별도로 개발되었기 때문에 HBase처럼 HDFS를 사용하며 

      MapReduce의 기능을 적합하게 사용하는 예는 없습니다.


      대량 데이터를 분삭하여 의미 있는 값을 만드는 데 있어 널리 사용되고 있는 MapReduce와 함께 효율적으로 이용할 수 있다는 것이 큰 

      장점 입니다.


3.3 특징과 사용 케이스

3.3.1 특징

  - 컬럼형 NoSQL 데이터베이스로기본 단위는 컬럼입니다. 여러 컬럼이 Row Key에 할당되고 이러한 Row key가 모여 테이블을 이룹니다.

    테이블 내의 Row key는 정렬되어 저장되며 해당 데이터베이스 내에서단일한 값을 가져 index와 비슷한 역할을 수행하게 됩니다.


    컬럼이 모여 Column family를 이룹니다. Column family 내의 모든 컬럼은 동일한 스토리지 파일에저장되고 데이터 압축 등 성능 개선을 위한 튜닝은

    Column family단위로 이루어 집니다. Column family내의 컬럼수에 대한제한은 없으며, 컬럼 값의 데이터 타입이나 길이에대한 제약도 없습니다. 앞서

    이야기한 것처럼 컬럼 단위로 디스크에 저장하기 때문에 행중심 데이터베이스에 비해 동일한 데이터라도 사용하는 디스크가 적습니다.


    데이터가업데이트되면 우선 commit log에 해당 내용을 저장하고 다음으로 HBase에서 사용하고 있는 메모리 상의데이터베이스(memstore)에 데이터를

    저장합니다. 이 때 commit log는 여러 무리적인 서버에 복제되기 때문에 변경된 데이터가 사라질 확률이 낮습니다. memstroe의 데이터가 미리 지정한

    크기를 넘어서면 디스크에 저장되며 저장 된 데이터에 대한 commit log는 삭제됩니다.


    분산 구성시 Master-Region 구조를 이룹니다. Region은 분산을 이루고있는기본 단위로, 연속한 row데이터를 가지고 있습니다. 구성파일에 정의해둔

    maximum size 값을 초과하면 자동으로 해당 region에서관리하고 있는 데이터의 절반을 key값을 기준으로 새 region에 분배합니다.

    참고로 현재 하나의 물리적인 서버에서 관리하는 region은 10~1000개, region 당 데이터는 1~2GB를 권고 하고 있습니다.


    HBase에서 Region의 정보를 관리하는 Master(HMaster)를 별도로 두고 있습니다. 데이터에 대한 읽기나 쓰기 요청이 발생하면 Master에서 어느 region에서

    해당 Rwo key를 관리하는지에 대한 기초 정보를 제공해 줍니다. Maste는 Region에 할당된 Row key값을 재분배 해줍니다. 장애를 예방하기 위해 Master는

    여러 대로 구성할 수 있습니다.


3.3.2 장점

  - HBase의 가장 큰 장점은 대량의데이터를 분산된 환경에서관리함녀서도 데이터일관성을 보장해 준다는 점입니다. 대량 데이터를 다루면서 일관성이 필요한

    환경에서 일관성이 완벽하게 보장되지 않는 데이터베이스를 사용한다면 프로그램 코드를 통해 데이터의 일관성을 보장해야 하므로 코딩의 복잡도가 크게

    올라가게 될것이다. HBase에서는 데이터의 일관성 보장에 초점을 맞추고 있으므로 이러한 경우에는 HBase를 사용함으로써 수고를 많이 줄일 수 있을것이다.


  - 데이터를 효율적으로 압축 할 수 있습니다. 행 기반에 비해 컬럼 기반으로 데이터를 저장하는 것이 데이터 압축을 더 효율적으로 할 수 있습니다. 일반적으로

    사용되는 행 기반으로 데이터를 입력하는 경우, 행에서 가지고 있는여러 컬럼 값은 서로 다른 데이터 타입의 차이가 큰 값일 가능성이 높습니다. 하지만

    가지고 있는 여러 컬럼 값은 서로다른 데이터 타입의 차이가 튼 값일 가능성이 높습니다. 하지만 컬럼 기반의 경우컬럼을 기준으로 데이터가 함께 저장되기

    때문에 근접 데이터 사이의 값의 차이가 크지 않아행 기반에 비해 데이터 압축률이 높습니다. 따라서 대량 데이터를 보다 경제적으로 관리할 수 있고, 대량

    조회가 발생할 경우 압축된 데이터를 가져오기 때문에 bandwidth 측면에서도 득을 볼 수 있습니다.


  - 이전 버전의 데이터 값도 관리가가능하다는 것도 장점 입니다.각기 다른 버전의 값을 통해 변경 빈도 등의데이트럴 분석 할 수 있습니다. 어느 버전까지 데이터를

    유지 할 것인지는 설정 파일을 통해 지정할 수 있브니다. 지난 버전 데이터를 통한 통계나 변경내용에 대한 분석도 가능합니다.


  - 한 행에 대한 Atomic한 처리가 가능합니다. 즉, 단일 행에 대해서는 트랜잭션성 처리가 가능하다는 장점을 가지고 있습니다. 대량 데이터를 다루면서 트랜잭션성

    처리가 필요할 경우 매우 요긴한 기능입니다. 또한 웹 콘솔을 통해 관리 및 모니터링 할 수 있는 기능을 제공하고 있습니다.


3.3.3 단점

  - 다수의 프로그램으로 이루어진 데이터베이스로다른 NoSQL 데이터베이스에 비해 이해하기가 복잡합니다. 효율적으로 관리하기 위해서는 HDFS, Zookeeper등 HBase뿐만

    아니라 다른 시스템에 대해서도 알아두어야 합니다. 단일 구조에 비해 설치 및 운영 시 시스템들의 연계로 인한 문제가 발생할 가능성이 높습니다. 뿐만 아니라 아직

    생소한 컬럼형 구조를 사용하고 있어 조기 진입에 벽이 높습니다.


  - 특정 범위의 key 값에 저장 요청이 집중되는 경우에도 문제가 발생할 수 있습니다.

    Region별로 저장되는 데이터는 Row key값에 따라 정해집니다. 즉, 일정 범위의 Row key가 Region에 함께 저장되는 구조로, 연속된 Row key를 가진 요청이 들어올 경우

    모든요청이 한두 Region에 집중되어응답 속도가 느려지는 등의 문제가 생길 수 있습니다.


  - HDFS를 파일시스템으로사용하기 때문에 HDFS의 파일 정보를 관리하는 Namenode에서 장애가 발생하거나, Namenode가 구동되어 있는 서버가 다운될 경우 HBase에도 문제가

    생기게 됩니다. 아직 Namenode는 이중화솔류션을 완벽하게 제공하지 않기때문에 전체 HDFS에서 Namenode는 하나뿐입니다. 따라서 Namenode가 중단되면 전체 서비스 중단이

    발생하게 됩니다.


  - Cassandra와 마찬가지로 현재 0.9.4로 아직 버전 1이 나오지 않은 안정적이지 않은 시스템입니다.

    신규 버전이 기존 버전에서 많이 변경되어 불편이 생길수도 있습니다.


3.3.4 도입사례

  - 최근 Facebook에서 데이터 일관성 보장을 이유를 들어 MySQL을대신하는 주 데이터베이스로 도입하기도 하였습니다.

    > Facebook

    > eBay

    > WorldLingo

  이외에도 Adobe 등에서 분석등의 용도로 HBase를 사용 하고 있습니다.


3.3.5 사용 케이스

  - 대량 데이터를 다루면서 데이터 일관성이 요구되는 서비스에서사용하는 것을 권장하고 있습니다. 또한 hadoop을 사용하여 대량 데이터를 분석하는 서비스의 대용량

    데이터베이스로 사용하는 경우도 많습니다.

    > 대량 데이터를 관리하는 사이트 중에서도 쓰기보다는 읽기 요청이 많은 사이트에 적합

    > 대량 데이터를 관리하면서 데이터 일관성 및 트랜잭션성 처리가 필요한 사이트

    > Hadoop을 사용하여 대량 데이터를 분석해야 하는 경우

  

  - HBase에서는 적어도 5대 이상의 서버에서 수백만행 이상의 데이터를 다루는데 사용 할 것을 권고 하고 있습니다.

    대량 데이터 중에서도 동시에 다수의 쓰기가 발생하는 성격의 업무보다는 DW성 데이터 처리에 적합하다고 합니다.


4.1 구체적인 이용 예

4.1.1 대형 SNS서비스의 주 스토리지

  - 대규모 SNS 서비스의 주 스토리지로 사용하는 것도 좋을것입니다. 이미 Facebook에서 주 스토리지로 도입하여 사용하고 있습니다.


  - 대량의 쓰기/읽기 요청

    > Twitter나 Faceboo, 카카오톡에서 제공하는 주 서비스를 생각해 보면 수천만 사용자가 실시간으로 데이터를 입력하고 검색하는 요청이

      계속해서 들어오게 됩니다. 하지만 데이터의 구조는 매우 간단하며 사용자와 키워드 검색이 주를 이룹니다. 새로 업데이트된 데이터에 대한

      읽기 요청이 계속해서 발생하기 때문에 데이터 일관성은 보장되어야 하며 쓰기 성능뿐아니라 검색 성능도 매우 중요합니다.


  - 관계형 데이터베이스를 사용한 운용

    > 수백,수천만의데이터 쓰기가 계속해서 요청되는 상황에서는 계속해서 Lock이 발생하여 데이터 읽기와 쓰기 모두 적합한 성능을 보이기 어려울

      뿐더러 관계형 데이터베이스를 이용해서 데이터의 급속한 증가를 관리하는 데는한계가 있습니다. 또한 이러한 대량 데이터를 조회하여 대량의 

      결과가 나와야 하는 경우, 분산에 한계가 있는 관계형 데이터베이스에서는 소수의 서버의 적은 자원으로 대량 요청을 처리해야 하므로 속도와

      성능이 좋지 못하고, 다른 요청을 처리하기도 어려울 것으로 보입니다.


  - HBase를 사용한 운용

    > 다수의 저가 서버(PC)를 분산해서 사용할 수 있는 HBase를 통해 관계형 데이터베이스에서 나타나는 이러한 이슈를 대부분 해결할 수 있습니다.

      테이블의 데이터 입력에 대한 Lock이 발생하지 않으며 데이터가 급속히 증가하더라도 단일 데이터 입력의 비용이 저렴할 뿐 아니라 많은 수의

      서버로 분산되어 부담을 줄일 수 있습니다. 데이터의 일관성이 실시간으로 필요하며 대량 데이터를 다룬다면 HBase를 도입해서 사용하는 것이

      좋을 것입니다.



저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[JIRA] JIRA REST API 이슈등록

2016.07.26 11:42 Utility Tip&Tech


1. JIRA REST API 이슈등록


http://pseg.or.kr/pseg/infouse/5336


https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials/jira-rest-api-example-create-issue


2. JIRA Issue 등록 테스트 포스팅

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[BootStrap 3] ScrollSpy

2016.06.19 18:19 Development/WebUI FrameWork | BootStrap


부트스트랩 스크롤 스파이 엘리먼트에 적용

링크 : http://tutsme-webdesign.info/bootstrap-3-scrollspy/

<body>
<div class="container">
    <nav id="target_nav" class="col-md-3">
        <ul class="nav list-group">
            <li class="list-group-item"><a href="#one">One</a></li>
            <li class="list-group-item"><a href="#two">Two</a></li>
            <li class="list-group-item"><a href="#three">Three</a></li>
            <li class="list-group-item"><a href="#four">Four</a></li>
        </ul>
    </nav>
    <div id="scroll-able" class="col-md-6">
        <section><h4 id="one">One</h4><p>Pellentesque habitant morbi tristique senectus et netus ... metus</p></section>
        <section><h4 id="two">Two</h4><p>Pellentesque habitant morbi tristique senectus et netus ... metus</p></section>
        <section><h4 id="three">Three</h4><p>Pellentesque habitant morbi tristique senectus et netus ... metus</p></section>
        <section><h4 id="four">Four</h4><p>Pellentesque habitant morbi tristique senectus et netus ... metus</p></section>
   </div>
</div>
 
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.0.2/js/bootstrap.min.js"></script>
<script>
  $('div#scroll-able').scrollspy({ target: '#target_nav' });
</script>
</body>


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[BootStrap 3] popover Example

2016.06.19 18:16 Development/WebUI FrameWork | BootStrap


링크1 : http://www.w3schools.com/bootstrap/bootstrap_ref_js_popover.asp

링크2 : http://www.w3schools.com/bootstrap/tryit.asp?filename=trybs_ref_js_popover_methods&stacked=h


<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <style>
  a {
      font-size: 25px;
  }
  </style>
</head>
<body>

<div class="container">
  <h3>Popover Methods</h3>
  <a href="#" data-toggle="popover" title="Popover Header" data-content="Some content inside the popover">Popover Example</a>
  <div>
    <p>Click on the buttons to manually control the popover above:</p>
    <button type="button" class="btn btn-primary">Show</button>
    <button type="button" class="btn btn-warning">Hide</button>
    <button type="button" class="btn btn-success">Toggle</button>
    <button type="button" class="btn btn-danger">Destroy</button>
  </div>
</div>

<script>
$(document).ready(function(){
    $(".btn-primary").click(function(){
        $("[data-toggle='popover']").popover('show');
    });
    $(".btn-warning").click(function(){
        $("[data-toggle='popover']").popover('hide');
    });
    $(".btn-success").click(function(){
        $("[data-toggle='popover']").popover('toggle');
    });
    $(".btn-danger").click(function(){
       $("[data-toggle='popover']").popover('destroy');
    });
});
</script>

</body>
</html>


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[BootStrap 3] popover live

2016.06.19 18:12 Development/WebUI FrameWork | BootStrap


부트스트랩 팝오버 컴포넌트를 사용하려다 보면, live / on 으로 이벤트를 바인딩 해야할 경우가 있다.

jsFiddle 에 누가 올려놓음. 링크


그래서~ 아래와 같이


HTML

<div id="popover-triggers">
    <a class="btn has-popover" data-content="Hello world">Initial trigger</a>
</div>
<a class="btn btn-orange add-one">Add new Popover trigger</a>
$('body').popover({
    selector: '.has-popover',
    trigger: 'hover'
});

$('.add-one').on('click', function () {
    $('#popover-triggers').append("Added trigger")
;});


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

jQuery PlugIn - 커스텀 스크롤 라이브러리

2016.06.19 18:09 Development/JavaScript | jQuery-PlugIn



저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[BootStrap] Tooltip Styling

2016.06.19 18:06 Development/WebUI FrameWork | BootStrap


부트스트랩 툴팁에 대한 스타일링~


HTML

<a href="#" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="Tooltip on bottom" class="red-tooltip">Tooltip on bottom</a>


CSS


.red-tooltip + .tooltip > .tooltip-inner {background-color: #f00;}
.red-tooltip + .tooltip > .tooltip-arrow { border-bottom-color:#f00; }

JS


$(document).ready(function(){
    $("a").tooltip();
});
저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

Include File List

2016.05.17 10:42 Development/PHP


	$includeFiles = get_included_files();
	echo '<h1>Include File List</h1>';
	$i = 1;
	foreach ($includeFiles as $if)
	{
		echo " <p> $i : $if </p> ";
		$i++;
	}


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[펌] 커버링인덱스

2016.04.24 23:44 DataBase/MySQL


본문 : http://gywn.net/2012/04/mysql-covering-index/


MySQL에서 커버링 인덱스로 쿼리 성능을 높여보자!!

안녕하세요.  오늘 짧지만 재미있는 내용을 하나 공유할까 합니다.

커버링 인덱스(Covering Index)라는 내용인데, 대용량 데이터 처리 시 적절하게 커버링 인덱스를 활용하여 쿼리를 작성하면 성능을 상당 부분 높일 수 있습니다.

커버링 인덱스란?

커버링 인덱스란 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미합니다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 있으며, 칼럼을 읽기 위해 굳이 데이터 블록을 보지 않아도 됩니다.

인덱스는 행 전체 크기보다 훨씬 작으며, 인덱스 값에 따라 정렬이 되기 때문에 Sequential Read 접근할 수 있기 때문에, 커버링 인덱스를 사용하면 결과적으로 쿼리 성능을 비약적으로 올릴 수 있습니다.

백문이 불여일견! 아래 테스트를 보시죠.

테이블 생성

먼저 다음과 같이 테이블을 생성합니다.

create table usertest (
 userno int(11) not null auto_increment,
 userid varchar(20) not null default '',
 nickname varchar(20) not null default '',
 .. 중략 ..
 chgdate varchar(15) not null default '',
 primary key (userno),
 key chgdate (chgdate)
) engine=innodb;

약 1,000만 건 데이터를 무작위로 넣고 몇가지 테스트를 해봅니다.

커버링 인덱스(SELECT)

select chgdate , userno
from usertest
limit 100000, 100
************* 1. row *************
           id: 1
  select_type: SIMPLE
        table: usertest
         type: index
possible_keys: NULL
          key: CHGDATE
      key_len: 47
          ref: NULL
         rows: 9228802
        Extra: Using index
1 row in set (0.00 sec)

쿼리 실행 계획의 Extra 필드에 “Using Index” 결과를 볼 수 있는데, 이는 인덱스만으로 원하는 데이터 추출을 하였음을 알 수 있습니다.

이처럼 데이터 추출을 인덱스에서만 수행하는 것을 커버링 인덱스라고 합니다. 아시겠죠? ^^

그렇다면 일반 쿼리와 성능 테스트를 해볼까요?

커버링 인덱스(WHERE)

1) 일반 쿼리

select *
from usertest
where chgdate like '2010%'
limit 100000, 100

쿼리 수행 속도는 30.37초이며, 쿼리 실행 계획은 다음과 같습니다.

************* 1. row *************
           id: 1
  select_type: SIMPLE
        table: usertest
         type: range
possible_keys: CHGDATE
          key: CHGDATE
      key_len: 47
          ref: NULL
         rows: 4352950
        Extra: Using where

Extra 항목에서 “Using where” 내용은, Range 검색 이후 데이터는 직접 데이터 필드에 접근하여 추출한 것으로 보면 됩니다.

2) 커버링 인덱스 쿼리

select a.*
from (
      select userno
      from usertest
      where chgdate like '2012%'
      limit 100000, 100
) b join usertest a on b.userno = a.userno

쿼리 수행 시간은 0.16초이며 실행 계획은 다음과 같습니다.

************* 1. row *************
           id: 1
  select_type: PRIMARY
        table:
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 100
        Extra:
************* 2. row *************
           id: 1
  select_type: PRIMARY
        table: a
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: b.userno
         rows: 1
        Extra:
************* 3. row *************
           id: 2
  select_type: DERIVED
        table: usertest
         type: range
possible_keys: CHGDATE
          key: CHGDATE
      key_len: 47
          ref: NULL
         rows: 4352950
        Extra: Using where; Using index

Extra 에서 “Using Index”를 확인할 수 있습니다.

그렇다면 30초 넘게 수행되는 쿼리가 0.16초로 단축됐습니다. 왜 이렇게 큰 차이가 발생했을까요?

첫 번째 쿼리는 Where에서 부분 처리된 결과 셋을 Limit 구문에서 일정 범위를 추출하고, 추출된 값을 데이터 블록에 접근하여 원하는 필드를 가져오기 때문에 수행 속도가 느립니다.

두 번째 쿼리에서도 동일하게 Where에서 부분 처리된 결과 셋이 Limit 구문에서 일정 범위 추출되나, 정작 필요한 값은 테이블의 Primary Key인 userno 값입니다. InnoDB에서 모든 인덱스 Value에는 Primary Key를 값으로 가지기 때문에, 결과적으로 인덱스 접근만으로 원하는 데이터를 가져올 수 있게 됩니다. 최종적으로 조회할 데이터 추출을 위해서 데이터 블록에 접근하는 건 수는 서브 쿼리 안에 있는 결과 갯수, 즉 100건이기 때문에 첫 번째 쿼리 대비 월등하게 좋은 성능이 나온 것입니다.

커버링 인덱스(ORDER BY)

커버링 인덱스를 잘 사용하면 Full Scan 또한 방지할 수 있습니다. 대부분 RDBMS에는 테이블에 대한 통계 정보가 있고, 통계 정보를 활용해서 쿼리 실행을 최적화 합니다.

다음 재미있는 테스트 결과를 보여드리겠습니다. 전체 테이블에서 chgdate 역순으로 400000번째 데이터부터 10 건만 가져오는 쿼리입니다.

1) 일반 쿼리

select *
from usertest
order by chgdate
limit 400000, 100
************* 1. row *************
           id: 1
  select_type: SIMPLE
        table: usertest
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 9228802
        Extra: Using filesort
1 row in set (0.00 sec)

분명 인덱스가 있음에도, Full Scan 및 File Sorting이 발생합니다. 인덱스를 태웠을 때 인덱스 블록을 읽어들이면서 발생하는 비용보다 단순 Full Scan이 더 빠르다고 통계 정보로부터 판단했기 때문이죠. 인덱스도 데이터라는 것은 항상 기억하고 있어야 합니다^^

결과 시간은 책정 불가입니다. (안끝나요~!)

2) 커버링 인덱스 쿼리

위 결과와 다르게 커버링 인덱스는 조금 더 재미있는 결과를 보여줍니다.

select a.*
from (
      select userno
      from usertest
      order by chgdate
      limit 400000, 100
) b join usertest a on b.userno = a.userno
************* 1. row *************
           id: 1
  select_type: PRIMARY
        table:
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 100
        Extra:
************* 2. row *************
           id: 1
  select_type: PRIMARY
        table: a
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: b.userno
         rows: 1
        Extra:
************* 3. row *************
           id: 2
  select_type: DERIVED
        table: usertest
         type: index
possible_keys: NULL
          key: CHGDATE
      key_len: 47
          ref: NULL
         rows: 400100
        Extra: Using index

File Sorting이 발생하지 않고 커버링 인덱스가 사용되었으며, 실행 시간 또한 0.24초로 빠르게 나왔습니다.^^

Conclusion

커버링 인덱스는 InnoDB와 같이 인덱스와 데이터 모두 메모리에 올라와 있는 경우에 유용하게 쓰일 수 있습니다. 물론 커버링 인덱스가 좋기는 하지만, 커버링 인덱스를 사용하기 위해 사용하지 않는 인덱스를 주구장창 만드는 것은 최대한 피해야 하겠죠^^

잊지마세요. 인덱스도 데이터라는 사실을..


저작자 표시
신고

'DataBase > MySQL' 카테고리의 다른 글

MySQL 정규식으로 치환 함수  (0) 2017.02.02
UNIXTIME 관련 함수  (0) 2017.02.02
[펌] 커버링인덱스  (0) 2016.04.24
[링크] MySQL에서 사용하는 Lock 이해  (0) 2015.09.22
MySQL Split - 문자열 자름 처리.  (0) 2015.09.21
참조키 강제 해제  (0) 2015.06.03
현재 0 개의 댓글이 있습니다.
Comment

Blog

[IIS] PHPManager Windows 10 설치오류

2016.04.05 13:57 OS/Windows



윈도우를 10 으로 교체 로컬개발환경 구성중에 IIS용 PHPManager 띄우는데 계속 에러나는데,

짜증나 죽을뻔;;


레지스트리 편집기에서 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters

로 찾아들어가보면 MajorVersion 10진수값을 8로 변경~


구글링해서 나온 결과로 내가 적용시킨건 아래 링크들.


윈도우10 IIS PHP관리자(PHP Manager) 설치하기

https://forums.iis.net/t/1159252.aspx


저작자 표시
신고

'OS > Windows' 카테고리의 다른 글

윈도우 콘솔 UTF-8  (0) 2016.10.24
[IIS] PHPManager Windows 10 설치오류  (0) 2016.04.05
액세스 거부 폴더 삭제  (0) 2014.11.02
데스크탑을 멀티로 사용해보자  (0) 2013.10.16
ATTRIB - 폴더에 읽기전용 권한  (0) 2013.08.13
ICACLS - 콘솔에서 폴더권한 지정  (0) 2013.08.13
현재 0 개의 댓글이 있습니다.
Comment

Blog

[파워포인트] 트루타입이 아닙니다

2016.04.01 10:03 Utility Tip&Tech


파워포인트 새로 작업하다 보면, 

자꾸 짜증나게 트루타입이 아니라는 메세지가 나타난다.

대체 뭐 어쩌라는기여??


그래서 옵션을 뒤적거리다보니 찝찝하게 해결은 했다;;




옵션 > 저장 탭 맨 밑에 보면 아래와 같이 나와있다.

여서 체크해제 저장~ 귀구욱~


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

ERWinGenerateSQLForMySQL - ERWIN 에서 생성된 mysql 스크립트 변환

2016.03.21 07:56 From JKUN Development




ERWIN 에서 모델링된 결과를 가지고 SQL 스크립트를 생성하다 보면,

mysql 은 아직 좀 부족한것 같은... INT 도 INTEGER.. 

AUTO_INCREMENT 역시.. 그리고 UNSIGNED 옵션을 넣기도 불편...


그래서 간단하게 만들어봤습니다.

이 기준은 현재 사용하고 있는 ERWin 7.3Ver 기준, 닷넷프레임워크 4.5 기준입니다.


맨 처음 화면에서 ERWin Schema Generation 기능을 통해서 Preview 를 보면 생성될 스크립트가,

나타나면 그것을 복사해다가 ERWin Generate SQL 입력박스에 붙여넣는다.

UNSIGNED 에 관한 옵션을 필요에 따라 체크한다.

다 했음 "Convert" ㅋㅋㅋ 그럼 아래와 같이 옵션이 적용된 변경된 스크립트가 표시되며,

클립보드에 복사되는 것까지. 아주아주 얉고 간단한 수준으로.

필요하시면 가져가십시오. 배포되는 압축파일도 그냥 릴리즈시켜 exe 파일 압축시킨겁니다.ㅎㅎㅎ


의문사항 있으시면 댓글로 문의바랍니다~



ERWinGenerateSQLForMySQL.zip



저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

디자인 패턴 종류

2016.03.09 17:38 Development/Design Pattern


Gof 디자인 패턴

디자인 패턴의 종류

저작자 표시
신고

'Development > Design Pattern' 카테고리의 다른 글

디자인 패턴 종류  (0) 2016.03.09
디자인 패턴 블로그 링크 모음  (0) 2014.02.27
디자인 패턴  (0) 2014.02.27
현재 0 개의 댓글이 있습니다.
Comment

Blog

[펌] 자바스크립트에서 strict mode를 사용해야 하는 이유

2016.03.09 15:21 Development/JavaScript


출처 : http://blog.aliencube.org/

이 포스트는 Stack Overflow의 What does “use strict” do in JavaScript, and what is the reasoning behind it?의 질문과 답변을 번역한 내용입니다.

자바스크립트에서 use strict는 뭘 하는 것이고, 왜 그걸 써야 하나요?

질문:

최근에 내가 짰던 자바스크립트 코드를 크록포드의 JSLint를 통해 실행시켰더니 아래와 같은 에러가 나타났습니다:

Problem at line 1 character 1: Missing “use strict” statement.

검색을 좀 해봤는데, 몇몇 사람들이 "use strict;" 라인을 그들의 자바스크립트 코드에 추가했다는 것을 알아챘습니다. 저도 이것을 따라서 추가해 봤더니, 위의 에러가 더이상 나타나지 않네요. 구글에서 검색을 해 봤는데, 이것을 추가하는 이유에 대해서 딱히 찾을 수가 없더라구요. 분명히 이것을 통해 브라우저가 자바스크립트를 해석하는 데 영향을 주는 것 같은데, 이걸 사용하면 나타날 수 있는 효과에 대한 것에 대한 것을 전혀 모르겠습니다.

"use strict";가 도대체 무엇이고, 이것이 의미하는 것은 무엇이며, 필요하긴 한 건가요?

현재 쓰이고 있는 브라우저들이 이 "use strict"; 문자열에 대응하는지요, 아니면 향후에 쓰일 것에 대한 대비인가요?


답변: (가장 추천수가 높은 것만을 번역했습니다: 역자 주)

이 문서가 도움이 될 겁니다: John Resig – ECMAScript 5 Strict Mode, JSON, and More

인상적인 부분을 살짝 인용하자면:

Strict Mode is a new feature in ECMAScript 5 that allows you to place a program, or a function, in a “strict” operating context. This strict context prevents certain actions from being taken and throws more exceptions.

Strict Mode는 ECMAScript 5 버전에 있는 새로운 기능으로써, 당신의 프로그램 또는 함수를 엄격한 운용 콘텍스트 안에서 실행시킬 수 있게끔 합니다. 이 엄격한 콘텍스트는 몇가지 액션들을 실행할 수 없도록 하며, 좀 더 많은 예외를 발생시킵니다.

이와 더불어:

Strict mode helps out in a couple ways:

  • It catches some common coding bloopers, throwing exceptions.
  • It prevents, or throws errors, when relatively “unsafe” actions are taken (such as gaining access to the global object).
  • It disables features that are confusing or poorly thought out.

Strict Mode는 몇가지 면에서 도움이 되는데:

  • 흔히 발생하는 코딩 실수를 잡아내서 예외를 발생시킵니다.
  • 상대적으로 안전하지 않은 액션이 발생하는 것을 방지하거나 그럴 때 예외를 발생시킵니다. 예를 들자면 전역객체들에 접근하려 한다거나 하는 것들이겠지요.
  • 혼란스럽거나 제대로 고려되지 않은 기능들을 비활성화시킵니다.

이 strict mode는 파일 전체에 적용시킬 수도 있고, 아니면 특정한 함수 안에서만 적용시킬 수도 있습니다.

위와 같은 방식으로 한다면, 예전의 레거시 코드와 새 코드가 한 파일 안에 섞여 있을 때 도움이 될 것입니다.

아마도 이 "use strict";는 왠지 Perl 에서 온 것 같기도 하네요. 이것을 사용함으로써 오류가 발생할 수 있는 좀 더 많은 부분을 검사할테니, 훨씬 더 적은 에러를 만들 수 있을 겁니다.


역자 추가:

위의 내용과 더불어 Can I use ECMAScript 5 Strict Mode? 페이지를 보면 지원하는 브라우저의 버전을 제공하고 있는데, IE는 이strict mode를 버전 10부터 지원한다. 그렇다고 해서 낮은 버전의 IE를 위해서 쓰지 말아야 하는가 하면 그렇지도 않다. 위에 언급한John Resig의 포스트를 다시 인용하자면:

This means that you can turn strict mode on in your scripts – today – and it’ll have, at worst, no side effect in old browsers.

strict mode를 지금 당장 활성화 시켜야 한다는 것을 의미하고, 이전 브라우저에서는 최악의 경우에라도 아무런 부작용이 없습니다.

따라서, 기존의 자바스크립트 코드에 대해 좀 더 엄격한 검사를 실행시키고 싶다면 문서의 첫 줄에 "use strict";를 추가하고, 기존의 것은 그대로 놔두고, 새로운 코드에 대해서만 추가하고 싶다면 각각의 함수 블록 처음에 추가하는 것이 좋겠다.

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

[펌] +function() 의 원리

2016.03.09 15:18 Development/JavaScript


출처 : http://blog.coderifleman.com

오픈소스나 레거시 읽다 보면 종종 +function(){}() 같은 코드를 마주하게됩니다. 이 코드가 혼란스러운 분들을 위해 +function(){}()이 무엇인지 그리고 어떻게 동작하는 것인지 간략히 정리해보겠습니다.

엔진이 함수를 실행하는 방법

함수를 실행하기 위해서는 이름(식별자)이 필요합니다. 이름이 있어야 스코프에서 값을 참조할 수 있기 때문입니다.

예를 들어 function foo(){}를 정의하면 foo(); 구문을 이용해 함수를 실행할 수 있습니다.

함수를 실행하는 흐름<그림 1 함수를 실행하는 흐름>

엔진이 함수 선언문을 만나면 식별자를 관리하는 특별한 집합(EnviromentRecord)에 함수의 이름을 식별자로 넣고 함수 객체를 생성하여 참조합니다. 그리고 함수 실행 구문 중 foo를 만나면 값을 스코프를 통해 가져옵니다. 그 다음 구문이 () 이므로 실행 가능하다면 실행합니다.

만약 스코프에서 식별자를 찾지 못했다면 참조 에러(ReferenceError)를 출력하고, 식별자는 찾았지만 실행할 수 없는 타입이라면 타입 에러(TypeError)를 출력합니다.

not(); // ReferenceError: not is not defined

var foo = 'some';
foo(); // TypeError: foo is not a function

익명함수를 선언하는 방법

function(){} 구문은 이름 없는 “익명함수” 이므로 엔진이 스코프를 통해 값을 가져올 수 있는 방법이 없습니다. 따라서 이 문법을 실행하면 함수의 이름이 필요하다고 문법 오류를 출력합니다.(이 오류 메시지는 브라우저 마다 다릅니다.)

function(){} // SyntaxError: function statement requires a name

이름 없는 함수를 선언할 수 있는 유일한 경우는 함수를 값으로 사용(전달, 대입, 반환, 연산)할 때 입니다.

var func = function(){console.log('ok');}() // ok
some(function(){console.log('ok');})() // ok
return function(){console.log('ok');}() // ok
(function(){console.log('ok');})(); // ok
+function(){console.log('ok');}() // ok
!function(){console.log('ok');}() // ok

자바스크립트 엔진은 단항연산자(-, +, ~, !)를 만나게 되면 function(){}을 값으로 평가합니다. 쉽게 말해 연산을 위해 함수 객체를 생성하게 되고 최종적으로 () 구문을 이용해 실행할 수 있는 것입니다.

+function(){}은 함수 객체를 + 하려고 했으므로 결과로 NaN이 출력됩니다.

+function(){} // NaN

결론

결국 +function(){}()은 익명 함수를 즉시 실행시키기 위해 엔진의 원리를 이용해 만든 편법입니다.

이 원리를 이용한 즉시 실행 함수 중 가장 대중적인 방식은 (function(){})()입니다. ()는 구문 평가를 하는데 평가된 결과가 함수이니 함수 객체를 만들고 이어서 () 구문으로 즉시 실행하는 방식입니다.

(function(){}) // function() 객체
(function(){})() // 즉시 실행

남이 읽을때 혼란스럽지 않아야 좋은 코드라고 할 수 있겠죠. 따라서 비대중적인 +function(){}() 보다 (function(){})() 사용하여 코드를 읽는 개발자가 즉시 실행하는 함수 임을 쉽게 알 수 있도록 하는편이 좋겠습니다.

자바스크립트는 구문이 유연하기 때문에 자신만의 규칙이나 법칙을 만들기 쉽습니다. 하지만 이는 협업시 독이 될 수 있음을 명심해야합니다.

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

지식공유 서비스 - SlimWiki

2016.03.09 12:27 Development/INFRA


순수하게 팀간 지식만 공유할 수 있는게 없을까 하는 생각이 문득들었다.

같이 이야기 하고 지내는 사람들과 순간순간 메신저에서 지식을 공유하고는 했지만 그 내용을 다시 보려면

손가락 골절 스크롤 압박;;

그래서 무작정 구글링 중 Free Forever 란 고마운 문구를 보고 들어갔다. ㅎㅎ



https://slimwiki.com/


장점 - 콜렉션으로 만들어서 페이지를 만들어 해당 지식을 Private &  Public 으로 공유할 수 있다.

단점 - 파일은 이미지만 ~ 


그래도 스타트업이나 스터디 그룹간에는 좋은 서비스인것만은 맞는것 같다.

저작자 표시
신고

'Development > INFRA' 카테고리의 다른 글

지식공유 서비스 - SlimWiki  (0) 2016.03.09
현재 0 개의 댓글이 있습니다.
Comment

Blog

프로젝트 환경 [ Taiga + HipChat + BitBucket + SourceTree + Vagrant (NgineX/PHP/MariaDB) + IDE(PHPStorm) ]

2016.02.29 17:51 Development/PHP


이번에 진행중인 프로젝트에 대한 전체적인 인프라 환경을 구축한 히스토리를 포스팅합니다.

한번씩 테스트 해본 경우, 개인적으로는 굉장히 유익한 경험 이었습니다.

초기 스타트업 같은 경우 전반적인 인프라를 구축하면서도, 소요 비용은 항상 고민적인 요소입니다만,

아래 사항에서 PHPStorm 만 제외하고는 비용절감에 큰 효과를 줄 수 있을것 같습니다.


전체적인 구성은 다음과 같습니다.

 프로젝트 관리 (이슈관리 및 태스크 관리)

 Taiga (https://taiga.io/)

 커뮤니케이션

 HipChat (http://hipchat.com/)

 소스코드 관리 도구 및 저장소

 BitBucket (https://bitbucket.org)

 SourceTree (https://www.sourcetreeapp.com/)

 개발환경(VM)

 VirtualBox + Vagrant 

 개발환경 구성

 OS : Ubuntu 14.04 LTS

 NgineX, MariaDB, PHP ( CodeIgniter )

 IDE

 PHPStorm Or EclipsePDT + xDebug

위 목록 링크 에서부터 순서대로 포스팅 되어있습니다.

Taiga

taiga 는 기본적으로 애자일을 근본으로 합니다. 기본적으로 칸반보드와 스크럼을 선택하게 되어있습니다.


하지만 관리기능에서 모듈을 선택하여 백로그, 이슈 등을 추가할 수 있습니다.

해서 프로젝트를 생성하고 나면, 다음과 같이 대시보드 화면으로 진입합니다.


여기서는 User History + Sprint 등 해서 사용이 가능하도록 되어있습니다. 현재는 스크럼 방식이나 ,


위와 같이 칸반보드및 다른 모듈을 추가 (Enable) 할 수 있습니다.

일단은 자세한 기능은 직접 겪어서 사용해보시는 게 좋을 듯 합니다. JIRA 나 Redmine 을 사용하셨던 분들은 더욱 수월히

사용하실 수 있을거라 생각됩니다.^^;;


해서 이렇게 생성된 프로젝트를 기본으로 확장하면서 부터 빛을 발하는것 같습니다.

이제 HipChat, BitBucket 설정을 시작합니다.

(전 개인적으로 인터페이스 슬랙보다는 힙챗이 더 이쁘다고.. ㅎㅎㅎ)



좌측 아이콘 맨 아래 (ADMIN) 을 선택하시면 위와 같은 화면이 활성화 됩니다.

그럼 INTEGRATIONS 에서는 깃허브, 비트버켓 등의 저장소등과 연동하실 수 있으며, PLUGINS 에서는 슬랙이나 힙챗등을

연동하실 수 있습니다.


순서는 무관하나 먼저 힙챗과 연동시키는 순서입니다.


PLUGINS - HIPCHAT

먼저 힙챗에 접속해 계정이 없으면 만드시고, 있으면 로그인 합니다..



그럼 다음과 같이 웹 또는 앱으로 진행하실 수 있도록 초기화면이 나타납니다.



이제 위에 Launch the web app 버튼을 클릭하시면 다음과 같이 메신저 인터페이스로 전환됩니다.



이제부터 스피드한 포스팅으로..^^;;


최초 ROOM 을 개설합니다. ( Create a Room )


채팅룸이 개설한 후에는 힙챗의 Integrations 기능을 이용해야 합니다.

적용 루트는 대시보드와 채팅 인터페이스에서 모두 가능합니다.




이제 Integrations 설정 화면으로 이동하면, 여러 통합기능들을 확인하실 수 있습니다.


하지만 목록중에서 Taiga 는 등록되어있지 않습니다.

해서 Build your own integration 카드를 클릭해 주세요.


그럼 위와 같이 새로 추가되는 화면으로 전환되며, 여기서 적당한 별칭을 지정해주시면 됩니다.

일단은 Taiga 로 등록.. 


이제 다음과 같이 Taiga 와 힙챗이 연동될 수 있도록 포스팅 URL 및 정보가 나타납니다.


이제 위에서 포스팅 URL ( Send messages to this room by posting to this URL ) 을 복사하여,

다시 Taiga 로 이동하여 HipChat webhook url 에 붙여넣고 Save 해 주세요.



그리고 Test 버튼을 클릭하시면! 

이렇게 Taiga 에서 힙챗 채팅룸으로 테스트 메세지를 보낸 것을 확인하실 수 있습니다.

( 어휴~ 포스팅 빡셉니다;;; )


참 HipChat 은 스마트폰 앱으로도 있습니다. 여러모로 참 유용하죠.


이제 이렇게 까지 Taiga 와 HipChat 연동은 되었구요. 이제 추가 테스트로 Task 를 등록하고, 힙챗까지 Task 등록 메세지까지

자동 발송되는것을 확인합니다.





요만하면 지금까지만으로나 꽤나 쓸만하지요? ㅎㅎ

위에 예제에서와 같이 저장소를 등록하고, 소스트리등을 이용하여 소스코드를 Push 하면 위처럼 힙챗 채팅룸으로 메세지가 보내집니다.

그럼 하나의 작업으로 여겨졌던 불필요한 커뮤니케이션 시간도 단축시킬 수 있으며,

작업 히스토리를 더운 간편하게 확인할 수 있겠지요.


이제 저장소 (BitBucket) 을 연결하는게 남았습니다.

하지만 비트버켓에서 계정등록/저장소 생성까지 캡쳐포스팅은 오바에 가까운 생각이 들어서요.

일단은 패스합니다. 이미 구글링이나 아니면, 그냥 계정 생성하보시면 한눈에 아실 수 있을거란 생각이 들기도 합니다.


해서 힙챗과 연동하는것만요.^^;; 



BitBucket 에서 HipChat 연결. Connection HipChat 버튼을 누르면 계정이 연동되도록 힙챗 로그인 페이지로 이동합니다.



HipChat 에서 BitBucket Repository 선택


이제 프로젝트 관리와 저장소와 커뮤니케이션까지의 구성은 완료되었습니다.

Taiga 와 Asana 연동으로 일정관리까지 한눈에 보고 싶었으나 실패했습니다. ㅎㅎㅎ

만일 캘린더및 전체적인 일정까지 한눈에 보실 수 있도록 추가 PlugIn 및 Integration 연동 경험 공유해주시면 진심으로

감사드리겠습니다. ^^


이제 Virtual Box 와 Vagrant 로 Ubuntu 기반 NgineX, MariaDB, PHP ( CodeIgniter ) 환경구성을 포스팅하면,

맨 처음 언급한 전체적인 프로젝트 관리및 개발 환경은 완성 되었지 싶습니다.

추후 포스팅까진 힘들더라도 훌륭하신 개발자님들의 포스팅 링크로 대체할 수 도 있음을 미리.. ㅎㅎㅎㅎㅎ


초기 스타트 업 팀 및 이미 유지되고 있는 조직에서 프로젝트 관리 프로세스 및 개발환경 구성은 매우 중요한 요소라는

생각이 듭니다. 하지만 더욱 이와 맞물리게 더욱 중요하건 기획 과 프로젝트 관리 가 얼마나 정확하게 동기화 되고 있느냐가

핵심적인 요소가 아니지 싶네요. 짧은 식견에 말많은 포스팅이라 민망하네요.

다음은 JIRA 를 열심히 훑어봐서 아틀라시안 풀셋 연동 포스팅 한번 해봐야겠습니다. ㅎㅎㅎ


아;; 힘든 포스팅이었습니다. 댓글 부탁합니다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ


저작자 표시
신고
현재 1 개의 댓글이 있습니다.

XO 2016.03.18 20:10 신고

좋은 포스팅 감사합니당~


Comment

Blog

jquery attribute (속성 존재여부)

2016.01.21 18:16 Development/JavaScript | jQuery


Navtive

$(this)[0].hasAttribute('name');

jQuery

$(this).is('[name]');//boolean
$(this).filter('[name="jkun"]');

개인적으로는 is 메소드를 더 선호

저작자 표시
신고

'Development > JavaScript | jQuery' 카테고리의 다른 글

jquery attribute (속성 존재여부)  (0) 2016.01.21
$.when()  (0) 2015.04.13
노드 다루기  (0) 2014.12.29
jQuery Form Reset  (0) 2014.05.13
window.resize 크로스 브라우징  (0) 2013.11.15
현재 0 개의 댓글이 있습니다.
Comment