ASP 인코딩 설정 오류 한글 깨짐 UTF-8로 바꾸기


안녕하세요 고코더 입니다.

ASP를 처음 접한 개발자분들이 단골로 걸리는 문제입니다.

▼코딩 후에 웹상에서 한글이 이상한 문자로 보이는 문제 일 경우


▼해당 소스를 문서 맨위에 코딩하시면 됩니다
1
2
3
4
5
6
7
8
<%@Language="VBScript" CODEPAGE="65001" %>
<%
 
  Response.CharSet="utf-8"
  Session.codepage="65001"
  Response.codepage="65001"
  Response.ContentType="text/html;charset=utf-8"
%>
cs




그리고 문서 자체 인코딩 설정도 UTF-8로 해주시면 됩니다.^^



+고코더의 강의추천

파일 인코딩을 변경하는 방법을 배워보세요




마무리


개발은 이제 인코딩은 UTF-8 이상으로 하시길 바랍니다. 


댓글을 달아 주세요



server에 file 존재여부 확인하기


안녕하세요. 고코더 입니다.
오늘은 업로드할때 유효성 검사를 위한 방법을 알아보겠습니다.

고유한 파일명만을 업로드 한다면
같은 파일 이름은 허용하면 안될 것이다.
ASP에서 제공하는 FileSystemObject로 서버상에
파일에 존재여부를 간단하게 알 수 있도록 만들어 봤다.

1
2
3
4
5
6
7
8
9
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
 
