보통 Gmail과 같은 경우는 모바일 폰에서 Push 알림을 주기 때문에 새로운 메일을 받았을 때 사용자가 인지할 수 있다.

하지만 Push 서비스를 제공하지 않는 경우에는 매번 로그인해서 확인할 수 밖에 없다.

이를 위해서 새로운 메일이 왔을 때, MS Office의 Outlook에서 Telegram Bot을 활용해 알림을 보내는 방법을 구성해봤다.


* Outlook은 2016 버전을 기준으로 만들었으며, 2013 버전에도 동작함을 확인했다.

* Outlook에서는 "규칙" 이라는 기능을 제공하는데, 2016버전에서는 규칙에서 스크립트를 사용할 수 없다. Window의 registy를 수정해야 한다.

* 수정 방법은 https://www.slipstick.com/outlook/rules/outlook-2016-run-a-script-rules/  을 참조하거나,  EnableUnsafeClientMailRules.zip  파일을 다운로드 받으면 된다. (출처 : https://onedrive.live.com/?id=6117FC33D161D286%2189288&cid=6117FC33D161D286 )

* 사전에 Telegram Bot을 생성해야 한다. Bot 생성 방법은 http://krksap.tistory.com/836 에 상세하게 나와 있다.



1. Outlook에서 개발 도구 활성화하기 및 매크로 실행 설정


 

파일 - 옵션 - 리본 사용자 지정 - 개발도구 체크

 

 

 

 

파일 - 옵션 - 보안센터 - 보안센터 설정 - 매크로 설정 - 모든 매크로 실행 체크

 

 

 

 

파일 - 옵션 - 추가 기능 - Microsoft VBA for Outlook Addin 항목을 "COM 추가기능" 으로 이동

 

2. Outlook 개발 도구에서 VBA 스크립트 추가

개발 도구 - Visual Basic - Project1 - Microsoft Outlook 개체 - ThisOutlookSession 에 아래 코드 추가

 

 

*제목과 본문을 표시하되, 본문은 100자까지만 표시하도록 했다 ( Left(body, 100)  에 해당 ).

* 미리 받아뒀던  HTTP API는 bot으로 시작하며 ( : 을 포함하는), chatID는 숫자로 이루어져 있다. 아래와 같이 입력하면 된다.

 

 

 

 

3. Outlook 규칙 만들기

 

 

 

홈 - 규칙 - 규칙 만들기 - 고급옵션 클릭

* 메시지 수신시 받는 사람의 조건(좌)을 선택한 후, 이벤트 발생시 실행할 동작(우)를 선택하여 2번에서 등록한 스크립트를 등록한다

 

 

4. 새로운 메일 수신시 Telegram 알림 수신

 

 

* AlertTele는 내가 설정한 Telegram Bot의 이름이다. 2번의 스크립트에서 제목과 본문의 순서 등을 수정할 수 있다.


예전에는 Spring 프로젝트 시작하기에 설정이 반이라고 했다.

프레임웍 자체는 잘 되어 있지만, 버전 업그레이드를 하기 위해서 할 것이 많고, 기타 플러그인 설정하기가 힘들었기 때문이다.


하지만 혼자서 웹 프로젝트를 만들어보려 하니, 매우 쉬운 방법으로 Spring 프로젝트를 만들 수 있었다.

우선 많이 사용되는 Maven은 잘 알려져 있지만, pom.xml 파일이 너무 복잡하다는 사소한 단점이 있어서 이번에는 Gradle으로 Build 환경을 구축하기로 했다. 이 모든 것은 https://start.spring.io/ 에서 쉽게 프로젝트를 만들 수 있다.

기본적인 JDBC Driver로부터 mybatis와 같은 plugin도 한줄이면 프로젝트에 넣을 수 있다.

 


 

우선 이클립스는 설치했다는 가정 하에서 캡쳐 위주로 설명하겠다.

 

