github 잔디밭을 매일 만들어보자. (매일 파일이 생성되는 개발일기장을 만들어보자)


매일 파일이 하나씩 자동생성하여 github에 commit, push하는 sh 파일을 만들고 crontab으로 스케줄링을 걸것이다.


Github 자동 배포 설정하기


AWS EC2 Ubuntu Linux 18.04로 진행하였다.

 


1. git 설치



1
2
3
4
5
6
7
$ sudo apt-get install git
 
$ git --version
 
$ git config --global user.name "shlee0882"
 
$ git config --global user.email "shlee0882@gmail.com"
cs




2. ssh key 생성



1
2
3
4
5
6
7
8
9
$ ssh-keygen -t rsa -"shlee0882@gmail.com"
 
# 엔터 3번 이상 칩니다.
 
$ cd /home/ubuntu/.ssh/
 
$ cat id_rsa.pub
 
# ssh-rsa AAAAB........ 내용 복사한다.
cs






ssh key를 생성 후 값을 복사해 Settings > SSH and GPG keys > SSH keys > New SSH key > 추가 후 저장한다.










4. git clone ssh type



새로운 github 레파지토리를 생성한다.







SSH git repository 주소를 복사 한다.


1
2
# ssh git repository 주소를 clone 한다.
$ git clone git@github.com:shlee0882/git-diary.git
cs

git clone 이 잘 되었는지 확인한다.




5. 스케줄링 sh파일 작성


1
2
3
4
5
$ mkdir git-sch
 
$ cd git-sch
 
$ vi git-sch.sh
cs


git-sch 라는 디렉토리 안에 스케줄링 쉘(sh) 파일을 만들어 넣어놓는다.


git-sch.sh 파일 내용은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# git-sch.sh
 
Y=$(date +%Y)
M=$(date +%m)
D=$(date +%d)
 
Ym=$Y-$M
Ymd=$Y-$M-$D
GitRep="git-diary"
 
HomeDir="/home/ubuntu"
GitDir="$HomeDir/$GitRep"
FileDir="$HomeDir/$GitRep/$Ym"
FileNm="$Ymd".md
 
mkdir -p $FileDir
 
echo "### $Ymd 일기" >> $FileDir/$FileNm
 
cd $GitDir
git add .
git commit -"commit $FileNm"
git push origin master
cs


1
2
3
# 권한 부여
 
$ chmod +x git-sch.sh
cs



6. 쉘파일 실행



쉘파일 디렉토리 위치에서


1
2
# 작성한 쉘파일 실행 > 테스트
$ ./git-sch.sh
cs


github repository에 접속해 push가 잘되었는지 확인한다.




성공적으로 push 된것을 확인했다.




7. 날짜 확인하기



크론탭으로 스케줄링 걸기 전에 현재 시간을 알아본다.


1
2
3
$ date
 
# Tue Jun  2 09:03:18 UTC 2020
cs



우리나라 시간대로 바꿔준다.

일본과 우리나라는 같은 시간대를 사용하므로 Japan으로 바꿔준다.



1
2
3
4
5
6
$ cd  /usr/share/zoneinfo/
$ ls
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
 
$ date
# Tue Jun  2 18:53:40 JST 2020
cs




시간을 변경했으니 크론탭 서비스를 재시작해준다.




1
2
3
$ sudo service cron restart
 
$ sudo /etc/init.d/crond restart
cs




8. 크론탭 스케줄링 테스트 하기



1
2
3
4
5
# 크론탭 리스트 확인
$ crontab -l
 
# 크론탭 등록 및 수정
$ crontab -e
cs



크론탭 등록 시 에디터를 선택하는 창이 나오는데 

nano editor 1번을 선택하고 enter를 친다.


들어가면 주석으로 어떻게 사용하는지 상세하게 나와있다.

주석 맨 아래로 내려가 스케줄링 걸 작업을 적고 저장한다.


일단 크론탭이 잘 작동하는지 기본 테스트를 해보자.



1
2
3
4
$ crontab -e
 
# 추가
* * * * * echo "cron works" >> /home/ubuntu/test.txt
cs




파일을 저장후 나온다.

(ctrl+x, y, enter를 누른다) 


1
$ cat /home/ubuntu/test.txt
cs





