The Pursuit of Happyness

MSSQL 을 사용할 일이 생겨서 간단한 설치 과정을 적어 봅니다.


MSSQL을 테스트할 때는 개발자용으로 설치를 하거나 express 버전 (10GB 제한) 으로 설치해서 사용할 수 있습니다.


Express 버전은 아래의 링크에서 런처 파일을 다운로드 할 수 있습니다. 


https://www.microsoft.com/ko-kr/sql-server/sql-server-editions-express


테스트 환경 : Windows 10 Pro (1709) / MSSQL EXPRESS 2017 


런처 파일을 다운로드 후 실행을 하면, 다시 실제 설치 파일을 다운로드하고 MSSQL 서버를 설치할 수 있습니다.


MSSQL은 서버 로그인 방식은, 윈도우 기반의 네트워크에서 사용하는 인증방식으로 로그인을 하는 Windows 인증 방식과 ID / Password 를 입력해서 로그인하는 SQL 서버 인증방식이 있습니다. 필요에 따라 Windows 인증 혹은 SQL 서버 및 Windows 인증을 선택해서 사용할 수 있습니다.


서버 설치 후에는 클라이언트에 해당하는 MSSQL Server Management Studio 를 추가로 설치합니다.


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


MSSQL 서버는 기본 설치시 네트워크 연결이 허용되지 않습니다. 따라서 새 사용자를 추가하기 위해서는 다음의 과정으로 네트워크 연결을 허용해 줍니다.


  1. SQL 서버 구성 관리자 실행 (SQL Server Configuration Manager)
  2. (좌측메뉴) SQL Server 네트워크 구성 > SQLEXPRESS에 대한 프로토콜 
  3. (우측메뉴) TCP/IP 를 사용으로 변경
  4. (좌측메뉴) SQL Server 서비스 선택 
  5. (우측메뉴) SQL Server (SQLEXPRESS) 선택
  6. 다시시작


참고로 TCP/IP 항목에서 바인딩된 IP 주소나 포트를 체크할 수 있습니다. 

(Windows 10 에서 MSSQL EXPRESS 버전을 설치한 경우 기본 1433 포트가 아닌 임의의 포트로 설정이 됩니다. 시스템 권한의 문제인지 EXPRESS 라서 그런건지는 잘 모르겠습니다. 추후에 알게되면 업데이트 하도록 하겠습니다.)


그리고 나서 인증 모드를 체크합니다.

  1. MSSQL Server Management Studio 실행
  2. 설치시 입력한 인증 방식을 이용해서 로그인
  3. 연결된 서버의 개체 탐색기에서 서버를 마우스 오른쪽 클릭해서 속성을 선택
  4. 페이지 선택에서 보안을 선택
  5. 오른쪽 영역에서 서버 인증 방식 확인 (SQL Server 및 Windows 인증 모드)
  6. 확인


사용할 데이터 베이스를 생성합니다.

  1. MSSQL Server Management Studio 에서 개체 탐색기 > 서버 > 데이터베이스 오른쪽 클릭
  2. 새 데이터베이스 선택 후 적당한 이름을 입력하고 확인


유저를 생성합니다.

  1. MSSQL Server Management Studio 에서 개체 탐색기 > 서버 > 보인 > 로그인 오른쪽 클릭
  2. 새 로그인 선택 후 
  3. 페이지 선택에서 일반 선택
  4. SQL 서버 인증
  5. 로그인 이름에 사용할 아이디 입력
  6. SQL 서버 인증 선택
  7. 암호 / 암호 확인 입력
  8. 기본 데이터베이스 설정
  9. 페이지 선택에서 사용자 매핑 선택
  10. 사용할 데이터 베이스 체크
  11. 데이터베이스 역할에서 필요한 권한을 할당
  12. 확인


생성된 유저는 MSSQL Server Management Studio 에서 로그인이 되는지 확인해 봅니다.

외부에서 접속하는 경우 방화벽 설정도 체크해 봅니다.



Summary 

설치 후 확인 사항
  1.  TCP/IP 연결 허용 여부 및 바인딩 된 IP 와 포트
  2. SQL 서버 로그인 인증 방식
  3. 데이터베이스 권한 등..
  4. 설정 변경 후 SQL 서버 재시작 필요
  5. 기타 방화벽 설정 등..





Comment +0

예전에 node.js에서 Oracle DB를 연결해서 사용하는 프로젝트를 해봤었는데, Oracle 이 node.js 를 제대로 지원하지 못한다는 느낌을 강하게 받았었습니다.


그때는 node.js oracledb 모듈을 설치할 때, 컴파일 과정이 들어가면서 의존성이 있었기 때문에 은근히 번거로웠었는데, oracledb 2.0 부터는 그러한 과정들이 필요 없게되어서 상당히 편리해졌습니다.