If fs.FileExists("d:\서버상의_파일주소"& "파일이름"Then
     response.write "파일 있음"
Else
     response.end "파일 없음"
End If
%>

cs




마무리

파일 업로드 개발시 도움이 되는 예제입니다.

댓글을 달아 주세요



 https -> http 변경하기

안녕하세요 고코더 입니다. 
오늘은 접속 프로토콜 형식을 바꾸는 방법을 알아보겠습니다.

SSL을 설치 했지만
특정 부분에서는 S를 뺀 http로 접속해야 할 경우가 있습니다.

ASP 상에서 그럴 경우에 이를 강제로 
https -> http 로 바꿔줄수 있도록 함수를 만들어 보았습니다.
1
2
3
4
5
6
<%
     If Request.ServerVariables("HTTPS"= "on" then     '//HTTPS 라면 
          response.redirect  "http://홈페이지.co.kr"&Request.ServerVariables("URL")&"?"&Request.QueryString     '// 리다이렉트
     End If
%>
 

cs





마무리

https://map.daum.net/ 다음 지도는 SSL로 접근이 불가능 합니다.
이처럼 특정 서브 도메인에서 SSL이 필요없을때 저렇게 다시 리다이렉트 해주시면 될거 같습니다.


댓글을 달아 주세요



노드 란?


안녕하세요 고코더 입니다.

Node.js는 자바스크립트로 이루어진 서버 사이드 언어입니다.. 
즉 자바스크립트가 서버단 기술까지 제어할 수 있는 세상이 다가왔습니다. (이미 왔죠)
구글이 만든 자바스크립트 엔진 V8 기반인 노드는 이다.  
우리가 이 언어를 해야 하는 이유중 가장 큰 이유가 될 것입니다. 
          
2 개발자


- 라이언 달(Ryan dahl) 
- Joyent라는 회사에 개발자 입니다.
- 2009년도 node.js를 개발하였고 2011년 NPM 패키지까지 개발하면서 그에 언어가 널리 알려졌습니다.


Node.js의 특징


1. Event - driven

- 방식으로 데이터를 전송했을때만 동작하는 방식입니다.
- 자원을 최소화 합니다.
- 기존의 방식은 이벤트를 기다리며 자원을 소비하는 방식입니다.
          
2. non - blocking

- 비동기 방식입니다. 어떤 결과를 기다리고 진행하지 않고 던져놓고 실행 합니다.
- 비동기식은 I/O 작업이 많을 경우 빠른 속도를 보인다.
     

3. 고코더가 생각하는 특징

노드는 직관적이고 개발자를 배려했다는 생각이 듭니다.
자바스크립트 기반은 더욱 더 개발하기 용이합니다.

아직 한국 웹에서는 레퍼런스 찾기가 어려워 초기 개발이 어려울 수 있습니다
하지만 Node.js를 개발 하면서 참 재밌고 눈에 잘 익는 구조를 가지고 있다는걸 느꼈습니다.
빠르게 게시판을 만들수 있는 언어였습니다. 그만큼 쉽고 다가가기 편한 언어입니다.
개인적으로 미래에 모든 IT생태계는 구글에 힘으로 모두 정리될꺼라고 

믿기 때문에 Node.js를 익혀둔다면 개발자로써 큰 대비가 될것입니다.


마무리


심플하면서 강력한 기능을 가진 노드를 통한 게시판 강의를 연재하려고 하니 많은 기대 바랍니다.



아메리카노 한잔으로 배우는 Node.js Express 기본편


해당 내용은 제가 집필한 책에 일부를 발취한 내용입니다.
도움이 되셨으면 후원에 마음으로 제 책을 전국 온라인 서점에서 구매해보세요.




댓글을 달아 주세요



1. 이번 시간에는

     - 게시판이 생겼으니 "글쓰기"와 같은 버튼이 필요하겠죠?
     - 그리고 좌우로 가득찬 게시판도 좋지만 보통은 좌우에 적당한 폭이 있어
     - 한눈에 보기 편한 모양으로 만들어 볼것입니다.
     - 역시나 이번에도 부트스트랩 매력에 푹 빠져봅시다.!



2. 버튼을 다뤄보자


     2.1 버튼을 만들어 보자
          ▼ 아래처럼 코딩해보겠습니다.
<!--부트스트랩 버튼 class="btn"-->
<button type="button" id="goButton"  class="btn">버튼</button>
<!--기본버튼-->
<button type="button">버튼</button>

          ▼ 화면에 띄워보니 기본 버튼, 부트스트랩 버튼이 보입니다. 딱 봐도 부트스트랩 버튼은 디자인 들어갈 준비가 되어 있네요.이제 디자인을 입혀 봅시다.

          ▼ 아래 코드를 입력하고 웹으로 봐볼까요?
<!--버튼의 디자인-->
<button type="button" class="btn">Basic</button>
<button type="button" class="btn btn-default">Default</button>
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-success">Success</button>
<button type="button" class="btn btn-info">Info</button>
<button type="button" class="btn btn-warning">Warning</button>
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-link">Link</button>

<!--버튼의 크기-->
<button type="button" class="btn btn-default btn-lg">Large</button>
<button type="button" class="btn btn-default btn-md">Medium</button>
<button type="button" class="btn btn-default btn-sm">Small</button>
<button type="button" class="btn btn-default btn-xs">XSmall</button>

          ▼ 디자인을 보는 직관적인 부분이라 설명이 필요 없겠네요. 간단한 클래스명으로 다양한 디자인을 손쉽게 쓸수 있습니다.
          ▼ 크기도 조절 가능합니다. 

     2.2 게시판의 글쓰기 버튼을 만들어 보자
          - 이번엔 우리 게시판에 쓸 글쓰기 버튼을 만들어보겠습니다.
          ▼ 아래의 코딩을 
pull-right : 버튼이 위치함으로 인해 디자인하 한단계 내려가는 걸 방지하고 오른쪽 정렬 
pull-left :                 ''                                      왼쪽 정렬
         
          ▼ 코딩의 합은 아래와 같습니다. 저번 시간에 만든 페이징 디자인 위에 위치시키겠습니다.
          ▼ btn으로 버튼으로 지정해주고, btn-primary로 디자인을 설정하고, pull-right로 정렬 하였습니다.
<button class="btn btn-primary pull-right">글쓰기</button>
<div class="text-center">
    <ul class="pagination pagination-lg"<!--부트스트랩에서 제공하는 페이징 마법사(?)-->
        <li><href="#">1</a></li>
        <li><href="#">2</a></li>
        <li><href="#">3</a></li>
    </ul>
</div>
     
          ▼ 그림처럼 이쁜 글쓰기 버튼이 안정적인 위치 하네요.!!
          ▼ 이로써 우리 게시판에 글쓰기 버튼까지 완료하였습니다.




3. container로 폭을 조정하자

     - 지금까지 잘 따라 온 분들은 디자인이 좌우로 100% 웹에 찰싹 달라붙어 있는걸 볼수 있을것입니다. 저는 이 디자인을 아주 좋아합니다.
     - 그런데 보통 좌우에 적당한 공백을 만들어 게시판이 좀더 안정적으로 보이게 하는거 대다수죠. 그걸 해결해주는 놈이 바로
     - container 이놈입니다. 

     ▼ div 해당 속성을 입력하면 디자인에 폭을 조정할 수 있습니다.
container, container-fluidr : 폭에 공백을 준다. 둘의 공백 크기는 다르다.

     ▼ 해당 요소로 우리가 만든 게시판을 감싸 주세요
<div class="container">[게시판]</div<!--container-fluid-->

     ▼ container의 폭의 공백

     ▼ container-fluid의

     ▼ 속성을 주지 않았을 때의 폭의 공백 


3. 마무리


     - 간단한 방법으로 우리의 게시판에 양쪽 폭의 느낌을 정해줄수 있었습니다.
     - 저는 개인적으로는 속성을 주지 않는 좌우로 100프로 가득찬 디자인을 좋아합니다.
     - 이젠 정말 게시판 같은 게시판이 완성 되었습니다.
     - 아직까진 어렵고 복잡한 내용이 없습니다. 다음 강의는 이미지에 대해 나가겠습니다.
     - 이미지 이후에는 살짝 어려워 질 수 있으니 개인적으로 더 연습하고 준비하시길!


     ▼ 지금까지 소스 입니다.

index.html


댓글을 달아 주세요



1. 깔끔한 게시판 모양을 한방에! 부트스트랩 매력 느껴보자!

     - 홈페이지를 꾸미려다가 CSS와 HTML을 작성하다. 포기해버린 경험들이 있으실 겁니다. (저부터..)
     - 기본 뼈대는 나와도 디자인 입힐려면 디자이너 퍼블리셔가 아닌 이상 고역일거고 정작 프로그램 공부가 뒷전 입니다.
     - 이전 강의에서도 말했듯이 부트스트랩은 아주 훌륭한 디자이너와 퍼블리셔가 제공한 CSS입니다. 
     - 이번 강의에서 부트스트랩 매력에 푹 빠져 보시죠!!!


2. 테이블을 만들어 보자!


     2.1 Table 이란
          - 실무에서 혹은 좋은 강의를 제공하는 곳에서 선행 되신분들은 <Table> 보단 <UL> <LI> 태그가 많이 활용되는걸 알고 있을 겁니다.
          - 데이터를 FM으로 나타내는 요소는 <Table>이므로 두번째 시간이니 부트 스트랩으로 이쁜 <Table>을 만들어 보는 시간을 가지겠습니다.

     2.2 준비사항
          - http://gocoder.tistory.com/8 이전 강의가 선행 되어야 합니다.

     2.3 테이블을 만들어 봅시다!!
          - 저번 강의에 함께 만들었던 index.html Body 태그안에 짜봅니다. 중학교 HTML 실습 시간이 기억나네요 
          - 아래와 같이 테이블 기초적인 태그가 나왔습니다. 혹시 이게 이해가 안된다면 검색엔진에! HTML 강의를 찾아서 보고 오세요!!
          - 그래도 겁먹지 마세요 몰라도 그냥 하다보면 아시니 이 강의를 지켜보셔도 문제가 없을 겁니다.

          ▼ 웹페이에 실행시켜 보시면  웹스톱에선 alt+f2 를 누르시면 되고 홈에디터 플러스에서는 Ctrl+B를 누르시면 됩니다.
<Table>
    <thead>
    <tr>
        <Td>이름</Td>
        <Td>나이</Td>
        <Td>주소</Td>
    </tr>
    </thead>
    <tbody>
    <tr>
        <Td>지브이</Td>
        <Td>26</Td>
        <Td>상수동</Td>
    </tr>
    <tr>
        <Td>하이리</Td>
        <Td>26</Td>
        <Td>태릉입구</Td>
    </tr>
    <tr>
        <Td>래부기</Td>
        <Td>26</Td>
        <Td>망원동</Td>
    </tr>
    </tbody>
</Table>

          ▼ 디자인이 없는 순수 <table>이 나타났네요. 
  이게 Class 속성 한방으로 얼마나 변하는지해봅시다.

          ▼ 변한건 없습니다. class="table" 이 테이블 속성에 추가 되었습니다.
<Table class="table">   <!--table 속성을 지정해보자-->
    <thead>
    <tr>
        <Td>이름</Td>
        <Td>나이</Td>
        <Td>주소</Td>
    </tr>
    </thead>
    <tbody>
    <tr>
        <Td>지브이</Td>
        <Td>26</Td>
        <Td>상수동</Td>
    </tr>
    <tr>
        <Td>하이리</Td>
        <Td>26</Td>
        <Td>태릉입구</Td>
    </tr>
    <tr>
        <Td>래부기</Td>
        <Td>26</Td>
        <Td>망원동</Td>
    </tr>
    </tbody>
</Table>

          ▼ class 지정 한방에 완벽한 반응형 디자인이 되었습니다. 왼쪽은 일반적인 1920 사이즈고 오른쪽은 모바일 해상도로 줄여봤습니다. 
          ▼ 놀라울 정도로 깔끔하네요 여기서 끝이 아닙니다. 이외에도 많은 디자인 요소를 제공합니다.

     ▼ 아래와 같이 입력하고 다시 웹에서 실행해봅시다.
<table class="table table-striped table-bordered table-hover">
<!--table 속성을 지정해보자-->

     ▼ 벌써 이쁜 게시판이 보이기 시작합니다.  속성에 대한 설명입니다.
table-striped : 얼룩말처럼 라인에 홀수 짝수를 다르게 보여주게 합니다.
table-bordered : 이름에도 보이듯이 라인을 칠해줍니다. 세로선이 생겨있네요
table-hover : 마우스를 올리면 하일라이트 됩니다. 지브이라는 이름 위가 조금 더 진하죠? 마우스가 올라간 상태입니다.

     ▼ 홈페이지 만들겠다고 Css 건들이다 집어 치울일이 없겠네요 ㅎㅎ

     ▼ 이번엔 <Tr>과 <Td>에 아래처럼 입력해봅시다.

text-warning, text-success, text-info : 텍스트 색깔을 이름에 맞게 바꿉니다. 자연스럽고 이쁘네요
text-center, text-left, text-right : 텍스트를 정렬합니다. 
bg-danger, bg-info : 바탕화면 색깔을 바꿉니다. 

     ▼ 말도 안되는 모양으로 나오겠지만 연습하는것이므로 해당처럼 코딩 합니다.
<tr class="text-success bg-danger">
    <Td >하이리</Td>
    <Td class="text-warning">26</Td>
    <Td class="text-info">태릉입구</Td>
</tr>
<tr class="text-left bg-info">
    <Td>래부기</Td>
    <Td class="text-center">26</Td>
    <Td class="text-right">망원동</Td>
</tr>

     ▼ 해당 모양처럼 나옵니다. 간단하고 직관적인 CSS 명명으로 여러가지 모양으로 바뀌었습니다. 다양하게 사용하면 됩니다. 


     2.4 페이징을 만들어 봅시다.

          - 잘따라왔습니다. 이번엔 게시판에 꽃 페이징을 만들어 봅시다. 
          - 부트스트랩은 페이징 디자인도 가볍게 만들수 있습니다.

          ▼ 테이블 아래 해당 클래스를 추가해주세요 
pagination : 페이징 디자인을 쉽게 할수 있는 클래스명
pagination-lg , pagination-sm : 페이징 디자인 속성중 하나 크게, 작게 
<div class="text-center">
    <ul class="pagination pagination-lg"<!--부트스트랩에서 제공하는 페이징 마법사(?)-->
        <li><href="#">1</a></li>
        <li><href="#">2</a></li>
        <li><href="#">3</a></li>
    </ul>
</div>

          ▼ 뚝딱 페이징 까지 있는 게시판 디자인이 다 만들어졌습니다. 완벽합니다!!!




3. 마무리

     - 가볍게 게시판 디자인을 만들어봤습니다. 
     - 간단한 class 명만 대입하고 명명규칙만 이해하면 아주 가볍고 직관적으로 반응형 웹을 만들어 낼 수 있습니다. !
     - 2과를 하면서 자신감이 붙었을꺼라 믿습니다. 다음 시간에는 이 디자인에 버튼을 추가해보겠습니다. 


댓글을 달아 주세요



1. 부트스트랩이란

     1.1 제작사 http://getbootstrap.com/ (한글 번역 개인사이트 http://bootstrapk.com/)
          - 부트 스트랩은 트위터에서 개발한 UI 라이브러리 입니다.
          - 마크 오토(Mark Otto)와 제이콥 손튼(Jacob Thornton)이 개발하였습니다. (둘이 안사귐 게이아님)            




     1.2 목적
          - 모바일 환경에 적합한 반응형 웹을 개발하기 위한 라이브러리
          - 디자인으로 인한 개발시간을 단축하기 위한 개발도구   


2. 부트스트랩 설치

     2.1 설치설명
- 부트스트랩 설치는 압축을 풀기만 하면 됩니다. 
- 프로젝트 할때 디자인과 퍼블리셔가 css,js 폴더를 만들어주고 나서 개발을 시작할텐데 바로 그 CSS 폴더를 제공해주는 것 입니다.
- 웹스톰 같은 IDE를 프로젝트시 자동으로 다운로드 하여 환경을 제공해주고 있지만, 일부 에디터툴은 홈페이지에서 다운로드 하여 압축을 풀어 배치 하면 완료 됩니다.
          - 설치 과정을 살펴보겠습니다.

     2.2 설치방법 / webstrom
          - 웹스톰은 훌륭한 개발 도구입니다. jetbrain IDE중 하나입니다. 이 툴의 사용법은 나중에 올려보겠습니다.
          - 이 IDE는 부트스트랩을 자동으로 설정해줍니다. 
          - 방법은 너무 간단해 글로만 남기려다. 처음 접하는 코더분들도 있으니 그림도 남겨봅니다.

          ▼ 프로젝트를 create 합니다. 해당 화면이 바로 안나오면 file->new project 클릭

           그리고 중간에 있는 Twitter Bootstrap을 클릭합니다. 로케이션에 폴더를 지정하고 버전은 새로고침 버튼을 누르면 최신버전까지 릴리즈 되어 있습니다.         
           최신 버전을 선택하고 오른쪽 아래에 Create 

 
          ▼ 아래화면 처럼 완성 되어 있습니다. 네 이게 다입니다. 앞서 말했다 시피 그냥 css , js 폴더를 제공 받은것입니다. 
           웹스톰으로 설치가 완료하였습니다.



     2.3 설치방법 / Home Edit Plus      
          - 이번엔 전 국민에 사랑을 받는 홈에디터플러스 사용자를 위한 설치 방법입니다.
          - 파일 복사가 전부이고 홈에디터플러스 설치라고 하기엔 어색하지만 아직 개념이 잡히지 않은 코더들을 위해 설명하겠습니다.

           http://bootstrapk.com/getting-started/에 접속해 Download Bootstrap 을 클릭합니다.

           맨위에 있는 Download Bootstrp을 클릭하여 zip 파일을 다운로드 합니다.
           Less로 구성된 source code는 시간이 나면 다시 리뷰하겠습니다.


           그리고 압축파일을 풀어 그대로 사용할 폴더에 이동시킵니다. 
           압축 푸는법은 아시죠??? 개발자라면 7z 도 가능한 반디집을 추천 합니다.


           에디터 플러스에 해당 폴더를 이동하면 역시 Css, JS폴더가 보입니다. 설치(?)가 완료되었습니다.
           웹스톰으로 설치시 보이지 않던 fonts 폴더가 있네요. 해당 부분은 차차 알아가보도록 합니다.


     

3. 부트스트랩 실행


     ▼ index.html 파일을 루트(/) 경로에 만듭니다. (이제부턴 jetbrain으로)
     ▼ OK 버튼을 눌러 생성하고


▼ 그리고 해당 파일에 아래 코드를 입력합니다.
▼ 부트스트랩을 쓰기 위한 아주 기초적인 형태입니다. 
▼ 맨 아래쪽에 보시면 jquery.min.js 를 다운로드 하여 참조하였습니다. 구글 API서버도 훌륭하겠지만 다운로드 받아 참조하는게 이롭겠습니다.
▼ 그리고 자신만에 was로 실행해봅니다. (가장 쉬운건 IIS 서비스로 실행시키는거지요. 이부분도 어려운 코더라며 추후에 블로그를 남기겠습니다. )
▼ 하지만 IDE가 제공하는 환경을 사용해도 무방 합니다 웹스톰 alt+f2 에디터플러스는 ctrl+b 입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 위 3개의 메타 태그는 *반드시* head 태그의 처음에 와야합니다; 어떤 다른 콘텐츠들은 반드시 이 태그들 *다음에* 와야 합니다 -->
    <title>부트스트랩 101 템플릿</title>

    <!-- 부트스트랩 -->
    <link href="css/bootstrap.css" rel="stylesheet">

    <!-- IE8 에서 HTML5 요소와 미디어 쿼리를 위한 HTML5 shim 와 Respond.js -->
    <!-- WARNING: Respond.js 는 당신이 file:// 을 통해 페이지를 볼 때는 동작하지 않습니다. -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<h1>Hello, Bootstrap!</h1>

<!-- jQuery (부트스트랩의 자바스크립트 플러그인을 위해 필요합니다) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<!--<script src="js/jquery.min.js"></script> 위 js를 다운받아 폴더에 참조하였습니다. 이렇게 하는게 더 좋겠죠? -->
<!-- 모든 컴파일된 플러그인을 포함합니다 (아래), 원하지 않는다면 필요한 각각의 파일을 포함하세요 -->
<script src="js/bootstrap.min.js"></script>
</body>
</html>


     - 드디어 Hello Bootstrap를 찍었군요. 
     - Hello를 보면 또 새로운 공부의 시작이라 생각이 듭니다.!! 


5. 마무리

     - 쉬운 부트스트랩 설치 과정이었습니다. 
     - 다음강좌부턴 본격적인 부트스트랩 강의에 들어가겠습니다.



댓글을 달아 주세요



1. PHP드라이브 


PHP 개발자을 위해 아랑고DB를 컨트롤 할 수 있는 예제를 만들어 보았다. 
그대로 복사 붙혀넣어서 분석하면 가장 빠르겠지만 손으로 직접 쳐보면서 해보자

- arangoDB PHP 드라이브 파일
- 대용량 데이터를 위해 10가지 문자열들 (단순히 include "txt.php" 를 위함)
- 설치방법 :  (/)루트에 arangoDB.7z 해당 파일을 풀고 requeire로 autoload.php를 인트루드 하면 준비 PHP에서 아랑고 디비 쓰기 준비 끝!! 
// - 아랑고 드라이버를 로드한다. //https://www.arangodb.com/arangodb-drivers // 아랑고 디비 드라이브
require_once __DIR__ . '/arangoDB/autoload.php';



2. ArangoDB -> PHP 레퍼런스 

<?php
ini_set('max_execution_time', 3000); //300 seconds = 5 minutes

/*** 0.연결 ***/

// -
아랑고 드라이버를 로드한다. //https://www.arangodb.com/arangodb-drivers // 아랑고 디비 드라이브
require_once __DIR__ . '/arangoDB/autoload.php';

// - 아랑고 함수를 as 합니다. 이름 그대로 쓰면 내장함수랑 구분 가독성이 떨어져 as
use ArangoDBClient\Collection as ArangoCollection;                      // 컬렉션(테이블)
use ArangoDBClient\CollectionHandler as ArangoCollectionHandler;        // 컬렉션 핸들
use ArangoDBClient\Connection as ArangoConnection;                      // 컨넥션
use ArangoDBClient\ConnectionOptions as ArangoConnectionOptions;        // 컨넥션 옵션
use ArangoDBClient\DocumentHandler as ArangoDocumentHandler;            // 도큐먼트(컬럼) 핸들
use ArangoDBClient\Document as ArangoDocument;                          // 데이터 핸들
use ArangoDBClient\Exception as ArangoException;                        // 예외사항 처리
use ArangoDBClient\Export as ArangoExport;                              // 데이터 exort
use ArangoDBClient\ConnectException as ArangoConnectException;          // db연결 예외처리
use ArangoDBClient\ClientException as ArangoClientException;            // 클라이언트 예외처리
use ArangoDBClient\ServerException as ArangoServerException;            // 서버 예외처리
use ArangoDBClient\Statement as ArangoStatement;                        // 컨넥션 메소드 객체생성
use ArangoDBClient\UpdatePolicy as ArangoUpdatePolicy;                  // 업데이트 정책 (,?)

// -
기본 연결 옵션입니다.
$connectionOptions = [
   
ArangoConnectionOptions::OPTION_DATABASE => 'sampledb',             // 데이터 베이스명
   
ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', // 아랑고 IP와 포트
   
ArangoConnectionOptions::OPTION_AUTH_TYPE => 'Basic',               // 아랑고 연결 타입 Basic이 일반적인 연결
   
ArangoConnectionOptions::OPTION_AUTH_USER => 'admin@test',          // 유저 로그인 ID 풀네임이 필요하다
   
ArangoConnectionOptions::OPTION_AUTH_PASSWD => 'test',              // 유저 패스워드
   
ArangoConnectionOptions::OPTION_CONNECTION => 'Keep-Alive',         // 연결을 계속 유지할것인지. != close
   
ArangoConnectionOptions::OPTION_TIMEOUT => 3,                       // 연결 시도 초
   
ArangoConnectionOptions::OPTION_RECONNECT => true,                  // 연결이 시간 초과되었을 때 재연결할지 여부, true ->끝임없이 재접속 시도함
   
ArangoConnectionOptions::OPTION_CREATE => true,                     // 데이터 입력시 새로운 컬렉션(테이블)에 입력한다면
   
ArangoConnectionOptions::OPTION_UPDATE_POLICY => ArangoUpdatePolicy::LAST,
];

//  - 로깅 기능을 킨다. LOG기록이 남겨진다.
ArangoException::enableLogging();

//  - 테스트를 위한 변수
$collectionName = array("argdb", "argdb_addr");                         // 컬렉션 이름을 지정한 변수, 두개 테이블 선언
$dataCnt = 1000;

//  - DB를 연결한다.
$connection = new ArangoConnection($connectionOptions);                 // ArangoConnection을 이용해 설정한 연결을 변수에 담는다.
$collectionHandler = new ArangoCollectionHandler($connection);          // 컨넥션 핸들을 만들어 낸다.


/*** 1.
컬렉션(테이블) 생성 예제 PHP 버전(create,drop) ***/

// -
컬렉션 존재 여부 체크, 삭제
foreach ($collectionName as $value) {                                   // 컬렉션명 배열있는 만큼
   
if ($collectionHandler->has($value)) {                              // 해당 컬렉션 존재 하는지 체크
       
$collectionHandler->drop($value);                               // 컬렉션 삭제
       
//$collectionHandler->getCollectionId($collection);             // 컬렉션 아이디를 가져온다
       
//$collectionHandler->rename($collection, $name);               // 컬렉션 명을 바꾼다.
   
}
}

// - 컬렉션 생성 예제
for($x = 0; $x < count($collectionName); $x++) {                        // 컬렉션 생성 배열
   
$userCollection = new ArangoCollection();                           // 컬렉션 사용준비

   
$userCollection->setName($collectionName[$x]);                      // 생성할 컬렉션 이름을 지정
   
$id = $collectionHandler->create($collectionName[$x]);              // 컬렉션을 생성한다. ID가 반환됨

    // - 컬렉션 인덱스를 생성
    $collectionHandler->createHashIndex($id,array("name"),null,null);   // Hash 인덱스 생성, 컬렉션 ID를 이용해야 한다.
    $collectionHandler->createFulltextIndex($id,array("content"),null); // FulltextIndex 생성
   
//createSkipListIndex, createPersistentIndex 도 같은 방법으로 생성 가능하다.
}


/*** 2. insert documnet(데이터)  PHP 버전 ***/

include "txt.php";
for ($i = 1; $i <= $dataCnt; $i++) {

   
try {

       
$handler = new ArangoDocumentHandler($connection);

       
// - 아랑고 도큐먼트를 가져온다.
       
$user = new ArangoDocument();

       
// - ( , )으로 데이터를 만든다.
       
$user->set('name', 'gv_'.$i);
       
$user->set('age', 26+$i);
       
$user->set('weight', null);
       
$user->set('content',${"str_"."0".substr($i,-1)} );

       
// - 배열데이터를 만든다.
       
$user->favorites = ['drawing', 'cycle', 'one piece'];

       
// - 서버로 데이터를 전송한다.
       
$id = $handler->save($collectionName[0], $user);                //고유 seq값인 _key를 반환한다.

        // -
데이터 입력 됐는지 확인
       
$result = $handler->has($collectionName[0], $id);
       
//var_dump($user->getId());

   
} catch (ArangoConnectException $e) {
       
print 'Connection error: ' . $e->getMessage() . PHP_EOL;
   
} catch (ArangoClientException $e) {
       
print 'Client error: ' . $e->getMessage() . PHP_EOL;
   
} catch (ArangoServerException $e) {
       
print 'Server error: ' . $e->getServerCode() . ':' . $e->getServerMessage() . ' ' . $e->getMessage() . PHP_EOL;
   
}
}


/*** 3. SELECT documnet(데이터)를 선택한다. PHP버전 ***/
$document = $handler->get($collectionName[0], $id);                     // 컬렉션,고유키(_key) document(데이터)를 얻는다. dcument update,delete 가능


/*** 4. UPDATE documnet(데이터)를 수정한다. PHP버전 ***/

$document->set("name", "hire");                                         // 먼저 수정하고 싶은 데이터를 READ 한후에 set으로 바꿔주고 그대로 다시 업데이트(입력) 한다.
$handler->update($document);                                            // document 그대로 실행


/*** 5. DELETE documnet(데이터)를 삭제한다. PHP버전 ***/
$documentDelete = $handler->remove($document);                          // 업데이트와 마찬가지로 Read document로 삭제 한다.


/*** 6. insert
예제 AQL버전 ***/
//$query = '   INSERT { name: "raebu", age:13, width:null, favorites:[\'sing\', \'rap\', \'fight\'] } INTO ' . $collectionName; //
한줄 넣기
$query = '   FOR i IN 1..'.$dataCnt;                          /* 반복문 루프될 숫자만 정해주면 된다.*/
$query = $query.'   INSERT {';
$query = $query.'   name: CONCAT("gv_", i),';                 /* CONCAT 문자열 연결 */
$query = $query.'   addr : (i % 2 == 0 ? "강북" : "강남")';    /* 삼항연산 가능 */
$query = $query.'     }';
$query = $query.'       INTO '.$collectionName[1];

$statement = new ArangoStatement(                             /* 컨넥션 메서드를 설정하고  */
   
$connection,
   
array(
       
"query" => $query
   
)
)
;

$statement->execute();                                        /* excute 한다.  */


/*** 7. select , inner join AQL
버전 ***/
$query = '      FOR cur1 IN '.$collectionName[0];
$query = $query.'  FOR cur2 IN '.$collectionName[1];          // join할 테이블
$query = $query.'   FILTER cur1.name == cur2.name       ';    // 여기서 On 을 하면 된다.
$query = $query.'   SORT cur1.age desc                  ';
$query = $query.'       RETURN {                        ';
$query = $query.'           name:cur1.name              ';
$query = $query.'           ,age:cur1.age               ';
$query = $query.'           ,age:cur1.age    ';
$query = $query.'           ,favorites:cur1.favorites   ';
$query = $query.'           ,addr:cur2.addr             ';    // 명명자로 구분해서 노출 TSQL이랑 상당히 흡사
$query = $query.'}';
//echo $query;

$statement = new ArangoStatement(
   
$connection,
   
array(
    
"query"     => $query
   
,"count"     => false
   
,"batchSize" => 1000                                     // 노출 데이터 사이즈 기본이 1000 엘리먼트
   
,"sanitize"  => true
   
,"_flat" => true                                         // 기초적인 데이터만 노출, true를 해야 바로 json_encode로 데이터를 만들수 있다.
   
)
)
;

$cursor = $statement->execute();


/*** 7-1.AQL 실행된걸 JSON으로 노출 ***/
$resultingDocuments = array();

foreach ($cursor as $key => $value) {
   
$resultingDocuments[$key] = $value;
}

//echo json_encode($resultingDocuments);                     // json으로 노출




?>


댓글을 달아 주세요



1. 아랑고 INDEX 종류 




1.1 GEO 인덱스
     - 지리적 위치를 담는 인덱스

1.2 Hash 인덱스
     - 변형된 값을 저장하는 인덱스 이므로 == 동등 비교 조건일때 유리
     - inner join 될 컬럼에 사용

1.3 Presistent 인덱스
     - ???

1.4 FUlltext 인덱스
     - LIKE 검색등에서 속도 향상을 위한 글씨 검색에 사용할 인덱스 
     - 정보,내용등에 like 될 활용될 컬럼에 이용

1.5 Skip-List
     - 정렬을 유지하면서 데이터를 삽입, 삭제, 탐색 할수 있는 데이터 구조 





2. INDEX / GUI를 통한 생성방법


     2.1 메뉴 
          - 컬렉션에서 Indexes라는 메뉴를 클릭한다.
          - shell 에서 커맨드로 가능하지만 AQL상에서는  index 생성이 안되는듯 하다.



     
     2.2 생성 방법
          - Type은 1번에 기록
          - Field에 인덱스를 선언할 컬럼 이름을 쓴다.
          - Unique 고유에 값을 가진 컬럼인지
          - Sparse Index null값이 위주에 데이터인지  하나 이상의 필드에 Null 값을 가진 데이터가 대부분이고 드물게 어떤 데이터를 값을 가지고 있는 경우에 생성하는데 효율적 검색 대상 필드의 값이 전체 컬렉션에서 차지하는 밀도가 낮은 경우에 생성하면 유리한 인덱스 타입







2. INDEX / PHP를 통한 생성방법


 - Collection()를 통하여 다양한 인덱스를 만들어 낼수 있다. 컬렉션을 생성후에 인덱스를 생성할수 있으며
 -  아직 만들어지지 않는 컬럼을 미리 인덱스를 선언할수 있다. (3만개 이상의 데이터를 가진 상태에서 index를 생성하면 다운되고 있음...)
 -  PHP를 통한 아랑고디비 사용법은 다음 강의에 설명하겠습니다. DB상에서 말고 언어상에서 바로 인덱스를 설정할 수 있구나라고만 눈으로 보시면 됩니다.
$collectionHandler = new ArangoCollectionHandler($connection) // 컨넥션 핸들을 만들어 낸다.
$collectionHandler->createHashIndex($id,array("name"),null,null);           //Hash 인덱스 생성, 컬렉션 생성후에 반환된 ID를 이용해야 한다.
$collectionHandler->createFulltextIndex($id,array("content"),null);         //FulltextIndex 생성
    //createSkipListIndex, createPersistentIndex 도 같은 방법으로 생성 가능하다.
}



3. INDEX 테스트


     3.1 INNER JOIN 테스트  
          - 인덱스를 걸기 전 230.613ms
          - 인덱스 이후 13.035ms 
          - 약 20배 가량의 차이가 난다.




댓글을 달아 주세요



1. UPDATE 


1.1 Data update 
     -▼ 데이터 업데이트 방법입니다.
     - update는 _key(고유키)로만 조건을 걸 수 있습니다.
UPDATE { _key: "80118" } /* where 절 _key만 가능 */
  WITH { age: 31 }       /* 업데이트 컬럼절 */
IN col                 


1.2 Collections(Column) update 
     ▼ 컬렉션(컬럼) 업데이트 방법입니다.
     - 새로운 컬럼을 추가하고 그에 해당하는 값을 넣을 수 있습니다.
    
FOR cur IN col
  UPDATE cur                                   /* col 이라 테이블에 UPDATE를 준비한다. */
    WITH {
        height : 165       /* height 라는 컬럼을 추가하고 값을 입력 */
        /*,width : null*/  /* 빈값을 넣을수는 없고 null 을 넣을수 있다. Json 방식이기에 값이 없어도 키는 존재한다. */
    } IN col
 

1.3 Column 추가 하면서 update
     ▼ TSQL 처럼 value 부분에 인라인 쿼리로 계산식을 만들어 넣을 수 있습니다.     
FOR cur IN agecol                 /* agecol이란 나이대가 몇명있을지 저장하는 테이블을 완성, 1~30까지 나이 값만있음   */
   
 UPDATE cur                    /* agecol 테이블 대상으로*/
         
 WITH {                  /* 컬럼을 add 한다. */
           
 agecnt : TO_NUMBER(                 /*TO_NUMBER를 이용하면 카운트된 숫자 그대로 입력, 하지만 변환없이 넣으면 배열 형태로 들어간다 []*/
            
 FOR cur2 IN col                     /* 계산을 위한 AQL 시작 */
               
 FILTER cur2.age == cur.age       /* ALAISE 된 커서로 비교연산자 가능 */
                   
 COLLECT WITH COUNT INTO cnt  /* COLLECT는 계산열을 선언할때  */
                   
 RETURN cnt                   /* 계산된 열은 RETURN 으로 ALAISE를 선언해줘야 한다.*/
           
 )
        } IN agecol                              /* 입력대상 테이블*/




2. DELETE(REMOVE)




댓글을 달아 주세요