1. 이클립스 MarketPlace에서 BuildShip 설치

 -기존의 Gradle 플러그인 (Gradle IDE Pack)은 더이상 지원하지 않는다고 한다. 별 차이는 없겠지만, 권장하는 Buildship을 사용한다.


 


2. (선택) 이클립스 MarketPlace에서 SpringIDE 설치

 -기존 Spring에는 이클립스에 Tomcat 서버를 추가해서 Add/Remove 한 다음 서버를 구동했다. 하지만 이러한 수고를 줄이기 위해서 Springboot은 자체적으로 WAS를 가지고 있다 (Tomcat로 알고 있음). 이를 원활하게 사용하기 위해서는 Spring IDE 설치도 좋다.

 -설정을 변경해서 기존에 사용하던 Tomcat에서 구동할 수도 있다.

 

 

 

3. https://start.spring.io/ 에서 프로젝트 생성하기

 -앞에서 말한 바와 같이, 웹에서 클릭 몇번으로 꽤 많은 설정이 된 패키지 파일을 다운로드 받을 수 있다.

 

 

4. 다운로드 한 프로젝트 파일을 Import 한다

 -여기서부터는 기존 방식과 유사하다. Existing Gradle Project 로 프로젝트를 import 한다.

 

 

 

 

5. (2번을 사용한 경우) 내장 WAS를 사용해 즉시 프로젝트를 띄울 수 있다.

 -Boot Dashboard에서 start 버튼 클릭으로 기동이 가능하며, 포트는 src/main/resources 폴더의 application.properties 파일에서 server.port=8888 으로 포트를 지정해서 기동할 수 있다.

 

 

 

6. Gradle로 Build하기

 - 외부 WAS에서 기동하기 위해서는 jar 또는 war 파일로 export해야한다. Buildship에서는 UI로 쉽게 Build할 수 있도록 제공해준다.

 - Build한 파일은 build/libs 폴더에 생성된다.

 

 

 

 


 


서버는 한 대이고, 돌려야 할 웹 서비스들은 여러개인 상태에서 어플리케이션들은 다른 JDK 기반으로 개발되었다면..?


해답은 쉽지 않을 것이다.

다른 어플리케이션들의 JDK 버전을 올려 통일시키거나, 아니면 서버를 여러 개로 변경하거나.


이런 상황을 맞지 않기 위해서 Tomcat 기동시, JDK를 수동으로 지정할 수 있도록 하는 방안을 소개한다.

스포일러 하자면, Tomcat 실행 파일에 JAVA_HOME을 명시하는 것이다.


1. 준비

1-1 Portable JDK는 이전 포스트인 "Portable JDK 생성하기"를 참조하여 생성한다.

