Collection
mongoDB는
mongoDB는 Collection 이 데이터베이스 테이블과 같은 개념이다. 아래 테이블은 관계형 데이터베이스 MySQL과 MongoDB의 개념을 비교해 주고 있다. [^1]
MySQL | MongoDB |
---|---|
Table | Collection |
Row | Document |
Column | Field |
Joins | Embedded documents, linking |
mongoDB는
mongoDB는 Collection 이 데이터베이스 테이블과 같은 개념이다. 아래 테이블은 관계형 데이터베이스 MySQL과 MongoDB의 개념을 비교해 주고 있다. [^1]
MySQL | MongoDB |
---|---|
Table | Collection |
Row | Document |
Column | Field |
Joins | Embedded documents, linking |
MongoDB - Database와 User Authentication
2018-06-21 설치 링크로 대체
{:.right-history}
MongoDB 설치후 데이터베이스 위치, 로그, 인증 등에 관련한 서버 구성과 설정을 정리한다.
MongoDB 2.6 과 MongoDB Community Edition 3.x 버전을 사용했다.
mongoDB 는 설치과정 중에 인증과 관련해 설정하는 부분이 없어서 설치 후 누구나 DB에 접속 할 수 있다. 인증을 추가해 데이터베이스 관리자와 데이터베이스 사용자로 구분해서 이용하고, 각 데이터베이스의 사용자는 허가된 역할(Role)을 가지고 데이터베이스에 접근 가능하도록 구성한다.
2018-06-22 내용 정리, User auth 링크
{:.right-history}
이 문서는 MongoDB Community Edition 3.4 버전을 64bit OS인 Amd64, Arm64 지원 OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행했다.
여기서는 Arm을 사용하는 SBC[^2] 컴퓨터에 mongodb 3.4 버전을, Hardkernel Odroid C2를 사용해서 설치를 진행했다.
2015년 쯤 작성한 것으로 Raspberry Pi, Orange Pi, Odroid SBC 보드에서 3.4를 빌드했다. 2017년 현재 배포본, Debian Jessie, Ubuntu Xeniel 등은 3.4, 3.5가 내장되어 배포되고 있다.
Python 3.6 이상 최신 소스를 빌드하는데 참고할 수 있다.
Raspbian Wheezy에는 3.2가 설치되어 있다. Jessie 가 출시된 이후에 3.2에 대한 모듈 의존성 관리가 되지 않고 있어서 3.4 이상이 설치가 필요하다.
SSL/TLS 지원을 하기 위해 libssl, openssl 라이브러리를 설치한다.
1 | $ sudo apt update |
Python3.4를 다운로드하고 컴파일하고 설치한다.
Raspbian Weezy 에는 Python3.2가 있어서, 최신 3.4를 설치하려면 다운로드해서 컴파일 하면 된다.
1 | $ wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz |
Raspberry Pi 2에서 빌드시 꽤 많은 시간을 사용한다.
1 | $ ./configure |
컴파일하고 빌드시 한 시간 이상 필요하다.
1 | $ make # 한 시간 소요 |
크로스컴파일 환경을 사용할 수 있다.
Python - Install virtualenv on macOS X
Python 개발환경을 위해서 macOS에 설치된 python2.7 그리고 brew 같은 유틸리티로 python3.x 를 설치하고, pip
를 사용해서 패키지를 관리할 수 있다. 그리고 다양한 모듈과 시스템 모듈의 분리를 위해서 버전 관리 도구인 virtualenv
와 virtualenvwrapper
를 사용해 가상 개발 환경을 구성하는 방법을 설명한다.
Python - Install virtualenv on Linux
Python 개발환경을 위해서 시스템에 설치된 python2.7, python3.x 에서 사용하는 패키지 모듈을 pip
를 사용해서 패키지를 관리할 수 있다. 그리고 시스템 모듈과 별도의 버전 환경으로 버전 관리 도구인 virtualenv
와 virtualenvwrapper
를 사용해 파이썬 가상 개발 환경을 구성하는 방법을 설명한다.
nginx를 사용해서 일반 웹 서비스와 node.js 애플리케이션을 연동하는 방법을 살펴보자.
Nginx 설치가 되었다고 가정한다.
/etc/nginx 밑에 가상 호스트 환경에 맞게 파일을 구성한다.
/etc/nginx/site-available/myhome.conf
1 | server { |
http 에 대한 구성
1 | http { |
nginx 구성을 재시작한다
1 | $ cd /etc/nginx/sites-enabled |
nodejs 를 연동하기 위한 Proxy 구성을 추가한다.
1 | server { |
Nginx를 이용해 SSL 제공을 해주자.
1 | $ sudo mkdir /etc/nginx/ssl |
/etc/nginx/site-available/yoursite.com
1 | server { |
http://serverfault.com/questions/250476/how-to-force-or-redirect-to-ssl-in-nginx
1 | server { |
The best way as it described in the official how-to is by using the return directive:
1 | server { |
1 | $ sudo ln -s /etc/nginx/sites-available/yourOdooSite.com /etc/nginx/sites-enabled/yourOdooSite.com |
CORS(Cross-Origin resource sharing)은 웹 페이지 도메인 밖의 다른 도메인에서 제한된 웹 페이지를 자원을 허용하도록 하는 메커니즘이다.[^2]
You need to enable CORS on the server (localhost:8080). Check out this site: http://enable-cors.org/
All you need to do is add an HTTP header to the server:
1 | Access-Control-Allow-Origin: http://localhost:3000 |
전체적으로 열어 주려
1 | Access-Control-Allow-Origin: * |
다음 같이 nginx 설정을 사용한다.
1 | et $cors ''; |
Nginx를 앞단에 두고 Proxy를 이용해 nodeJS, Djang, Angular 등의 서비스를 이용할 때, nginx나 backend 둘 중 한 곳에서 CORS를 활성화 해주면 된다.
Nginx에서 CORS를 허용하려면 아래 설정을 사용할 수 있다. [^1]
1 | location / { |
이와 비슷한 방법으로
https://gist.github.com/m4ttbrock/7337183
https://enable-cors.org/server_expressjs.html
if your app is created with simple node.js set it in your response headers like
1 | var http = require('http'); |
if your app is created with express framework
use a CORS middleware like
1 | var allowCrossDomain = function(req, res, next) { |
cors 모듈을 이용할 수 있다.
https://github.com/expressjs/cors
1 | var cors = require("cors"); |
1 | app.get("/products/:id", cors(), function (req, res, next) { |
1 | var corsOptions = { |
[^1]: CORS on Nginx
[^2]: Cross-origin resource sharing
Node.js를 설치하고 관리할 수 있는 Node Version Manager를 사용한 개발환경 구성에 대해 살펴본다.
2018-6
npm i
관련 설명 추가
{:.right-history}
원문 https://darrenderidder.github.io/talks/ModulePatterns/ 요약
이것은 같단한 모듈을 hello-module.js 소스에 선언한 것이다.
1 | // hello-module.js |
선언된 소스는 require()
로 들여올 수 있다:
1 | require("hello-module.js"); |
모듈 foo.js 를 글로벌
1 | // foo.js |
모듈 foo.js를 들여와 전역에 선언된 함수 foo()를 사용한다.
1 | require("foo.js"); |
그러나 글로벌 영역을 오염 시키지 않는다.
module
객체에 export 한다.
1 | // bar.js |
모듈 bar.js를 들여와 전역에 선언된 함수 foo()를 사용한다.
1 | var bar = require("./bar.js"); |
module
객체의 이름 속성으로 export 한다.
1 | // bar.js |
모듈 bar.js를 들여와 전역에 선언된 함수 foo()를 사용한다.
1 | var fiz = require("./fiz.js").fiz; |
1 | // buz.js |
모듈 buz.js를 들여와 객체의 메서드를 호출한다.
1 | var buz = require("./buz"); |
1 | // buz.js |
모듈 baz.js를 들여와 속성 메서드를 호출한다.
1 | var baz = require("./baz.js").Baz; |
module.exports 에 객체를 노출한다.
1 | // doo.js |
모듈 doo.js를 들여와 객체의 메서드를 호출한다.
1 | var Doo = require("./doo.js"); |
module 에 이름 속성을 노출한다.
1 | // qux.js |
모듈 qux.js를 들여와 객체의 메서드를 호출한다.
1 | var Qux = require("./qux.js").Qux; |
modules.exports는 exports로 가명을 가지고 있다. 이름 있는 속성을 사용할 때 아래 같이 선언한다.
1 | > module.exports.fiz = 'Fiz'; |
exports 에 직접 대입하면 exports alias를 덮어 쓰게 된다.
1 | > module.exports.qux = "qux"; |
mysql-server 를 설치하며 만든 root 사용자 패스워드를 사용해서 데이터베이스에 접속한다.
1 | $ mysql -u root -p |
사용자가 사용할 데이터베이스를 만든다.
1 | mysql>create database mydb; |
그리고 CREATE USER, INSERT 로 새 사용자를 추가할 수 있다.
create user userid@HOST identified by ‘PASSWORD’;
사용자 foo 를 localhost 와 모든 것을 의미하는 패턴 %
로 추가하면:
1 | mysql > create user foo@localhost identified by 'password'; |
혹은
1 insert into user (host, user, password) values ('localhost', 'hiru', 'password('hirururu'));
사용자 제거
mysql > drop user ‘hiru’;
mysql > delete from user where user =’hiru’
사용자 생성시 다음같이 1396 에러는 CREATE USER/GRANT 명령으로 사용자와 권한을 추가/관리해야 하는데 mysql.db, mysql.user 테이블을 직접 조작하다가 일관성이 깨졌기 때문
1 | mysql> create user 'shopuser'@'localhost' identified by ')12345'; |
제대로 사용자를 삭제하고
drop user shopuser@localhost
flush privileges;
로 갱신해 준다.
권한을 추가하고 삭제하기 위해서, GRANT와 REVOKE의 명령을 사용한다. GRANT 명령 등으로 데이터베이스 사용자가 데이터베이스 자원에 접근하는 권한을 만들 수 있다.
GRANT ALL privileges ON DB_NAME.TABLE TO USER_ID@[HOST] IDENTIFIED BY ‘PASSWORD’
GRANT [SELECT,DELETE,INSERT,UPDATE,] ON DB_NAME.TABLE TO USER_ID@[HOST] IDENTIFIED BY ‘PASSWORD’
*
패턴을 사용할 수 있다.http://www.w3big.com/ko/mysql/mysql-administration.html
현재 머신에서만 접속할 수 있는 사용자 계정, 외부, 원격에서 접속할 수 있는 사용자 계정을 추가해 준다.
1 | mysql> use mysql; # mysql system db |
혹은
1 | grant select, insert, update, delete on mydb.* to foo@host identified by 'password'; |
권한을 확인하는 방법
1 | mysql > show grants for foo@localhost |
변경된 권한을 적용하기
1 | mysql > flush privileges; |
권한을 삭제하는 방법
1 | mysql > revoke all on dbname.table from username@host |
추가한 사용자는 SELECT로 확인할 수 있다.
1 | mysql> select host,authentication_string from user where user='foo'; |
새로 생성한 사용자 ID로 로그인을 해서 데이터베이스 정보를 확인해 보자.
1 | $ mysql -u foo -p |
그리고 데이터베이스를 사용하려면 use [DATABASE]
로 변경한다.
1 | mysql> use mydb; |
mysql에서 한글이 ?로 표시되는 경우.
1 | mysql> SELECT * FROM department; |
my.cnf의 문자셋과 터미널 문자셋이 일치하지 않아서 그렇다. MySQL은 설치시 지정하지 않았다면 기본적으로 문자셋이 ‘latin1’으로 설정되어 있다.
1 | mysql> show variables like 'c%'; |
MySQL 설정 파일에서 문자셋을 변경할 수 있다. 다믕 같이 자신의 my.cnf 파일을 작성한다. client, mysqld, mysql 에 대해서 utf8 사용을 선언해 준다.
1 | [client] |
mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO ‘zara‘@’localhost’
-> IDENTIFIED BY ‘zara123’;
Structural Query Language로 튜플 간의 관계를 계산해서 결과를 도촐한다.
데이터 유형
http://www.w3big.com/ko/mysql/mysql-data-types.html
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 scode varchar(4) 학번, 기본키 sname varchar(20) 이름 sdept varchar(20) 학과 sphone varchar(15) 전화번호
1 | CREATE TABLE professor ( |
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 scode varchar(4) 학번, 기본키 sname varchar(20) 이름 sdept varchar(20) 학과 sphone varchar(15) 전화번호
create student table
1 | CREATE TABLE student ( |
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 ccode varchar(4) 과목코드, 기본키 cname varchar(20) 과목명 ctime int 강의 시수 croom varchar(15) 강의실
create course table
1 | CREATE TABLE course ( |
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 lpcode varchar(4) 교수코드, 기본키 lccode varchar(4) 과목코드, 기본키
create lecture table
1 | CREATE TABLE lecture ( |
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 apcode varchar(4) 교수코드, 기본키 asccode varchar(4) 학번, 기본키
create advice table
1 | CREATE TABLE advise ( |
파일 Python-Database-class-student.sql
컬럼명 테이터 타입 비고 rscode varchar(4) 학번, 기본키 rcccode varchar(4) 과목코드, 기본키
create register table
1 | CREATE TABLE register ( |
1 | INSERT INTO professor (pcode, pname, pdept, pphone)\ |
파일에 필드 간의 ‘,’로 구분한 데이터 파일이 있다. 물론 필드 구별 문자는 데이터의 내용에 따라 사용자가 임의로 정 할 수 있다.
파일: studens.txt
1 | S001, 박소명, 컴퓨터공학과, 123-4567 |
studnets.txt 파일을 읽어들이는 것은 스크립트 파일을 작성하거나 mysql에서 직접 실행할 수 있다.
먼저 스크립트 파일 students.sql은 다음과 같다.
1 | use mydb; |
이제 mysql 클라이언트에서 데이터를 읽어 들인다.
1 | mysql>source students.sql; |
SELECT [DISTINCT] select _expr essi on
FROM table_list
WHERE where_definition
ORDER BY col_name [ASC|DESC]
GROUP BY col _name_list
LIMIT [offset ], rows
예제-1) 전체 교수 리스트를 출력하는 SQL 검색 문을 작성하라.
mysql > sel ect * fromprof;
예제-2) 전체 교수 리스트를 이름순서로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pname;
예제-5) 전체 교수 리스트를 이름 역순으로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pname desc;
전체 교수 리스트를 학과별로 출력하는 검색 문을 작성하라.
mysql > sel ect * fromprof order by pdept, pname;
예제-4) 국문학과 교수 리스트를 이름순서로 출력하는 검색 문을 작성하라.
mysql> select * from professor where pdept =’국문학과’;
“FROM 테이블명 AS 별명” 구문은 SQL 문장에서 별명으로 테이블을 참조하 는 역할은 한다.
예제-6) MySQL 과목을 강의하는 교수님의 이름, 전화번호와 강의실을 검색 하는 문장을 작성하라.
mysql> select p.pname, p.pphone, c.croom from professor p, course c, lecture l
where c.cname=’MySQL’ and c.ccode=l.lccode
and l.lpcode=p.pcode;
예제-7) ‘김구’ 교수님이 강의하는 과목명, 강의 시수와 강의실을 검색하는 문장을 작성하라.
1 | select c.cname, c.ctime, c.croom |
예제-8) 각 학생이 수강 신청한 과목에 대해서 학생이름, 전화번호, 과목명, 강의실, 강의 시수를 검색하는 문장을 작성하라.
1 | select s.sname, s.sphone, c.cname, c.ctime, c.croom |
예제-9) 각 학생이 신청한 총 학점을 구하는 검색식을 작성하라.
1 | select s.sname, s.sdept, s.sphone, sum(c.ctime) |
예제-10) 각 학과별 교수님은 몇 분인지 구하는 검색식을 작성하라.
1 | select pdept, count(*) |
예제-11) 페이지 크기가 2 일 때, (예제-8)의 결과에서 두 번째 페이지를 검색하는 SQL문장은 작성하라.
select s.sname, s.sphone, c.cname, c.ctime, c.croom fromstudent as s , course as c, regi ster as r
where s.scode = r.rscode and r.rccode = c.ccode order by s.sname, c.cname
limit 2, 2;
UPDATE tbl_name
SET col_name1 = expr1, col_name2 = expr2, …
[WHERE where_definition] [LIMIT rows];
예제-12) 교수테이블에서 ‘김 구’ 선생님의 이름을 ‘하은용’ 교수님으로 변 경하는 문장을 작성하라.
update prof set pname =’하은용’ where pname =’김구’;
예제-13) 지도 테이블의 교수코드가 ‘P007’ 인 레코드들을 모두 ‘P005’ 로 변경하라.
update advise set apcode =’P005’ where apcode =’P007’;
예제-14) 강의 시수가 2인 과목들의 강의 시수를 하나 증가 시키고, 강의실 을 Lab1로 변경하라.
update course set ctime=ctime + 1, croom=’Lab1’ where ctime=2;
DELETE FROM tbl_name
[WHERE where_definition] [LIMIT rows]
예제-15 ) 국문학과 학생 레코드를 삭제하는 문장을 작성하라.
delete fromstudent where sdept =’국문학과’;
PyMySQL 설치
1 | $ pip install PyMySQL |
만약 pip 로 설치가 안되면 다음 같이 setup.py를 이용해 직접 설치 할 수 있다.
$ # X.X is the desired PyMySQL version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python setup.py install
$ # The folder PyMySQL* can be safely removed now.
1 | CREATE TABLE users ( |
데이터베이스 삭제
1 | mysql> drop database mydb; |
1 | mysql> set password for ''myid''@''localhost'' = password(''password''); |
show 명령으로 데이터베이스 자원 현환을 볼 수 있다.
mysql> help show
다음은 데이터베이스 목록을 보고, ‘mydb’를 사용합니다.
1 | mysql> show databases; |
테이블 현황
1 | mysql> show tables; |
테이블 만들기
1 | mysql>CREATE TABLE users (\ |
이럴게 만들어진 테이블은 show 명령으로 작성 스크립트를 확인할 수 있다.
1 | mysql> show create table users; |
테이블의 구성 요소는 desc 명령을 확인할 수 있다.
1 | mysql> desc users; |
1 | mysql> insert into users values (0, 'aaa@example.com', 'sldfjslfj'); |
1 | mysql> #컬럼 추가 |