다만 새로운 모듈의 특성상 Oracle 혹은 instant client 을 설치하고, 라이브러리 경로를 설정해 줘야지만 제대로 동작합니다. node.js oracledb 와 Oracle 혹은 instant client 의 설치순서는 상관이 없습니다. 런타임 시점에 라이브러리 경로만 인식되면 됩니다.


또 다른 장점으로는 상당히 많은 수정을 통해서 메모리 관리 등에서 훨씬 안정적인 모듈이 되었다는 것입니다.


--


이쯤에서 node.js oracledb 모듈을 설치해 보겠습니다.


테스트 환경은 CentOS 7.4.1708 , node.js 6.12.3 입니다.


1. 적당한 폴더를 생성합니다.

# mkdir test 


2. 폴더에서 node 프로젝트를 생성합니다. 프로젝트 정보는 적당히 입력합니다.

# npm init 


3. 다음 명령어로 oracledb 모듈을 설치합니다.

# npm install --save oracledb 

현재 2.0.15 버전으로 설치가 됩니다.


4. instant client 를 설치합니다. Oracle 다운로드 페이지에서 적당히 다운로드 받습니다.

http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html

아래 명령어로 설치를 합니다.

# rpm -ivh  oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

혹은 yum install 명령어를 이용해도 설치가 됩니다.


5. 환경변수를 설정합니다.

# vi /etc/environment


다음의 두줄을 추가합니다 원래 instant client 만 설치할 경우 "/usr/lib/oracle/12.2/client64/network/admin" 경로는 존재하지 않는데, XE 등을 설치시의 tns 설정경로와 비슷하게 하기 위해서 "network/admin" 폴더를 생성해 주었습니다.

TNS_ADMIN=/usr/lib/oracle/12.2/client64/network/admin

LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib


6. tnsnames.ora 파일을 생성합니다.

# touch /usr/lib/oracle/12.2/client64/network/admin/tnsnames.ora 

생성한 파일을 편집해서 tns 정보를 입력합니다.


7. oracledb에 연결해서 테스트하는 예제들 입니다.

https://github.com/oracle/node-oracledb/tree/master/examples


webapp.js 나 webapppromises.js 파일을 참조하시면 pool 설정 등에 대한 예시를 볼 수 있습니다.



Comment +0

테스트 환경

Ubuntu 16.04.2 LTS


Oracle DB를 이용할 일이 생겨서 Ubuntu에 Oracle XE를 설치해 보았습니다.


설치하는데 아래 링크를 참조했습니다.

http://www.gokhanatil.com/2016/04/how-to-install-oracle-11gr2-xe-on-ubuntu.html


먼저 설치 패키지를 아래 링크에서 다운로드 합니다. 

(2017년 3월 30일 현재 2014년에 배포한 11gR2 가 최신버전 입니다.)

http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html


Oracle 홈페이지에서는 리눅스 용으로는 rpm을 zip으로 압축해서 배포하고 있습니다.


다운로드 완료 후에는 다음 명령으로 압축을 풀어 줍니다.


$ unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip


압축이 풀리면 Disk1 폴더가 생성되고 그 안에 rpm 파일이 있습니다.


rpm 파일을 Ubuntu 에서 쓰는 deb 파일로 변환을 해 주어야 합니다.


rpm을 deb로 변경할 때는 alien 을 사용하게 됩니다. 


만약 alien 이 설치되어 있지 않다면 다음 명령으로 설치합니다.


$ sudo apt install alien 


그리고 오라클 사용에 필요한 라이브러리를 설치합니다. (사용자의 환경에 따라 이미 설치되어 있을 수도 있습니다.)


$ sudo apt install libaio1


Disk1 폴더에서 아래 명령으로 rpm을 deb로 변경합니다. (시간이 상당히 걸리는 작업입니다.)


$ sudo alien --scripts oracle-xe_11.2.0-1.0.x86_64.rpm


deb 파일을 다음 명령으로 설치를 합니다.


$ sudo dpkg -i oracle-xe_11.2.0-2_amd64.deb


설치 도중에 /sbin/chkconfig 가 없다는 메시지가 나오게 되는데, redhat 계열에서 사용하는 설정인데 무시하셔도 상관 없습니다. 그래도 설정을 하고 싶다면, 아래 링크를 참조하세요.

http://meandmyubuntulinux.blogspot.com/2012/05/installing-oracle-11g-r2-express.html


그리고 설치 후에는 설정을 위해서 스크립트를 실행해야 합니다. 실행시에 발생할 에러를 막기 위해서 아래와 같이 링크를 설정하고 폴더를 생성합니다. (폴더가 이미 존재하는 경우도 있습니다.)