크론탭에 매분마다 실행될수 있게 등록하여

시간이 지나면 cron works에 계속 찍히는 것을 확인할 수 있다.


크론탭이 정상적으로 동작하는 것을 확인했으므로 

테스트용 등록 크론탭을 지운다.


1
$ crontab -r
cs



9. 크론탭으로 github push 스케줄링 걸기


1
2
3
4
5
$ crontab -e
 
# 추가
# 분 시 일 월 요일 sh파일 
30 18 * * * /home/ubuntu/git-sch/git-sch.sh
cs



해당시간에 크론탭이 sh파일을 실행하여 github으로 push작업이 될것이고



매일 매일 제목이 붙은 github diary(일기장)이 생성될 것이다.







1. 파이썬 설치






2. 파이썬 환경변수 추가해주기





C:\Users\sanghyun\AppData\Local\Programs\Python\Python38-32\Scripts




3. 관리자권한으로 cmd 다시켜기






4. pip 명령어 사용해보기




이제 pip 명령어를 이용해 윈도우에 필요한 도구들을 설치할 수 있게 되었다.


1
2
3
$ pip install --upgrade pip setuptools
 
$ pip install --upgrade httpie
cs



IntelliJ 에서 subversion을 사용해 소스를 내려받으려고 했는데  

Cannot run program svn 오류가 발생하여 해당 내용을 정리하여 포스팅하려고 한다.


1. Subversion 1.8 다운로드 받는다.