1-2 Tomcat8 파일을 다운로드 한다. ( http://tomcat.apache.org/download-80.cgi  /  64-bit Windows zip )

*Zip 파일을 선택한 이유는, 여러개의 WAS를 실행할 때를 대비해, 설치 경로를 직접 설정하기 위함이다.


2. Service.bat 수정

2-1 사용할 폴더에 Tomcat8을 압축 해제하고, bin 폴더의 service.bat 파일을 수정한다. 

2-2 주석처리 된 경로 아래 setlocal 이라는 문구가 보인다. set "SELF ~~  문구 사이에 아래와 같이 Portable JDK 경로를 입력한다

* 예시로 D:\tomcatDir\service1\13_jdk-8u65 의 위치로 가정함




3. Tomcat8 Service 등록


3-1 마지막으로, 아래와 같은 명령어로 Tomcat을 Window 서비스에 등록하면 된다.

      * 예시로 D:\tomcatDir\service1\bin 폴더에 service.bat 파일이 있다고 가정함

* 서비스로 등록해본 사람은 알겠지만, service는 service.bat 파일을 지칭하며, tomcat8Portable은 Window 서비스에 등록될 서비스 명이다. 목적에 맞게 변경해서 등록/관리하면 된다.





4. 기타

* 서비스로 등록하기 위해서 service.bat 파일을 수정했다. 하지만, startup.bat 파일을 통해서도 당연히 실행이 가능하다.

* startup.bat 파일에도 당연히 같은 위치에 JAVA_HOME을 지정하면 된다.


Java를 사용하는 프로그램/어플리케이션을 사용할 때, 블로그를 검색하면 항상 JAVA_HOME부터 설정한다.

그런데, Java를 별도로 설치하고 싶지 않거나 각각 다른 버전의 Java를 설치하고 싶다면?



해답은 Java를 Portable로 각각 사용하면 된다.

Portable JDK / JRE 를 사용하는 방법은 3가지가 있다.


1. 인터넷에서 Portable으로 만들어진 파일 다운로드

- 가장 손쉬운 방법이다. 하지만 어떤 파일일지 신뢰가 가지 않는다. 혹시 바이러스라도 있으면...?


2. OpenJDK Portable 다운로드

- https://sourceforge.net/projects/openjdkportable/

- OpenJDK 의 Portable 버전을 다운받는다. 하지만 Oracle의 '순수한' Java를 보통 사용하기 때문에, OpenJDK는 생소할 수 있다.

- 사용상 크게 차이는 없겠지만, 만약 조금의 차이라도 있어서 어플리케이션이 동작하지 않는 것을 찾기 힘들지도...


3. Oracle의 JDK을 다운로드 받아 직접 만들기


1번과 2번은 모두 큰 이슈 없이 사용 가능하다.

하지만 3번의 JDK를 직접 만드는 방법은 생각보다 매우 쉽기 때문에, 굳이 1번과 2번을 선택하지 않아도 될 정도이다.



Portable JDK를 만들기 위한 방법이다.

- 사용한 JDK는 8u65 버전이며, 64bit Window Binary이다.

- 코드계의 구글인 stackoverflow에서 참조한 방법이다. 


1. JDK 다운로드

1.1 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html  에 접속한다.

1.2 jdk-8u65-windows-x64 을 다운로드 받는다.


2. 다운로드 받은 파일(jdk-8u65-windows-x64)을 압축 해제한다 (7-zip 등 사용)





3. 압축 해제한 jdk-8u65-windows-x64 폴더에 들어가 tool.zip 파일을 한 번 더 압축 해제한다


4. 해당 위치에서 CMD 창을 오픈한다

4.1 폴더에서 Shift + 마우스 우클릭 하면 아래 사진과 같이 "여기서 명령창 열기"를 선택할 수 있다.





5. 명령창에서 아래 커맨드를 복사하여 붙여넣고, 실행한다.

     for /r %x in (*.pack) do .\bin\unpack200 -r "%x" "%~dx%~px%~nx.jar"






위 작업이 완료되었으면, 이제 tools 폴더는 JDK 8의 Portable 파일이 생성된 것이다.

이 폴더의 경로를 각 프로그램별로 JAVA_HOME으로 설정하면 된다.


Tomcat에서 JAVA_HOME 으로 설정하는 것은 다음 포스트에서 다루기로 하겠다.





덧1. 보통 Java 설치 후, Update가 되지 않도록 설정을 변경한다. 하지만 Portable 버전이면 업데이트 자체가 무의미하기 때문에, 유지보수 측면에서 더 좋다고 볼 수 있다.

덧2. Java 업데이트를 비활성화하는 이유는, Java 업데이트창이 실행되면서 Java 전체가 먹통이 되는 경우가 있기 때문이다. 또는 강제로 업데이트가 되는 경우도 있기 때문에, 갑자기 Java 버전이 달라지기도 한다.

덧3. 하지만 보안 이슈로 인해서 Java 버전을 최대한 높여 놓는 것을 권고한다.

덧4. JDK8의 버전을 jdk-8u65 으로 한 이유는, 그 이상의 버전에서는 압축을 해제해도 tools.zip 파일이 생성되지 않기 때문이다.

Java에는 FileWriter, Python에서는 내장 함수 등과 같은 방법들을 통해서 물리적인 파일을 생성한다.

각각의 언어에서 기본으로 지원하는 것이 파일 생성인데, MariaDB에서도 당연히 파일 생성을 지원한다.
지금 소개하는 것은 MariaDB에서 쿼리문을 실행하여 txt 파일을 생성하는 것이다.

파일 생성은 다른 언어를 통해서도 가능하지만, 이전 포스트들과 마찬가지로 타 시스템과의 느슨한 연결(낮은 의존도)를 위한 것들이었기 때문에 자체적으로 파일을 생성하는 방법을 소개한다.

우선, table_name 에 select 결과 대상이 될 테이블을 입력하고, Where 조건에 의도하는 정보를 입력한다.
예제에서 입력한 조건은, col_name 컬럼이 John 이라는 단어를 포함하며, col_name의 길이가 10보다 작거나 같은 조건의 모든 컬럼이다.

각 컬럼들은 ,  으로 구분되며, 각 행들은 /n (줄바꿈) 으로 구분되게 파일 생성 조건이 정의되어 있다.
이 값들은 파일을 읽어들이는 시스템에서 정의된 구분자로 대체하면 된다.




이러한 기능은 주기적으로 조건에 맞는 파일을 생성해야 하는 로그성 작업 또는 백업 파일 생성에 적합하다.

해당 쿼리를 Stored Procedure으로 만들고, 이 SP를 Event Scheduler에 등록하여 주기적으로 작동하게 되면 간단한 로그/백업 파일이 되는 것이다.

물론 더 많은 기능을 사용하려면 별도의 언어를 사용하여 동작시키는 방법이 있겠으나, 처음에 의도한 바와 같이 또하나의 관리 포인트가 생기는 것에 대해 고려를 해야 한다.


주기적으로 서버에서 어떤 작업을 해야할 때, 서버에서는 Cron / Batch / Event 등을 통하여 주기적인 작업을 진행한다.


DB에서도 주기적으로 작업을 해줘야 하는 것이 있다.

대표적인 것으로는 특정 Event에 따라 별도의 테이블에 데이터를 자동적으로 이관한다거나, 자동으로 데이터 백업을 해야 하는 것 등이 있을 것이다.

Trigger과 같은 기능을 사용해도 유사한 기능을 수행할 수 있으나, Trigger는 어떠한 이벤트가 발생했을 때 사용되는 것이기 때문에, 주기적인 작업에는 적합하지 않다고 볼 수 있다.


또한, DB를 사용하는 서버(Application)에서 주기적으로 쿼리를 DB로 요청할 수도 있다.

하지만 이 경우에는 Application이 비정상 작동 또는 장애가 발생했을 경우가 있을 수 있으므로, 장애 포인트가 하나 늘어난다고 볼 수 있다.

(물론 과거에 MySQL, MariaDB의 Event Scheduler의 성능이 떨어진다는 이야기도 있었으나, 최근에는 많이 개선되었다고 하고, 시스템별로 느슨한 연결을 하기 위하여 DB의 Event Scheduler 사용도 필요하다.)



Event Scheduler 사용 설정

우선, MariaDB에서 별도로 설정하지 않았다면, Event 옵션은 Off 상태이다.

이를 활성화시키기 위해서 두가지 방법 중 하나를 선택하면 된다.


1. Option 변경


2. my.ini  (Linux에서는 my.cnf ) 에 설정 추가


  event_scheduler = ON  


*1번의 경우에는 Event Scheduler 사용을 위해 재시작이 필요없지만, 다음 재시작 때에는 Event Scheduler가 설정값을 따른다 (기본은 Off)

*2번의 경우에는 재시작을 해야만 설정에 추가되며, 한번 재시작 하고 난 다음에는 시작마다 설정이 On 되어 있다.



Event Scheduler 설정 확인


Event Scheduler 등록

Event Scheduler 등록하는 쿼리이다.
동작 주기는 Month, Hour, Minute, Second 등으로 다양하다.
너무 자주 동작하면 DB 성능에 무리가 갈 수도 있으나, 또 너무 긴 기간으로 설정하면 한번의 쿼리에 많은 시간이 필요한 Trade-Off가 있을 수 있다.
아래 Event에서는 SP를 호출하도록 했다.
(Raw 쿼리문을 입력하는 것보다, SP를 호출하게 하는 것이 유지보수상으로 더 좋다)




Event Scheduler 관리


보통의 데이터들은 하나의 테이블에 넣어두고, join등을 통해 Query 한다.
하지만 하나의 테이블에 수십만건 이상의 데이터가 쌓이면 성능상/유지보수상의 문제가 생긴다.
특히 로그를 쌓거나 이력 관리하는 DB는 일정 주기로 테이블을 생성하여 백업한다.

아래 쿼리는 월 주기로 테이블을 생성하고, 일정 주기가 지나면 테이블을 drop 하는 SP이다.
아무래도 현행법상 개인정보 등을 이유로 로그 보존 기간이 있으므로, 해당하는 기준에 맞게 자료를 삭제하면 된다.

그리고, 매번 수동으로 SP를 호출하기 힘들기 때문에, MariaDB에서 제공하는 EVENT SCHEDULER 기능을 사용하면, 주기적으로 실행할 수 있다.



이전 포스트에서는 MariaDB를 활용한 암호화 하는 방법을 소개했다.


이렇게 생성된 패스워드를 사용하는 방법 중, 시스템 간에 API호출할 때 패스키로 사용할 수 있다.

다시 말해서 파라미터를 전달할 때, 암호화된 키를 같이 전달함으로써 상호간에 인증된 시스템이라는 것을 확인할 수 있다.


단방향 암호화인 경우에는 단순히 해시값을 비교할 수도 있으며,

양방향 암호화인 경우에는 사전에 약속된 암호화Key를 사용하여 복호화하고, 비교해볼 수 있다.


위 두가지 케이스에 대해서 보통은 API를 만들고, 그것을 호출해서 사용한다.

하지만 API를 사용하기 힘든 환경이거나 굳이 API를 위해서 별도의 서비스가 부담스러울 경우에는 DB에서 SP (Stored Procedure)를 호출하여 사용할 수 있다.


Input값에는 암호화에 사용되었던 Parameter들과 암호화된 String이 대입된다.

Output은 암호가 맞는지 틀린지에 대한 Boolean 값이 리턴되며, false는 0으로, true는 1로 표시된다.


아래 예시는 3개의 Parameter를 사용한 MD5 암호화이며, 내부 로직만 바꾸면 다른 암호화로 대체할 수 있다.


3개의 파라미터를 사용하는 SP 생성문



SP 호출 예제 




회사에서 보안이라고 하면 가장 기본적인 것이 데이터 암호화라고 할 수 있다.

이 암호화라는 것이 사용 목적에 따라 다른 방법을 사용해야 한다.


암호화를 크게 구분하자면, 복호화가 가능한지의 여부에 달라진다.

다시 말해서, 암호를 만들었는데, 이를 다시 평문으로 되돌릴 수 있는지에 다르다.

주로 패스워드는 단방향 암호화를 사용한다.

중요하지 않은 정보들은 암호화 하지 않는 경우가 많고, 보안적으로 껄끄럽거나 중요한 정보(개인정보 등)은 양방향 암호화를 한다.

물론, 복호화가 불가능한 알고리즘이라고 하더라도, 알고리즘별로 보안적 이슈가 존재한다.


단순히 생각해서, 모든 암호화 알고리즘을 강력한 것으로 사용하면 좋을까?

당연히 보안성 측면에서는 좋다. 하지만, 실용성에서는 큰 무리가 따른다.

예를 들어, 실시간성이 보장되어야 하며, 높은 TPS (Transaction Per Second)가 요구되는 시스템에서는 강력한 알고리즘을 사용하기에는 큰 비용이 요구된다.

따라서 보안 레벨과 실용성에 맞는 적절한 암호화 적용이 필요하다.



암호화를 실제로 사용하기 위해서는

1. DBMS에서 제공하는 알고리즘 사용

2. (Application 또는 Server Side에서) Library 사용

3. 직접 구현 (올ㅋ)

의 방법이 있을 것이다.


상황별로 차이가 있겠지만, 

1번의 경우에는 데이터 저장,

2번의 경우에는 네트웍 구간에서의 적용이 주된 목적일 것이다.



앞 이야기가 길었는데, 제목과 같이 1번에 해당하는 암호화 방식을 '간단한' 방식으로 소개한다.



1. MD5


허무할 정도로 간단하다.

다음 것도 그렇다.


2. SHA2

SHA256


SHA 512


3. AES128

MariaDB에서는 기본적으로 AES128 암호화 방식을 지원한다. Rijndael 이라는 수학자가 제시한 알고리즘을 사용하고 있으므로, Rijndael의 이름을 가진 라이브러리를 사용하는 경우가 많다.

AES도 두가지 종류가 있는데, ECB와 CBC 방식이다.

CBC 방식은 IV (initialization vector)라는 값을 사용한다는 차이가 있다.

(MariaDB에서 제공하는 방식은 ECB 이다.)

앞의 두가지 방식은 단방향 암호화이며, AES128은 양방향 (복호화가 가능한) 암호화이다.


앞에 입력한 것이 암/복호화 대상 String 이며, 뒤에 있는것이 암/복호화에 사용되는 Key 이다. (Key는 보관을 잘 해야겠지)

-암호화

-복호화




최근 살이 너무 많이 쪄서, 운동을 해야겠다고 생각을 했다.

하지만 퇴근하면 8~9시가 되고, 조금만 밍기적 거리면 잘 시간이 되어 운동할 시간이 없었다.


운동을 찾아보니 Plank 운동이라고, 하루에 몇분만 투자하면 살이 쏙 빠진다는 홈쇼핑적 글들을 많이 보았다.

내가 해야 할 운동이다 생각하고 실제로 좀 따라해봤다.



.... 생각보다 너무 힘들었다.

 포기할까 싶었는데, 조금씩 시간을 나눠서 횟수와 시간을 늘려나가면 된다는 말에 운동 방법을 그렇게 해보기로 했다.


하지만, 항상 공부하기 전에는 책상 정리를 하듯이, 나에게 맞는 앱을 검색해도 너무 많은 기능들이 있길래 그냥 내가 만들기로 했다.

가장 쉽고 빠르게 만들 수 있는 것은 당연히 웹이고, 그걸 더 빠르게 만들기 위해서 Bootstrap을 활용해서 UI를 구성했다.


우선 Plank운동의 횟수와 각각의 lab time을 체크하기로 했다.

Start 버튼과 Pause 버튼은 toggle이 되어야 하고, Reset 버튼도 추가했다.


각각의 기록들은 누적되어 쌓이고, 개별 item별로 삭제도 가능하여야 한다.

이러한 기준으로 HTML, JS, CSS 파일 3개로 구성했으며, 소스는 아래와 같다.

Bootstrap을 사용해보는 것이 목적이었기 때문에, JS는 웹에서 검색하여 여러가지 중, 적당한 것으로 사용했다.





plankRecord.html

 -주석 처리한 부분은 나중에 추가로 개발할 수도 있어서 UI만 추가했었던 부분이다.

 -사용자 로그인, 그리고 데이터 저장을 위한 부분이다. (나중에 책상정리가 더 필요하면 개발 예정)




stopwatch.js
 -해당 소스는 http://jsfiddle.net/rdesai/8qmyg/15/ 에서 참조하였으며, 일정 부분 수정하였음




custom.css






전체 소스 : 

plankRecord.zip




+ Recent posts