$ sudo ln -s /usr/bin/awk /bin/awk

$ sudo mkdir /var/lock/subsys


그리고 스크립트를 돌려서 초기 설정을 합니다.


$ sudo /etc/init.d/oracle-xe configure


초기 설정을 위해 몇가지 질문을 하는데, 성실히 대답해 주면 됩니다.


아래 명령으로 시작합니다.


$ sudo /etc/init.d/oracle-xe start


아래 명령으로 서버를 종료합니다.


$ sudo /etc/init.d/oracle-xe stop




Comment +0

MongoDB는 고성능, 고가용성 그리고 오토스케일링을 지원하는 오픈소스 Document DB 입니다.


MongoDB에서의 Document는 Object 형식의 데이터를 이야기하며 입출력은 json 포맷입니다.


실제 데이터는 BSON 형태로 저장되며, 각 Document Object 는 유니크한 ID를 가지게 됩니다.



--------



Mac에서의 설치는 homebrew를 이용해서 할 수 있습니다. homebrew 설치는 http://brew.sh/ 사이트를 참고하세요.


MongoDB 설치를 위해 터미널을 열고 다음과 같이 입력합니다.


$ brew install mongodb



/usr/local/Cellar/mongodb/[version] 에 설치가 됩니다.


설치된 버전 확인은 다음 명령어를 이용하면 됩니다.



$ mongo --version 



MongoDB 서버 실행은 다음의 명령어로 합니다. (MongoDB 서버가 실행이 되면 종료되기 전까지는 Mac을 재부팅해도 계속 돌아갑니다.)


 $ brew services start mongodb



데이터는 설정을 변경하지 않았다면 /usr/local/var/mongodb 에 저장됩니다.


종료는 다음과 같이 합니다.



$ brew services stop mongodb 



데이터 저장 위치를 변경하고자 하면 아래 파일에서 dbPath를 수정하면 됩니다.


/usr/local/etc/mongod.conf


Comment +0

PHP 모범 사례 3


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


- 데이터베이스

-- PDO 사용 (PHP data objects)

단일한 사용자 인터페이스로 다양한 SQL 데이터베이스와 통신 가능한 PHP 클래스 집합체

데이터베이스 구현을 추상화하고, 이를 이용하여 DBMS 타입에 관계없이 하나의 인터페이스를 통해 쿼리를 작성하고 실행할 수 있다. (DBMS 마다 다른 Query dialect 는 신경써야 한다.)


-- DB 연결 및 DSN

PHP에서 PDO 클래스 인스턴스를 생성하고 PDO 인스턴스로 PHP와 데이터베이스를 연결한다.

PDO 클래스 생성시 DB 연결 정보를 제공하는 문자열 인수를 DSN 이라고 한다.

DSN은 DB 드라이버명과 호스트명 혹은 IP 주소 그리고 포트번호, DB이름, 문자 집합 등이 포함된다.


ex)

<?php

try {

    $pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=acme;charset=utf8', 'dbaccount', 'dbpassword');

} catch (PDOException $e) {

    echo 'fail to connect';

    exit;

} 


-- 데이터베이스 인증 정보 보관

인증 정보는 PHP 파일에 직접 넣어서 사용하면 안된다. 웹 문서 루트 외부에 있는 설정 파일로 옮겨서 PHP 파일에서 읽어서 처리한다. .gitignore 파일을 이용해서 버전 관리에서도 제외 시킨다.


-- 준비된 구문 (Statement)

Query Injection 등의 위험을 제거하기 위해서 Statement를 이용한다.


ex)

<?php

$sql = 'SELECT id FROM users WHERE email = :email';

$statement = $pdo->prepare($sql);


$email = filter_input(INPUT_GET, 'email');

$statement->bindValue(':email', $email, PDO:PARAM_STR);

$statement->execute();


while( ($result = $statement->fetch(PDO::FETCH_ASSOC)) !== false ) {

    echo $result['email'];

}



-- 쿼리 결과

PDO::FETCH_ASSOC - 배열 키는 데이터베이스 열 이름

PDO::FETCH_NUM - 배열 키는 데이터베이스 열 순서 번호

PDO::FETCH_BOTH - 배열 키는 데이터베이스 열 이름과 열 순서 번호 모두 사용 가능

PDO::FETCH_OBJ - 데이터베이스 열 이름이 객체 속성명으로 사용되는 객체 반환


-- 트랜젝션

트랜잭션은 더 이상 나눌 수 없는 데이터베이스 명령문 집합

DBMS에 따라서 지원 여부가 결정된다.


ex)

<?php

$pdo->beginTransaction();


// insert or update queries


$pdo->commit();







Comment +0