Oracle에서는 CONNECT BY PRIOR, START WITH를 사용하여

자신의 ID와 연결된 부모 ID를 찾아가 계층적으로 쿼리결과를 뽑을 수 있다.

오라클에서만 제공하는 구문이다.


1
2
3
4
5
6
7
-- UPMENU_ID에 연결된 MENU_ID가 계층적으로 표현된다.
 
 SELECT MENU_ID
      , UPMENU_ID
   FROM SYS_MENUINFO A
CONNECT BY PRIOR MENU_ID = UPMENU_ID 
  START WITH UPMENU_ID = '00000'
cs


오라클 쿼리 결과



MySQL에서 위와 같은 계층형 쿼리로 구현하고자 한다면 Oracle에서 제공하는 구문을 사용할 수 없다.

아래는 테스트로 구현할 계층형 형태의 쿼리 결과이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
동물
 ┗말
   ┗얼룩말
   ┗조랑말
      ┗망아지
 
 ┗닭
   ┗흰닭
      ┗흰병아리
           ┗흰달걀
 
   ┗검은닭
      ┗검은병아리
           ┗검은달걀
cs




MySQL에서 계층형 쿼리 구문이 따로 없어 

함수를 만들어 재귀함수를 사용해 구현해본다.


ANIMAL 테이블을 생성한다.