(https://www.visualsvn.com/downloads/)





2. IntelliJ SVN 경로 설정


다운받고 적당한 위치에 압축을 풀고 


IntelliJ 설정 창으로 들어와 압축푼 경로의 \bin\svn.exe 를 붙여 


D:\Apache-Subversion-1.13.0\bin\svn.exe 를 입력해주고 apply OK 해준다.





IntelliJ를 재시작하여 svn repository가 잘 연결되었는지 확인해본다.



ubuntu linux 18.04에 spring 프로젝트를 jenkins로 배포 관리해보려고 한다.



1. jdk 설치


1
2
3
4
5
6
7
$ sudo apt-get update
 
$ sudo apt-get install openjdk-8-jdk
$ sudo apt-get install openjdk-8-jre
 
$ java -version
$ javac -version
cs



2. 톰캣 설치


1
2
3
4
5
6
7
8
9
10
11
12
-- download tomcat tar file
$ wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz

-- unzipped tomcat tar file
$ tar xvf apache-tomcat-8.5.53.tar.gz
 
-- make custom folder
$ cd /home/ubuntu
$ mkdir myJenkins
 
-- move tomcat folder to custom folder  
$ mv apache-tomcat-8.5.53 /home/ubuntu/myJenkins
cs


[톰캣 시작과 로그 확인하기]


1
/home/ubuntu/myJenkins/apache-tomcat-8.5.53/bin/startup.sh;
cs


[톰캣 기본 페이지 접속 확인]


1
http://IP:8080/
cs



3. git 설치


1
2
3
4
5
$ sudo apt update
 
$ sudo apt install git
 
$ git --version
cs


[git 경로]


1
2
3
which git .
 
/usr/bin/git
cs



4. 젠킨스 설치(톰캣 경로 webapps 아래로 넣어 설치)


1
2
3
$ wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
 
$ cp -rv jenkins.war /home/ubuntu/myJenkins/apache-tomcat-8.5.53/webapps
cs


[톰캣 재시작]


1
2
3
/home/ubuntu/myJenkins/apache-tomcat-8.5.53/bin/shutdown.sh; 
 
/home/ubuntu/myJenkins/apache-tomcat-8.5.53/bin/startup.sh; 
cs



[젠킨스 페이지 확인]


1
http://IP:8080/jenkins
cs



젠킨스 초기화면이 나온다면 성공



[젠킨스 초기비밀번호 확인]


1
cat /root/.jenkins/secrets/initialAdminPassword
cs



초기비밀번호로 나온 값을 넣어주고 기본으로 설치하여 진행해준다.



5. 메이븐 설치


1
2
3
4
5
$ sudo apt update
 
$ sudo apt install maven
 
$ mvn -version
cs

 


6. 젠킨스 내부셋팅


메이븐까지 설치완료되었다면 젠킨스 내부설정을 해주자.


- 플러그인 설치

Jenkins관리 > 플러그인 관리 > git, maven integration, Deploy to container plugin 설치한다.






다음으로 Jenkins 관리  > Global Tool Configuration으로 들어가


jdk, git, maven 경로를 전역으로 잡아준다.


해당 경로는 아래와 같다.


1
2
3
4
5
[jdk 경로] /usr/lib/jvm/java-8-openjdk-amd64
 
[git 경로] /usr/bin/git
 
[메이븐 경로] /usr/share/maven
cs








7. 톰캣 내부 셋팅


젠킨스 내부설정까지 완료되었다면

설치된 톰캣의 내부 설정을 해주자.


1
2
3
4
5
[톰캣 context.xml]
 
Context 태그 안에 추가
 
<Resources cachingAllowed="true" cacheMaxSize="100000" />
cs


1
2
3
4
5
6
7
[톰캣 tomcat-users.xml]
 
tomcat-users 태그 안에 아래 유저정보 추가
 
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="0000" roles="manager-gui, manager-script"/>
cs


1
2
3
4
5
6
7
8
[톰캣 webapps/manager/META-INF/context.xml 수정]
 
$ vi /home/ubuntu/myJenkins/apache-tomcat-8.5.53/webapps/manager/META-INF/context.xml
 
Context 태그 안의 주석처리하기
<Context antiResourceLocking="false" privileged="true" >
    <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
</Context>
cs




8. 프로젝트 만들고 빌드하기






Build Now를 클릭하고 Console Output으로 결과를 확인한다.




빌드가 성공되고 Deploy 된것을 확인할 수 있다.


http://ip주소:8080/SpringProject/





#. 기타 


사실 셋팅하기전 윈도우환경에서 미리 젠킨스를 구성해서 빌드 배포 해보았는데 잘되어서

리눅스에서도 별 문제없이 구동될거라고 생각했다.


본인은 AWS EC2 중 가장 낮은 t2.nano로 서버를 구동했는데 

java, maven, jenkins 모두 올려보았으나 메모리가 부족하여 

서버속도가 너무 느렸고 java heap size 부족하다는 오류, maven 컴파일 오류 등

많은 오류를 접했다. 

로컬 서버환경과 ec2 서버환경을 고려하지 못했던 것이었다...


일단 돈이 없는 나에게 가장 낮은 t2.nano서버 유형으로 ci deploy하길 원했고   

여러설정을 변경해서 올리기는 성공했다. 


하지만 젠킨스로 빌드속도가 평균 1~2분 걸리는 것이 10분이 넘게 걸리고

동시에 두개의 프로젝트를 운용하기 어렵다는 것을 확인해 

t2.micro로 서버를 교체했다. 


아래는 t2.nano로 서버를 구동시킬때 설정해줬던 구성이다.


1
2
3
4
5
[java heap size 늘리기]
 
$ sudo vi ~/.bashrc
 
$ alias java='java -Xmx512m'
cs


1
2
3
4
5
6
7
8
9
[maven size 늘리기]
 
set MAVEN_OPTS="-Xmx512m"
 
$ sudo vi ./bash_profile
 
export MAVEN_OPTS="-Xmx512m"
 
$ . ./bash_profile
cs


1
2
3
[디버깅을 위해 톰캣 시작과 동시에 로그 확인하기]
 
/home/ubuntu/myJenkins/apache-tomcat-8.5.53/bin/startup.sh; tail -/home/ubuntu/myJenkins/apache-tomcat-8.5.53/logs/catalina.out
cs




예전에 만든 스프링 기반 웹서비스를 AWS EC2, AWS RDS를 사용하여 운영하고 있었는데

본인의 프리티어 기간도 종료되고 AWS EC2, AWS RDS 비용이 많이 나와 

EC2를 가장 작은 서버로 옮기고 DB또한 EC2 안에서 구동하려고 

서버와 db 마이그레이션을 하게 되어 그 과정을 포스팅 해보려고 한다.


가장 낮은 사양의 AWS EC2 t2.nano Ubuntu Server 18.04 LTS (HVM), SSD Volume Type 우분투 리눅스를 설치하였다.

(더 자세한 정보 : https://shlee0882.tistory.com/180?category=777755)


서버의 보안그룹 설정은 다음과 같이 진행하였다.

putty나 filezila에서 접속하기 위해 SSH 포트 22, 웹서비스를 구동하기 위한 80, 8080 포트

MySQL을 사용하기 위한 3306 DB포트를 열어주었다.




그 이후 putty로 접속하여 리눅스에서의 설치 과정을 정리해보았다.


본인은 db마이그레이션이 가장 중요하다고 생각되어 라이브러리는 mysql 부터 설치하였다. 


1. Ubuntu Linux에서의 MySQL 설치 및 root 권한 설정


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
-- 업데이트
sudo apt update
 
-- mysql 설치
sudo apt install mysql-server
 
-- mysql 접속
sudo mysql
 
-- mysql.user 쿼리 조회
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
 
-- root 플러그인 변경
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
$ sudo service mysql restart
 
-- root 비밀번호 재설정
$ sudo mysql 
mysql> USE mysql; 
mysql> update user set authentication_string=password('0000'where user='root';
mysql> flush privileges;
 
-- root 계정을 외부에서 접속가능하게 허용
mysql> grant all privileges on *.* to 'root'@'%' identified by '0000'
mysql> flush privileges;
mysql> select host, user, authentication_string  from user;
mysql> exit
 
-- bind-address 주석설정
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
$ sudo service mysql restart
cs


mysql의 root 권한부터 기본설정을 마치고

mysqld.cnf를 열어 bind-address = 127.0.0.1 맨 앞의 #을 붙여 주석설정한 뒤 저장하였다.

그 이후 mysql 서버를 재시작한다.

(더 자세한 정보 : https://shlee0882.tistory.com/240)


이제 MySQL Tool (heidiSQL)을 이용해 root로 접속해보겠다.

ip는 IPv4 퍼블릭 IP를 넣었고 사용자 이름은 root 암호는 본인이 설정한 0000으로 넣었다.


2. HeidiSQL에서의 접속 테스트



접속이 된다면 성공한 것이다.


이제 본인의 AWS RDS에서의 export한 DB Schema를 불러와 import 한다.


필요한 경우 DB Charset 변경도 해준다.


1
2
cd /etc/mysql
vi my.cnf
cs


해당 사항을 추가하고 저장한다.


1
2
3
4
5
6
7
8
9
10
[client]
default-character-set = utf8mb4
 
[mysql]
default-character-set = utf8mb4
 
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
cs


DB 스키마 언어도 변경해준다.


1
ALTER DATABASE DB_NAME CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
cs


(db 마이그레이션 완료)



3. 오픈 JDK, JRE, 톰캣8 설치 및 확인


1
2
3
4
5
6
7
8
9
10
-- 오픈 jdk8, jre 설치 및 확인 
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
$ sudo apt-get install openjdk-8-jre
$ java -version
$ javac -version
 
-- 톰캣8 설치 및 확인
$ sudo apt-get install tomcat8
/usr/share/tomcat8/bin/version.sh
cs


톰캣을 설치했으면 확인해보자.

자신의 EC2퍼블릭 서버ip와 톰캣 기본포트는 8080이니 

본인의 EC2 보안그룹에 8080포트가 열려있다면 접속가능하다.


http://자신의EC2퍼블릭서버ip:8080/

(ex: http://15.164.212.200:8080/)



하지만 웹의 기본포트는 80 인데 

톰캣의 포트번호 8080을 80으로 변경하여 ip주소만 입력하면

바로 서비스하는 웹으로 이동해보려고 한다. 


4. Tomcat8 port 8080 to 80 change


server.xml의 port 8080을 80으로 수정하고

tomcat8의 AUTHBIND=yes로 변경 후 AUTHBIND 설치 후 톰캣 재시작을 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo vi /var/lib/tomcat8/conf/server.xml
-- <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
-- port 8080을 80으로 수정
 
$ sudo vi /etc/default/tomcat8
-- #AUTHBIND=no를 주석제거하고 AUTHBIND=yes 로 변경
 
$ sudo apt-get install authbind
 
$ sudo touch /etc/authbind/byport/80
$ sudo chmod 500 /etc/authbind/byport/80
$ sudo chown tomcat8 /etc/authbind/byport/80
 
$ sudo /etc/init.d/tomcat8 restart
cs


이제 포트입력 없이 자신의 EC2퍼블릭서버ip 주소로 바로 접속 가능하다면 성공이다.


5. 스프링 프로젝트를 war파일을 export 및 linux로 전송


스프링 프로젝트를 war파일로 만든다.



export된 war파일을 

filezila 접속 후 리눅스서버의 /home/ubuntu 디렉토리로 파일을 전송한다.




리눅스로 돌아와 파일 확인 및 tomcat8/webapps 하위디렉토리로 이동시킨다.



1
2
3
4
5
6
7
8
9
10
11
12
-- 리눅스로 파일 이동되었는지 확인
$ cd /home/ubuntu
$ ls
BurgerInfo.war
 
-- tomcat8 webapps 디렉토리 아래로 war파일 이동
$ sudo mv BurgerInfo.war /var/lib/tomcat8/webapps/
$ cd /var/lib/tomcat8/webapps/
 
-- webapps 디렉토리 확인 war파일이 풀려져있으면 성공
$ ls
BurgerInfo  BurgerInfo.war  ROOT
cs


webapps의 war파일이 풀려 디렉토리가 생겼다면 

자신의 프로젝트의 기본경로를 추가해주고 톰캣 재시작한다.


1
2
3
4
5
6
7
8
9
-- server.xml 수정
$ cd /var/lib/tomcat8/conf
$ sudo vi server.xml
 
-- <Host> 태그 안에 본인의 프로젝트 이름과 기본경로 추가해준다.
-- <Context docBase="BurgerInfo" path="/" reloadable="true"/>
 
-- 톰캣 재시작
$ sudo service tomcat8 restart
cs



이후 자신의 프로젝트가 잘뜨는지 확인한다.

잘 뜨는 것이 확인되었다. 




그런데 띄우고 몇분이 되지 않아 DB로 접속이 되지 않는것이었다.

mysql을 재시작하려고 했는데 start가 되지 않았다.


6. AWS EC2 t2.nano InnoDB Cannot allocate memory for the buffer pool Error


1
2
3
-- mysql restart error 발생
$ sudo service mysql stop
$ sudo service mysql start
cs


Job for mysql.service failed because the control process exited with error code.

See "systemctl status mysql.service" and "journalctl -xe" for details.


에러 로그를 확인해보니 

2020-04-05T06:30:39.241537Z 0 [Note] InnoDB: Using CPU crc32 instructions
2020-04-05T06:30:39.243292Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2020-04-05T06:30:39.243322Z 0 [ERROR] InnoDB: mmap(137428992 bytes) failed; errno 12
2020-04-05T06:30:39.243329Z 0 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2020-04-05T06:30:39.243334Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2020-04-05T06:30:39.243339Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2020-04-05T06:30:39.243343Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2020-04-05T06:30:39.243347Z 0 [ERROR] Failed to initialize builtin plugins.
2020-04-05T06:30:39.243350Z 0 [ERROR] Aborting

버퍼풀에 메모리 할당 못한다. 메모리 부족 하다는 것을 얘기하는 것 같다.

stackoverflow에서 확인해보니 AWS EC2의 Micro 인스턴스는 기본 SWAP 공간이 없다고 한다.

(https://stackoverflow.com/questions/16917973/amazon-ec2-mysql-failed-to-start)


그럼 스왑설정을 해주자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sudo su
 
$ dd if=/dev/zero of=/swapfile bs=1M count=1024
$ mkswap /swapfile
$ swapon /swapfile
$ vi /etc/fstab 
-- /swapfile swap swap defaults 0 0 추가해준다. 
 
-- 스왑설정 확인
$ swapon -
$ free -k
$ swapon -a
 
$ service mysql restart
cs



설정을 마치니 mysql 버퍼메모리 오류가 발생 하지 않았다.


그런데 매번 배포할때마다 수동으로 war로 묶어 tomcat wepapps 밑으로 옮겨서 

배포할순 없다.  


다음번엔 빌드와 배포를 자동화 하는 젠킨스를 설치하여 지속적으로 통합관리 해보려고 한다. 


이번 설정을 통해 AWS 비용을 아낄수 있는 기회가 되었으면 좋겠다.



- 컬럼을 여러개의 로우로 표현하기


테이블의 데이터를 보면 한 컬럼안의 구분자를 사용하여 여러개의 데이터를 저장하여 사용하는 테이블이 있다.


1
SELECT '02,031,032' LIST_COL FROM DUAL
cs


1
2
3
4
│    LIST_COL   │
│───────────────│
│  02,031,032   │
└───────────────┘
cs


현재 LIST_COL 컬럼에는 한 컬럼안에 데이터가 ,(콤마)로 구분되어 코드값이 저장되어 있다.



1개의 로우로 표현된 컬럼 값을 ,(콤마)로 데이터를 분리하여 여러개의 ROW로 표현해보겠다.



1.  , (콤마)로 구분되어 코드값을 여러개의 ROW로 추출하기


1
2
3
4
     WITH LIST_TXT AS (SELECT '02,031,032' LIST_COL FROM DUAL)
   SELECT TRIM(REGEXP_SUBSTR(LIST_COL,'[^,]+',1,LEVEL)) AS  LIST_TO_ROW
     FROM LIST_TXT
CONNECT BY INSTR(LIST_COL, ',' , 1, LEVEL - 1 ) > 0
cs

 

1
2
3
    SELECT TRIM(REGEXP_SUBSTR('02,031,032','[^,]+',1,LEVEL)) AS  LIST_TO_ROW
      FROM DUAL
 CONNECT BY INSTR('02,031,032'','1, LEVEL-1 ) > 0
cs


[결과]


1
2
3
4
5
6
7
8
│  LIST_TO_ROW  │
│───────────────│
│     02    │
├───────────────┤
│     031    │
├───────────────┤
│     032    │
└───────────────┘
cs




이렇게 사용하면 여러개의 테이블에 필요한 데이터를 추출하고 싶을때 SUBQUERY를 사용하여 뽑아낼수 있다.


2. 응용하기 ( 데이터 리스트를 row로 표현하여 해당 데이터만 뽑아내기 )


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
    SELECT A.REGION
             , A.AREA_CODE
             , B.RESIDENCE_NAME
      FROM 
    (
        SELECT '000' AS P_CODE,'서울' AS REGION, '02' AREA_CODE FROM DUAL
        UNION ALL
        SELECT '000' AS P_CODE, '경기' AS REGION, '031' AREA_CODE FROM DUAL
        UNION ALL
        SELECT '000' AS P_CODE, '인천' AS REGION, '032' AREA_CODE FROM DUAL
        UNION ALL
        SELECT '000' AS P_CODE, '강원' AS REGION, '033' AREA_CODE FROM DUAL
        UNION ALL
        SELECT '000' AS P_CODE, '부산' AS REGION, '051' AREA_CODE FROM DUAL
    ) A
    INNER JOIN
    (
        SELECT '000' AS P_CODE, '조현영' AS RESIDENCE_NAME, '02,031,032' AS AREA_CODE_LIST FROM DUAL
    ) B
    ON A.P_CODE = B.P_CODE
    WHERE A.AREA_CODE IN(
        SELECT TRIM(REGEXP_SUBSTR(B.AREA_CODE_LIST,'[^,]+',1,LEVEL)) AS  LIST_TO_ROW
          FROM DUAL
     CONNECT BY INSTR(B.AREA_CODE_LIST, ','1, LEVEL-1 ) > 0
    )
cs


임시로 A, B 테이블 데이터를 정의하고 

A테이블에는 지역과 지역번호 데이터가 있고 

B테이블에는 지역번호 데이터가 ,(콤마)로 구분되어 여러개 들어가 있다.


[A 테이블]


1
2
3
4
5
6
P_CODE   REGION  AREA_CODE
 000   │ 서울   │   02    │
 000   │ 경기   │  031    │
 000   │ 인천   │  032    │
 000   │ 강원   │  033    │
 000   │ 부산   │  051    │
cs


[B 테이블]


1
2
P_CODE   RESIDENCE_NAME   AREA_CODE_LIST
 000   │    조현영        │   02,031,032  │
cs


A테이블과 B테이블을 조인하여

조현영의 지역번호에 해당하는 지역명을 추출하려면 REGEXP_SUBSTR 정규식을 사용해 

한 컬럼에 저장된 리스트를 여러개의 row로 변환하여

in 조건절 안에 해당하는 데이터만 추출할 수 있는 것을 확인할 수 있다.


[결과]


1
2
3
4
REGION    AREA_CODE   RESIDENCE_NAME
 서울   │    02     │     조현영     │
 경기   │    031    │     조현영     │
 인천   │    032    │     조현영     │
cs



1. linux에서 alias 명령어란?



보통 리눅스에서 서버를 켜고 끌때 tomcat 폴더의 bin 폴더 안 startup.sh, shupdown,sh로 켜고끈다면 

매번 그곳으로  디렉토리를 바꿔가며(cd) 찾아가 해당 쉘파일(sh)을 실행시키기 힘든 경우가 많다.


개발중이고 반영이 많이 필요한 리눅스에 설치된 서버라면 더욱 그럴것 이다.

alias를 사용하여 커스텀 네임을 지정해준다면 change directory 없이 자신이 필요한 명령어를 바로 실행시킬수 있다.


1
2
3
4
5
// 서버 시작
alias mystart='sudo /home/top/tomcat7.0.28/bin/startup.sh'
 
// 서버 중지
alias mystop='sudo /home/top/tomcat7.0.28/bin/shutdown.sh'
cs


간단하게 tomcat 서버의 시작, 중지 쉘파일을 바로 실행할 alias를 mystart, mystop 으로 만들었다.

mystart, mystop를 linux 커맨드창에 친다면 서버가 시작되고 중지되는 것을 확인 할 수 있다.


그리고 alias를 쳐보면 현재 정의된 alias 리스트가 나열된다.



하지만 alias를 정의하고 서버접속이 끊어지면 alias가 초기화되어 다시 접속 시 커스텀 alias를 사용할 수 없는 문제가 있다.




2. alias 초기화 되지 않고 모든 사용자가 사용할수 있게 변경하기



alias를 모든 사용자가 사용할 수 있게 정의해보겠다.


linux root 계정으로 접속해 etc 디렉토리 아래의 profile 파일을 연다.


1
2
cd /etc
vi ./profile
cs



맨 마지막 줄에 다음 명령어를 추가해주고 저장 후 재접속한다.


1
2
alias mystart='sudo /home/top/tomcat7.0.28/bin/startup.sh'
alias mystop='sudo /home/top/tomcat7.0.28/bin/shutdown.sh'
cs



이제 root나 다른 계정으로 접속해도 전역으로 정의한 alias를 사용할 수 있다.

개발 소스 반영 및 재배포 시 손쉽게 서버를 켜고 끌수 있게 되었다.


1. project sdk is not defined intellij


자바에 경우 프로젝트에 적용한 JDK 버전 설정


메인메뉴 > select File | Project Structure

(Ctrl+Shift+Alt+S)


Project SDK(ex: java 12) 잡아준다.


(https://www.jetbrains.com/help/idea/sdk.html)



2. Cannot run git file not found git.exe


Git 설치 안되어있을때 발생


VSC  | CheckOut from Version Control | Git | Clone Repository | Test


Git 다운로드 하고 Intellij 재시작한다.


(https://git-scm.com/download/win)



3. IntelliJ IDEA to show folders instead of packages in project view


왼쪽 프로젝트 디렉토리에서 패키지 구조로 프로젝트가 보여지는 것 > 폴더 형식으로 보이게 하기

 

For expanding folders uncheck Compact Empty Middle Packages


왼쪽 프로젝트 디렉토리 > 톱니바퀴 > [Compact Empty Middle Packages 체크 해제]


(https://stackoverflow.com/questions/10412473/intellij-idea-folders-instead-of-packages-in-project-view)



4. build.gradle 


build.gradle 파일을 Import Gradle Project 해주고

파일이 수정되면 dependencies의 Run 'build' 를 다시 해줘야 한다.



5. Enable annotation processing


lombok과 같은 플러그인 설치 후 

해당 플러그인에서 사용하는 어노테이션 적용 시 어노테이션이 잘 적용되도록 설정해야 한다.


Build, Execution, Deployment | Compiler | Annotation Processors | Enable annotation processiong 체크



6. intelliJ multiple window


eclipse처럼 다중 프로젝트를 추가하고 싶을때 


https://stackoverflow.com/questions/8774024/intellij-working-on-multiple-projects

+ Recent posts