1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `ANIMAL` (
 
`id` int(10unsigned NOT NULL AUTO_INCREMENT,
 
`p_id` int(10unsigned default '0',
 
`nm` varchar(50),
 
primary key(`id`)
 
ENGINE=InnoDB DEFAULT CHARSET=utf8
cs


ANIMAL 테이블에 데이터를 넣어준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
insert into ANIMAL(p_id, nm) values ( 0'동물');
 
insert into ANIMAL(p_id, nm) values ( 1'말');
 
insert into ANIMAL(p_id, nm) values ( 1'닭');
 
insert into ANIMAL(p_id, nm) values ( 2'얼룩말');
 
insert into ANIMAL(p_id, nm) values ( 2'조랑말');
 
insert into ANIMAL(p_id, nm) values ( 3'흰닭');
 
insert into ANIMAL(p_id, nm) values ( 3'검은닭');
 
insert into ANIMAL(p_id, nm) values ( 5'망아지');
 
insert into ANIMAL(p_id, nm) values ( 6'흰병아리');
 
insert into ANIMAL(p_id, nm) values ( 7'검은병아리');
 
insert into ANIMAL(p_id, nm) values ( 9'흰달걀');
 
insert into ANIMAL(p_id, nm) values ( 10'검은달걀');
cs


함수 fnc_hierarchi 를 만들어준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
DROP FUNCTION IF EXISTS fnc_hierarchi;
 
DELIMITER $$
 
CREATE FUNCTION  fnc_hierarchi() RETURNS INT
 
NOT DETERMINISTIC
 
READS SQL DATA
 
BEGIN
 
    DECLARE v_id INT;
    DECLARE v_parent INT;    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;
 
    SET v_parent = @id;
    SET v_id = -1;
 
    IF @id IS NULL THEN
        RETURN NULL;
    END IF;
 
    LOOP
    
    SELECT MIN(id)
      INTO @id 
      FROM ANIMAL
     WHERE p_id = v_parent
       AND id > v_id;
 
    IF (@id IS NOT NULL) OR (v_parent = @start_with) THEN
       SET @level = @level + 1;
    RETURN @id;
    END IF;
    
    SET @level := @level - 1;
 
    SELECT id, p_id
      INTO v_id , v_parent 
        FROM ANIMAL
       WHERE id = v_parent;
   
    END LOOP;
 
END
 
$$
 
DELIMITER ;
cs


조회해본다.


1
2
3
4
5
6
7
8
9
10
11
12
SELECT CASE WHEN LEVEL-1 > 0 then CONCAT(CONCAT(REPEAT('    ', level  - 1),'┗'), ani.nm)
                 ELSE ani.nm
           END AS nm
     , ani.id
     , ani.p_id
     , fnc.level
  FROM
     (SELECT fnc_hierarchi() AS id, @level AS level
        FROM (SELECT @start_with:=0, @id:=@start_with, @level:=0) vars
          JOIN ANIMAL
         WHERE @id IS NOT NULL) fnc
  JOIN ANIMAL ani ON fnc.id = ani.id
cs


의도한 대로 쿼리결과가 나온것을 확인했다.




ubuntu linux에 mysql 8.0을 설치했는데 

기존 개발환경의 java버전이 낮아 mysql-connector library와 호환이 되지 않았다.

그래서 mysql 8.0을 모두 지우고 mysql 5.7로 재설치 하게 되었다.



1. 먼저 기존 mysql과 관련된 설치한  모든 것을 지운다.


1
2
3
4
5
$ sudo apt-get remove --purge mysql*
 
$ sudo apt-get autoremove
 
$ sudo apt-get autoclean
cs





중간중간 Y/n가 뜬다면 Y를 입력하여 모두 remove 시킨다.



2. 설치가능한 mysql 목록을 확인하고 mysql 5.7을 설치하기


1
2
3
$ sudo apt-cache search mysql-server
 
$ sudo apt-get install mysql-server-5.7
cs





설치가 완료되면 로그인을 시도한다.


로그인 시 아래와 같이 에러발생 한다.



1
2
3
4
5
$ mysql -u root -p
 
Enter password:
 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
cs



로그인을 위해 sudo를 이용해 mysql에  로그인한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo mysql -u root 
 
mysql> USE mysql;
 
mysql> SELECT User, Host, plugin FROM mysql.user;
 
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | auth_socket           |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)
cs




3. 현재 root 계정의 plugin이 auth_socket이므로 mysql_native_passwordupdate 시켜준다.



1
2
3
4
5
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ service mysql restart
cs




다음 root plugin을 확인한다.


1
2
3
4
5
6
7
8
9
10
11
mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)
cs


auth_socket에서 mysql_native_password로 바뀐것을 확인했다.




이제 sudo 없이 


1
$ mysql -u root -
cs


로 비밀번호 없이 db에 접속할수 있다.



4. root 비밀번호를 재설정해주자.



1
2
3
4
5
6
7
mysql> USE mysql;
 
mysql> update user set password=password('0000') where user='root';
 
mysql> update user set authentication_string=password('0000') where user='root';
 
mysql> flush privileges;
cs



설정이 끝나면 다시 로그인해본다.

$ mysql -u root -p 

비밀번호 0000을 넣어줘야 db에 접속할수 있다.



5. root 계정을 외부에서 접속가능하게 허용해준다.



1
2
3
4
5
6
7
mysql> grant all privileges on *.* to 'root'@'%' identified by '0000';
 
mysql> flush privileges;
 
mysql> select host, user, authentication_string  from user;
 
mysql> exit
cs




다음 bind-address 주석설정을 해준다.


1
2
3
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
 
$ sudo service mysql restart
cs






6. MySQL tool을 이용해 root로 DB가 접속되는지 확인한다.




잘 접속 되는 것을 확인할 수 있었다.


이후 테이블을 생성하고 유저생성 및 권한을 줘서 root로 접속하지 않고 작업을 진행할 수 있다.



7. 테이블 생성


1
CREATE DATABASE DB명 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
cs



8. 유저 생성 및 권한 주기


1
GRANT ALL PRIVILEGES ON DB명.* to '계정명'@'%' identified by '비밀번호';
cs



9. 비밀번호 변경


1
2
3
4
5
6
7
USE mysql
 
UPDATE user SET authentication_string=password('0000') where user='root';
 
FLUSH PRIVILEGES;
 
exit
cs



1. JDK 환경변수 설정 


1
java -version
cs


을 입력한다. java를 찾을수 없다고 나온다.



1
ls
cs


명령어로 home 디렉토리 안에 설치되어 있는 목록을 확인한다.

현재 본인은 java폴더 안에 jdk 1.6폴더가 설치되어 있다.





기본 경로로 다시 돌아와 bash_profile 이라는 파일을 만든다.




1
vi ./bash_profile
cs



다운받은 jdk의 압축 푼 폴더의 경로를 JAVA_HOME으로 지정해주고 :wq로 저장한다.



1
2
3
4
5
6
7
8
9
10
11
JAVA_HOME=/home/top/java/jdk1.6.0_45
 
JRE_HOME=${JAVA_HOME}
 
export JAVA_HOME
 
export JRE_HOME
 
PATH=${JAVA_HOME}/bin:${PATH}
 
export PATH
cs



bash_profile 파일 실행


1
. ./bash_profile
cs


파일을 실행한다.

이후 자바버전을 확인한다. 


1
2
3
top@top-TS500-E5:~$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
cs





설치 된 java 버전이 잘 뜨는 것을 확인 할 수 있다.



SQLPlus를 이용해 scott/tiger 로 로그인을 시도했는데 계정이 잠겼다고 오류가 발생하였다.


ORA-28000: the account is locked


scott tiger 계정 활성화 방법으로는


시스템 계정으로(system / 비밀번호) 로그인해서  


1
ALTER USER scott ACCOUNT UNLOCK;
cs


다음 쿼리를 통해 scott의 계정잠김을 해제할 수 있다.






레드마인 CKEditor plugin 설치 과정과 똑같이 

다른 plugin들도 레드마인과 호환가능하다면 같은 방식으로 설치할 수 있다.


문서 관리 시스템 플러그인인 DMSF plugin을 설치해보겠다.


* DMSF plugin 설치하기


https://www.redmine.org/plugins/dmsf 


접속하여 호환가능버전을 확인한다.





이후 github 주소로 접근해 버전에 맞는 소스코드.zip 파일을 다운받는다.





다음은 내컴퓨터


D:\Bitnami\redmine-3.4.6-5\apps\redmine\htdocs\plugins 경로로 이동 후


다운 받은 zip 파일의 압축을 풀어주고 압축 푼 폴더의 이름을 redmine_dmsf로 변경한다.




Bitnami Redmine Stack 사용 터미널을 켜고


D:\Bitnami\redmine-3.4.6-5\apps\redmine\htdocs 경로로 이동 후



명령어를 입력해 설치를 한다.




설치가 완료되면 서버를 재시작한다.




이후 설정 > 프로젝트 탭의 DMS를 체크해주고 저장한다.



새 프로젝트를 하나 생성하여 Documents 탭이 나오는지 확인한다.



잘 설치된 것이 확인되었다.


이와 같은 방식으로 필요한 플러그인을 찾아 설치하여

레드마인의 설정을 커스터마이징 할 수 있다.



bitnami redmine을 다운받아 설치하면 복잡한 설정없이 레드마인 기본셋팅이 가능하다.



1. bitnami redmine 다운로드 및 설치


bitnami redmine 다운로드 한다.


Windows 버전

https://downloads.bitnami.com/files/stacks/redmine/3.4.6-5/bitnami-redmine-3.4.6-5-windows-installer.exe



다운받은 파일을 실행하여 기본셋팅값으로 설치한다.





언어는 한국어로 설치경로는 D:드라이브로 잡았고 로그인계정명은 user로 설치를 진행하였다.

 




설치가 완료되고 어플리케이션을 구동하면 http://localhost(http://127.0.0.1) 기본포트 80로 레드마인이 실행이 된다.


Bitnami Redmine Stack Manager Tool 을 실행하면 [Go to Application] 버튼을 눌러 현재 올라간 서비스를 확인할 수 있고





Mange Servers탭으로 이동해 현재 구동중인 db, 웹서버, 서비스를 확인할 수 있다.



localhost가 제대로 뜨면 Access Redmine 링크로 이동한다.



레드마인으로 접근되면 로그인을 시도한다.




아까 설치 할때 설정 입력했던 정보로 로그인에 성공 하면 redmine 관리 화면으로 접속한다.




설정, 플러그인에 진입하면 비어있는것을 확인할 수 있다.





현 상태로도 충분히 사용가능하지만


레드마인의 기본적인 것만 제공하므로 유용한 플러그인을 설치하여


사용하기 편한 셋팅을 만들어 줘야 한다.




2. 레드마인 플러그인 설치


※ 플러그인 설치 시


- 레드마인과 플러그인이 버전에 맞게 서로 호환가능한지 확인하는게 가장 중요하다.

- 플러그인이 잘못 설치 되었을때 서버 재시작이 안 될수 있으므로 플러그인을 삭제한다.


먼저 레드마인 플러그인 웹페이지로


https://www.redmine.org/plugins?page=1


접속하여 자신이 설치한 레드마인 버전에 맞게 검색하여 플러그인을 찾는다.





먼저 CKEditor plugin을 설치하겠다. 


plugin의 버전과 레드마인의 버전을 맞춰줘야 호환가능 사용할수 있다.

레드마인 3.4.6 버전과 맞는 CKEditor plugin 1.1.5 버전을 설치하겠다.

 




installation notes에 나와있는 github 경로로 접근해 1.1.5 zip 파일을 다운받는다.




D:\Bitnami\redmine-3.4.6-5\apps\redmine\htdocs\plugins 폴더에 다운받은 zip파일을 풀고 redmine_ckeditor로 폴더이름을 바꿔준다.




이후 Bitnami Redmine Stack 터미널을 실행하여 명령어를 통해 플러그인 설치 작업을 진행한다.



터미널에서 D:\Bitnami\redmine-3.4.6-5\apps\redmine\htdocs 해당경로로 접근한다.

이후 설치 명령어를 통해 플러그인을 설치한다.







위에 3가지 설치 명령어가 완료되면 Bitnami Redmine Stack Manager Toold의 Manage Servers 탭의 서버를 Restart 시켜준다.



재접속하여 플러그인이 잘 깔렸는지 확인하여 필요한 상세설정이 가능하다.



설정 쪽으로 들어와 본문형식을 Ckeditor로 지정한후 저장한다.




이후 글쓰기를 사용하여 CKEditor의 기능이 잘 작동하는지 확인한다.




레드마인 버전에 맞게 플러그인이 잘 설치된 것을 확인할 수 있었다.



마지막으로 레드마인 관련 파일 다운경로를 공유한다.


https://drive.google.com/drive/folders/1L4fuUWl5UojuRrC7bmUn7GpnWUVb42Fx?usp=sharing



1. USER 생성


1
2
3
4
-- user 생성
CREATE USER SANGHYUN IDENTIFIED BY mypassword
DEFAULT tablespace USERS
TEMPORARY tablespace TEMP;
cs


2. USER 권한부여하기


1
2
3
4
5
-- 권한부여하기
GRANT RESOURCE, CONNECT TO SANGHYUN;
 
-- 데이터베이스 import 시 권한 부여하기
GRANT IMP_FULL_DATABASE TO SANGHYUN;
cs


3. TABLE SPACE 생성


1
2
3
4
-- table space 생성
CREATE TABLESPACE MY_TABLE_TAB DATAFILE 'MY_TABLE_TAB' SIZE 2048M 
AUTOEXTEND ON NEXT 4M MAXSIZE UNLIMITED LOGGING PERMANENT 
EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT MANUAL FLASHBACK ON
cs


4. export 방법


1
2
-- export 방법
exp userid=sanghyun/mypw  file='D:\myfile.dmp'
cs


5. import 방법


1
2
-- import 방법
imp username/password file=D:\myfile.dmp commit=y ignore=y full=y;
cs



Express Core 미들웨어 설치(morgan, helmet, cookie-parser, body-parser)



1. morgan 설치


npm install morgan


node js에서 쓰는 HTTP 요청 logger 미들웨어이다. ( HTTP request logger middleware for node.js )

logging에 도움을 준다.



2. helmet 설치


npm install helmet


Helmet은 다양한 HTTP 헤더를 설정하여 Express 응용 프로그램의 보안을 유지하도록 도와준다.

(Helmet helps you secure your Express apps by setting various HTTP headers.)

보안에 도움을 준다.



3. cookie-parser 설치


npm install cookie-parser


쿠키 헤더를 파싱하고 req.cookies를 쿠키 이름으로 키가 된 객체로 채웁니다.

(Parse Cookie header and populate req.cookies with an object keyed by the cookie names.)

쿠키 사용에 도움을 준다.



4. body-parser 설치


npm install body-parser


nodejs 바디파싱 미들웨어이다. ( Node.js body parsing middleware. )

req.body 속성 아래에서 사용할 수있는 처리기보다 먼저 미들웨어에서 들어오는 request body를 파싱합니다.

(Parse incoming request bodies in a middleware before your handlers, available under the req.body property.)

body 파싱에 도움을 준다.



'전체 > NodeJS' 카테고리의 다른 글

express middleware 설정  (0) 2019.05.07
Nodejs 기본설정2 - Babel, Nodemon  (2) 2019.05.06
Nodejs 기본 설정(NPM Express .gitignore 설치)  (3) 2019.05.06

+ Recent posts