데브옵스(DEVOPS)란

Posted by HULIA(휴리아)
2018. 4. 3. 10:32 뒷이야기들/스터디히스토리강의
AWS사이트에 발췌

데브옵스는
애플리케이션과 서비스를 빠른 속도로 제공할 수 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합입니다

데브옵스의 이점
-속도
작업속도가 빨리지므로, 고객을 위해 더 빠르게 혁신하고, 시장 변화에 더 잘 적응하고, 좀 더 효율적으로 비즈니스 성과를 창출가능
예)마이크로 서비스 & 지속적 전달
-신속한 제공
릴리즈의 빈도와 속도를 개선하여 제품을 더 빠르게 혁신하고 향상가능. 새로운 기능의 릴리즈와 버그 수정속도가 빨라질수록 고객의 요구에 더 빠르게 대응하여 경쟁우위를 강화가능
예)지속적 통합 & 지속적 전달
-안정성
최종 사용자에게 지속적으로 긍정적인 경험을 제공하는 한편 더욱 빠르게 안정적으로 제공할 수 있도록, 애플리케이션 업데이트와 인프라 변경의 품질을 보장합니다.
예)지속적 통합 & 지속적 전달 & 모니터링과 로깅
-확장가능
규모에 따라 인프라와 개발프로세스를 운영 및 관리
자동화와 일관성이 지원되므로 위험을 줄이면서 복잡한 시스템 또는 변화하는 시스템을 효율적으로 관리가능
예)코드형 인프라
-협업강화
주인 의식과 책임 같은 가치를 강조하는 데브옵스 문화 모델에서 좀 더 효과적인 팀을 구축
개발자와 운영 팀은 긴밀하게 협력하고 많은 책임을 공유하며 워크플로를 결합
이를 통해 비효율성을 줄이고 시간을 절약
-보안
제어를 유지하고 규정을 준수하면서 신속하게 진행가능
자동화된 규정준수정책, 세분화된 제어 및 구성 관리 기술을 사용함으로써 보안을 그대로 유지하면서 데브옵스 모델을 도입가능


데브옵스 문화 철학
데브옵스로 전환하기 위해서는 문화와 사고방식으 변화가 필요
간단하게 말하면 데브옵스는 개발과 운영이라는 두 팀 간의 장벽을 허무는 일


데브옵스 방식
조직이 소프트웨어 개발과 인프라 관리 프로세스의 자동화 및 간소화를 통해 더 빠르게 혁신할 수 있도록 지원하는 몇가지 주요 방식이 있습니다.

기본방식 중 하나는 소규모 업데이트를 자주 수행
소규모로 자주 업데이트하면 각 배포의 위험을 줄어듭니다. 팀에서 오류의 원인이 되는 최근 배포를 확인할 수 있으므로 더 빠르게 버그를 해결할 수 있습니다. 업데이트 소요 시간과 규모는 다르지만, 데브옵스 모델을 사용하는 조직은 기본 소프트웨어 개발 방식을 사용하는 조직보다 훨씬 더 자주 업데이트를 배포합니다.

조직은 마이크로 서비스 아키텍쳐를 사용하여 애플리케이션의 유연성과 혁신의 속도를 높일 수 있습니다.
마이크로 서비스 아키텍쳐는 복잡한 대규모 시스템을 간단하고 독립적인 프로젝트로 결합 해제합니다
애플리케이션은 많은 개별 구성 요소(서비스)로 분할되며, 각 서비스는 단일 목적 또는 기능으로 한정되고 피어 서비스 및 전체 애플리케이션과 별개로 운영됩니다.
이 아키텍쳐는 애플리케이션 업데이트를 위한 조정 오버헤드를 줄이고, 각 서비스가  이를 담당하는 작고 민첩한 팀과 연결되면 조직이 좀 더 신속하게 움직일 수 있습니다.

하지만 마이크로 서비스와 릴리스 빈도 증가의 조합은 배포수를 현저히 늘려 운영 문제로 이어질 수 있습니다. 따라서 지속적 통합 및 지속적 전달과 같은 데브옵스 방식을 사용하면 이러한 문제를 해결하고 조직이 안전하고 안정적인 방식으로 신속하게 업데이트를 제공가능
코드형 인프라 및 구성 관리와 같은 인프라 자동화 방식은 잦은 변경에 대해 컴퓨팅 리소스를 탄력적이고 대응적으로 유지하는데 도움이 됩니다. 또한 모니터링과 로깅의 사용도 엔지니어가 애플리케이션 및 인프라 성능을 추적하여 문제에 신속하게 대응할 수 있게 하는데 도움이 됩니다.

-지속적통합
자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경 사항을 중앙 리포지토리에 정기적으로 병합하는 소프트웨어 개발방식
지속적 통합의 핵심 목표는 버그를 신속하게 찾아 해결하고, 소프트웨어 품질을 개선하고, 새로운 소프트웨어 업데이트를 검증 및 릴리즈하는데 걸리는 시간을 단축하는 것

-지속적 전달
코드 변경이 프로덕션에 릴리즈할 수 있도록 자동으로 빌드, 테스트 및 준비되는 소프트웨어 개발 방식입니다.
빌드 단계이후의 모든 코드 변경 사항을 테스트 환경 및/또는 프로덕션 환경에 배포함으로써 지속적 통합을 확장합니다.
지속적 전달이 적절하게 구현되면, 개발자는 언제나 즉시 배포할 수 있고 표준화된 테스트 프로세스를 통과한 빌드 아티팩트를 보유하게 됩니다.

-마이크로 서비스 아키텍쳐
단일 애플리케이션을 작은 서비스의 집합으로 구축하는 설계 방식입니다.
각 서비스는 자체 프로세스에서 실행되고, 주로 HTTP기반 API라는 간편한 매커니즘을 사용하는 잘 정의된 인터페이스를 통해 다른 서비스와 통신합니다
마이크로 서비스는 비즈니스 기능을 중심으로 구축되며, 각 서비스는 단일 목적으로 한정되어 있습니다. 다양한 프레임워크 또는 프로그래밍 언어를 사용하여 마이크로 서비스를 작성하고 이를 독립적으로 단일 서비스는 또는 서비스 그룹으로 배포할 수 있습니다

-코드형 인프라
버전관리 및 지속적 통합과 같은 코드와 소프트웨어 개발 기술을 사용하여 인프라를 프로비저닝하고 관리하는 방식입니다
클라우드의 API 중심 모델을 사용하면 개발자와 시스템 관리자가 수동으로 리소스를 설정 및 구성할 필요없이 프로그래밍 방식으로 대규모로 인프라와 상호작용할 수 있습니다. 따라서 엔지니어는 코드 기반 도구를 사용하여 인프라와 인터페이스하고, 애플리케이션 코드를 다루는 방법과 유사한 방식으로 인플라를 다룰 수 있습니다. 인프라가 코드를 통해 정의되므로, 인프라와 서버를 표준화된 패턴을 사용하여 배포하고 최신패치와 버전으로 업데이트 하거나, 반복 가능한 방식으로 복제할 수 있습니다.

        1)구성관리
         개발자와 시스템 관리자는 코드를 사용하여 운영체제를 자동화하고 구성, 운영 작업등을 호스팅합니다. 코드를 사용함으로써 구성 변경을 반복하고 표준화 할 수 있습니다.이에 따라 개발자와 시스템관리자가 운영체제, 시스템 어플리케이션 또는 서버 소프트웨어를 수동으로 구성할 필요가 없어집니다

        2)코드형 정책
         인프라와 인프라 구성이 클라우드로 체계화된 조직은 규정 준수를 규모에 따라 동적으로 모니터링하고 적용할 수 있습니다. 따라서 코드를 통해 설명된 인프라는 자동화된 방식으로 추적, 검증 및 재구성할 수 있습니다. 이는 조직이 손쉽게 리소스 변경을 관리하고 보안 조치가 분산 방식으로 적절하게 적용될 수 있게 해줍니다.


-모니터링 및 로깅
조직은 지표와 로그를 모니터링하여 애플리케이션 및 인프라 성능이 제품의 최종사용자 경험에 어떤 영향을 미치는지 확인합니다. 조직은 애플리케이션과 인프라에서 생성되는 데이터 및 로그를 캡쳐하고 분류한 다음 이를 분석함으로써, 변경 또는 업데이트가 사용자에게 어떤 영향을 주는지 이해하고, 문제의 근본 원인 또는 예상치 못한 변경에 때한 통찰력을 확보합니다. 서비스는 연중무휴 24시간 사용할 수 있어야 하고 애플리케이션 및 인프라 업데이트 빈도가 증가함에 따라 적극적인 모니터링이 점점 더 중요해지고 있습니다. 이러한 데이터에 대한 실시간 분석을 수행하거나 알림을 생성하는 것도 조직이 좀 더 능동적으로 서비스를 모니터링하는 데 도움이 됩니다

-커뮤니케이션 및 협업
조직에서 커뮤니케이션과 협업이 증가하는 것도 데브옵스의 주요 문화적 측면 중 하나입니다. 데브옵스 도구 및 소프트웨어 제공 프로세스를 자동화를 사용하면 개발 및 운영의 워크플로와 책임을 물리적으로 합침으로써 협업이 이루어집니다. 해당 팀에서는 이 위에 채팅 애플리케이션, 문제 또는 프로젝트 추적 시스템, wiki를 사용하여 커뮤니케이션을 지원하고 정보를 공유하는 강력한 문화적 표준을 확립합니다.
이를 통해 개발자와 운영 그리고 마케팅이나 영업과 같은 다른 팀간에도 커뮤니케이션이 활발해지면서 조직의 모든 부분에서 목표와 프로젝트에 좀 더 가깝게 다가갈 수 있습니다


개발자로써의 앞으로 준비해야 할 일
-다양한 프로그래밍 알아야 함
-마이크로 서비스(API) 알아두기
-지속적 전달 툴(젠킨스) 알아두기

앱)loggerutil 자바 common 코드

Posted by HULIA(휴리아)
2018. 4. 2. 15:29 백엔드개발/자바스프링
public static void debug(Logger logger, String msg, Object... params){
      if(logger.isDebugEnabled()){
            logger.debug(msg.params);
       }
}

public static void info(Logger logger, String msg, Object... params){
       if(logger.isInfoEnabled()){
             logger.info(msg, params);
       }
}

//같은 방식으로 warn, error추가하면 됨

앱)aesciperutil 자바 common 코드

Posted by HULIA(휴리아)
2018. 4. 2. 15:26 백엔드개발/자바스프링
static String key = "~~~~~~";


byte[] hexToByteArray(String hex){
       if( hex == null || hex.length() == 0){
     return null;
}

      byte[] ba = new byte[hex.length() / 2];
       for( int i =0 ; i<ba.length; i++){
            ba[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16);
       }
       return ba;
}


String byteArrayToHex(byte[] ba){
      if( ba == null || ba.length == 0){
          return null;
      }
    
       StringBuffer sb = new StringBuffer(ba.length*2);
        String hexNumber;

         for( int x = 0; x<ba.length; x++){
                hexNumber = "0" + Integer.toHexString(0xff & ba[x]);
                sb.append(hexNumber.substring(hexNumber.length() - 2);
          }
          return sb.toString();
}


String encrypt(String message){
        SecretKeySpec skeySpec = new SecretKeySpec(key.getByte(), "AES");

         Cipher cipher = Cipher.getInstance("AES");
          chpher.init(Cipher.ENCRYPT_MODE, skeySpec);
    
       byte[] encrypted = cipher.doFinal(message.getByte());
       return byteArrayToHex(encrypted);
}


String decrypt(String encrypted){
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
         
          Cipher cipher = Cipher.getInstance("AES");
          cipher.init(Cipher.DECRYPT_MODE, skeySpec);
          byte[] original = cipher.doFinal(hexToByteArray(encrypted));
          String originalString = new String(original);
          return originalString;
}


public static void main(String[] args){
        String enc = encrypt("~~~~~");
       

          String dec = decrypt("~~~~~");
}

앱)md5util 자바 common 코드

Posted by HULIA(휴리아)
2018. 4. 2. 15:25 백엔드개발/자바스프링
public static String getMD5Checksum(String filename){
        byte[] b  = createChecksum(fileaname);

         String result = "";
      
         for(int i=0; i<b.length; i++){
               result += Integer.toString((b[i] & 0xff) + 0x100, 16).subString(1);
         }
         return result;
}

private static byte[] createChecksum(String filename){
       InputStream fis = new FileInputStream(filename);
   
        byte[] buffer = new byte[1024];
        MessageDigest complete = MessageDigest.getInstance("MD5");

         int numRead;
         do{
               numRead = fis.read(buffer);
               if(numRead > 0){
                  complete.update(buffer, 0, numRead);
               }
           }while(numRead != -1);
        
            fis.close();
            return complete.digest();
}

Do it Vue.js 입문 정리2

Posted by HULIA(휴리아)
2018. 4. 1. 22:58 프론트엔드/자바스크립트

Vue 인스턴스

:Vue로 화면을 개발하기 위해 필수적으로 생성해야 하는 기본 단위


ex)Vue 인스턴스 예시

 new Vue({

       

      });


Vue 인스턴스 옵션 속성

-data

-el

-template(화면에서 표시할 HTML, CSS 등의 마크업 요소를 정의하는 속성. Vue의 데이터 및 기타 속성들도 함께 화면에 그릴 수 있음)

-methods(화면 로직 제어와 관계된 메소드를 정의하는 속성. 마우스 클릭 이벤트 처리와 같이 화면의 전반적인 이벤트와 화면동작과 관련된 로직을 추가할 수 있음)

-created(vue instance가 생성되자마자 실행할 로직을 정의할 수 있는 속성)


Vue 인스턴스의 유효범위

Vue 인스턴스를 생성하면 HTML의 특정 범위 안에서만 옵션 속성이 적용되어 나타남

인스턴스의 유효범위는 el 속성과 밀접한 관계가 있음



Vue 인스턴스 라이프 사이클

-생성

-화면에 부착

-내용 갱신

-소멸


<<<<<<<<<사진>>>>>>>>>>>>>






Vue 컴포넌트

:조합하여 화면을 구성할수 있는 블록(화면의 특정 영역)을 의미

컴포넌트를 활용하면 화면을 빠르게 구조화하여 일괄적인 패턴으로 개발 가능


Vue에서는 웹 화면을 구성할 때 흔히 사용하는 내비게이션 바, 테이블, 리스트, 인풋 박스 등과 같은 화면 구성 요스들을 잘게 쪼개어 컴포넌트로 관리합니다


ex) 웹 화면 예시

Header

Content -> Aside, List

Footer


컴포넌트 등록 방식

-전역

-지역


전역 컴포넌트 등록

Vue.component('컴포넌트이름',{

  //컴포넌트 내용

  //template

  //data

  //methods

});


컴포넌트이름은 케밥기법(변수가 단어의 조합으로 이루어져있을때, 단어와 단어 사이를 -로 잇는 변수 명명방식)으로 하게되며 

컴포넌트 이름은 template속성에서 사용한 HTML 사용자 정의 태그 이름을 의미함


ex)

Vue.component('my-component', {

        template: '<div>전역 컴포넌트가 등록되었습니다!</div>'

      });



지역 컴포넌트 등록

new Vue({        

        components: {

          '컴포넌트이름': 컴포넌트 내용

        }

      });


컴포넌트 이름은 전역 컴포넌트와 마찬가지로 HTML에 등록하 사용자 정의 태그를 의미하고,

컴포넌트 내용은 컴포넌트 태그가 실제 화면 요소로 변환될 때의 내용을 의미합니다


ex)

new Vue({

        el: '#app',

        components: {

          'my-local-component': cmp

        }

      });




Vue 컴포넌트 통신

컴포넌트는 각각 고유한 유효 범위를 가지고 있기 때문에 직접 다른 컴포넌트의 값을 참조할 수 없음

따라서 Vue 프레임워크 자체에서 정의한 컴포넌트 데이터전달 방법을 따라야 함


상위 하위는 트리구조임


상위 컴포넌트->하위 컴포넌트 : props로 전달

하위 컴포넌트->상위 컴포넌트 : 이벤트 발생

이벤트 발생후 이벤트 수신을 하는 개념을 이용한다

//이벤트 발생 

this.$emit('이벤트명');

//이벤트 수신

<child-component v-on:이벤트명="상위 컴포넌트의 메소드 명"></child-component>



ex)상위컴포넌트가 하위컴포넌트로 보낼때 

   <div id="app">

      <!-- 팁 : 오른쪽에서 왼쪽으로 속성을 읽으면 더 수월합니다. -->

      <child-component v-bind:propsdata="message"></child-component>

    </div>


상위 컴포넌트는 div태그

하위 컴포넌트는 child-component임


    Vue.component('child-component', {

        props: ['propsdata'],

        template: '<p>{{ propsdata }}</p>',

      });


      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue! passed from Parent Component'

        }

      });



ex)하위컴포넌트가 상위 컴포넌트로 이벤트 발생후 수신되는 될때

    <div id="app">

      <child-component v-on:show-log="printText"></child-component>

    </div>


     Vue.component('child-component', {

        template: '<button v-on:click="showLog">show</button>',

        methods: {

          showLog: function() {

            this.$emit('show-log');

          }

        }

      });


      new Vue({

        el: '#app',

        data: {

          message: 'Hello Vue! passed from Parent Component'

        },

        methods: {

          printText: function() {

            console.log("received an event");

          }

        }

      });



관계없는 컴포넌트 간 통신 - 이벤트 버스

컴포넌트 통신은 항상 상위-하위 구조를 유지해야만 데이터를 주고 받을 수 있었지만 이벤트 버스는 상위 하위 구조를 가지지 않고도 데이터를 한 컴포넌트에서 다른 컴포넌트로 전달할 수 있음



이벤트 버스 형식

//이벤트 버스를 위한 추가 인스턴스 1개 생성

var eventBus = new Vue();


//이벤트를 보내는 컴포넌트

methods:{

        메소드명 : function(){

                eventBus.$emit('이벤트명',데이터);

         }

}


//이벤트를 받는 컴포넌트

methods:{

    created: function(){

           eventBus.$on('이벤트명', function(데이터){

                        내용들

           });

     }

}



ex)

    <div id="app">

      <child-component></child-component>

    </div>



  var eventBus = new Vue();

      Vue.component('child-component', {

        template: '<div>하위 컴포넌트 영역입니다.<button v-on:click="showLog">show</button></div>',

        methods: {

          showLog: function() {

            eventBus.$emit('triggerEventBus', 100);

          }

        }

      });


      var app = new Vue({

        el: '#app',

        created: function() {

          eventBus.$on('triggerEventBus', function(value){

            console.log("이벤트를 전달 받음. 전달 받은 값 : ", value);

          });

        }

      });



이벤트 버스를 활용하면 props속성을 이용하지 않고도 원하는 컴포넌트 간에 직접적으로 데이터를 전달할 수 있어 편리하지만 컴포넌트가 많아지면 어디로 보냈는지 관리가 되지 않는 문제가 발생합니다

이 문제를 해결하려면 뷰엑스란느 상태관리도구가 필요합니다.


vuex : 컴포넌트간의 데이터 관리를 효율적으로 하는 라이브러리



Do it Vue.js 입문 정리

Posted by HULIA(휴리아)
2018. 3. 31. 13:59 프론트엔드/자바스크립트

장기효

jangkeehyo@gmail.com


기술 블로그 : https://joshua1988.github.io

깃허브 : https://github.com/joshua1988



Vue.js의 초점은 더 많은 사람들이 쉡게 웹 앱을 만들 수 있도록 도와주는데 있다

-에반유(Vue.js 창시자)



프론트엔드 개발 실무자의 입장에서 Vue.js의 전망이 밝아 보이는 가장 큰 이유는 진입 장벽이 낮다는 것. 배우기도 쉽고 성능까지 우수



예제 다운로드

https://github.com/joshua1988/doit-vuejs

exam:예제코드

quiz:직접해보기

final:할일 관리 프로젝트

pwa:프로그래시브 웹 앱 프로젝트



Vue.js

명시적 렌더링(코어라이브러리) > 컴포넌트기반 > 클라이언트 사이드 라우팅(프레임워크 기능) > 상태관리


2014년 2월 처음으로 공식배포

2018년 현재 깃허브 별개수 80300개


Vue.js장점

-배우기가 쉬움

-리액트와 앵귤러에 비해 성능이 우수하고 빠름

-리액트의 장점과 앵귤러의 장점 가지고 있음(앵귤러의 데이터 바인딩 특성과 리액트의 가상돔 기반 렌더링 특징을 모두 가지고 있음)

https://vuejs.org/v2/guide/comparison.html


타입스크립트 : 기존 자바스크립트에 업격한 타입 체크를 도입한 언어. 앵귤러2의 표준

ES6 : 자바스크립트의 최신 스펙으로, ECMAScript 2015와 동일한 용어

웹팩 : 웹 모듈 번들러, 최신 프론트엔드 프레임워크에서 권고하는 필수 웹 성능 개선 도구


Vue.js의 특징

1)UI 화면단 라이브러리

Vue.js는 UI 화면 개발 방법 중 하나인 MVVM 패턴의 뷰 모델에 해당하는 화면단 라이브러리입니다


MVVM패턴(위키피디아)

마크업 언어나 GUI 코드를 비지니스 로직 또는 백엔드 로직과 분리하여 개발하는 소프트웨어 디자인 패턴



뷰(view)                         뷰모델(view Model)                        모델(model)

돔(DOM)                         뷰(Vue.js)                                   자바스크립트 객체(Javascript objects)

------------------------>돔리스너(DOM listener)----------------------------->

------------------------<데이터바인딩(Data binding-------------------------<


뷰(view) : 사용자에게 보이는 화면

돔(DOM) : HTML 문서에 들어가는 요소(태그, 클래스, 속성 등의) 정보를 담고 있는 데이터 트리

돔 리스너(DOM Listener) : 돔의 변경 내역에 대해 즉각적으로 반응하여 특정 로직을 수행하는 장치

모델(Model) : 데이터를 담는 용기, 보통은 서버에서 가져온 데이터를 자바스크립트 객체 형태로 저장

데이터 바인딩(Data Binding) : 뷰에 표시되는 내용과 모델의 데이터를 동기화

뷰 모델(ViewModel) : 뷰와 모델의 중간영역. 돔 리스너와 데이터 바인딩을 제공하는 영역



2)컴포넌트 기반 프레임워크

리액트와 앵귤러도 모두 컨포넌트 기반의 개발 방식 추구

컴포넌트 기반방식으로 개발하는 이유는

:코드를 재사용하기 쉽기 때문, 그리고 Vue,js의 경우 컴포넌트를 썼을때 HTML코드에서 화면의 구조를 직관적으로 파악할 수 있음



3)리액트와 앵귤러의 장점을 가진 프레임워크

뷰는 앵귤러의 양방향 데이터 바인딩과(two-way data binding)과 리액트의 단방향 데이터 흐름(one-way data flow)의 장점을 모두 결합한 프레임워크


양방향 데이터 바인딩이란

:화면에 표시되는 값과 프레임워크 모델 데이터 값이 동기화되어 한쪽이 변경되면 다른 한쪽도 자동으로 변경되는 것을 말함


단방향 데이터 흐름이란

:컴포넌트의 단방향 통신을 의미, 컴포넌트 간에 데이터를 전달할 때 항상 상위 컴포넌트에서 하위 컴포넌트 한 방향으로만 전달하게끔 프레임워크가 구조화되어 있는 것


4) 그외

빠른 화면 렌더링을 위해 리액트의 가상 돔 렌더링 방식을 적용하여 사용자 인터랙션이 많은 요즘의 웹 화면에 적합한 동작 구조를 갖추고 있습니다.

가상 돔을 활용하면 특정 돔 요소를 추가하거나 삭제하는 변경이 일어날 때 화면 전체를 그리지 않고 프레임워크에서 정의한 방식에 따라 화면을 갱신합니다. 따라서 브라우저 입장에서는 성능 부하가 줄어들어 일반 렌더링 방식보다 더 바르게 화면을 그릴 수 있습니다.



Vue.js 개발환경

-크롬브라우저

-텍스트 에디터

-node.js

-Vue 개발자도구



node.js

서버 사이드 자바스크립트로, 서버 측에서 실행되는 자바스크립트 실행 환경을 의미(Vue cli를 이용하려면 필요)

LTS버전을 다운로드 하는 하는 것이 더 좋음


Vue개발자 도구

구글에서 vue.js devtools로 검색

크롭 웹 스토어에 추가



앱)servletparamutil 자바 common 코드

Posted by HULIA(휴리아)
2018. 3. 30. 10:36 백엔드개발/자바스프링
String param(HttpServletRequest request, String param, String def){
         return checkParam(request.getParameter(param), def);
}


String param(HttpServletRequest request, String param){
       return param(request, param, "").trim();
}

String nonCheckParam(HttpServletRequest request, String param){
       return request.getParameter(param);
}

String checkParam(String temp, String default){
        if(temp != null){
         temp = temp.trim();
         //temp = URLDecoder.decode(temp, "UTF-8");

         Matcher m;
         /* XSS(Cross Site Scription) depend code */
          Pattern scripts = Pattern.compile("<(no)?script[^>]*>.*?</(no)?script>", Pattern.DOTALL);
          Pattern style = Pattern.compile("<style[^>]*>.*</style>", Pattern.DOTALL);
          Pattern tags = Pattern.compile("<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>");

        m = scripts.matcher(temp);
        temp = m.replaceAll("");
         m = style.matcher(temp);
         temp = m.replaceAll("");
          m = tags.matcher(temp);
        temp = m.repaceAll("");

        //SQL Injection depend code
        Pattern sql = Pattern.compile("(\\%27)|(\\')|(\\-\\-)", Pattern.DOTALL);

         m = sql.matcher(temp);
         temp = m.replaceAll("");
         } else {
           temp = default;
         }
         return temp;
}         

앱)hashutil 자바 common 코드

Posted by HULIA(휴리아)
2018. 3. 30. 10:14 백엔드개발/자바스프링
private MessageDigest sha;

MessageDigest getSHADigest(){
      if(sha == null){
           sha = MessageDigetst.getInstance("SHA-256");
      }
      return sha;
}


synchronized String getSHA256Base64(String imei) {
       String ret = null;
       if(imei != null){
           getSHADigest();
           sha.update(imei.getBytes());
           ret = new String(Base64.encode(sha.digest()));
           sha.reset();

           return ret;
        }
        return ret;
}


boolean checkDigit(String str){
        if(isRawDigit(str)) {
            return true;
        }
        return false;
}

boolean isRawDigit(String str){
        if(str != null && !str.trim().equals("")){
             char[] chars = str.trim().toCharArray();
             for(int i =0; len=chars.length; i<len; i++){
                     if(!Character.isDigit(chars[i])){
                           return false;
                       }
                 }
        return true;
        }
        return false;
}

앱)fileutil 자바 common 코드

Posted by HULIA(휴리아)
2018. 3. 30. 10:03 백엔드개발/자바스프링
void copyFile(String sourcePath, String sourceFileName, String targetPath, String targetFileName){
       File sourceFile = new File(sourcePath, sourceFileName);
       File targetDir = new File(targetPath);
       targetDir.mkdirs();
       File targetFile = new File(targetDir, targetFileName);
       FileCopyUtils.copy(sourceFile, targetFile);
}

void moveFile(String sourcePath, String sourceFileName, String targetPath, String targetFileName){
      File sourceFile = new File(sourcePath, sourceFileName);
      File targetDir = new File(targetPath);
      targetDir.mkdirs);
      File targetFile = new File(targetDir, targetFileName);
      sourceFile.renameTo(targetFile);
}

Long getTotalSpace(String fullpath){
     File f = new File(fullpath);
      return f.length();
}


String getFileUnitSize(String sizeString){
      String[] unit = {"Byte", "KB", "MB"};
      String returnSizeString = new String();
      int unitType=0;
      double changeSize = 0;
      long sourceSize = 0;
      try {
            sourceSize = Long.parseLong(sizeString);
            for (int typeSeq = 0; (sourceSize / (double) 1024) > 0; typeSeq++, sourceSize /= (double) 1024){
             unitType = typeSeq;
             changeSize = sourceSize;
      }
      returnSizeString  = changeSize + " " + unit[unitType];
     }catch(Exception e){
         returnSizeString = "0.0 Byte";
     }

     return returnSizeString;
}


//파일에서 경로만 리턴
String getOnlyPathFromFile(String fullPath){
      return fullPath.subString(0, fullPath.lastIndexOf(File.separator));
}

//파일에서 경로만 리턴
String getOnlyPathFromFile(String fullPath, String separator) {
       return fullPAth.subString(0, fullPath.lastIndexOf(separator));
}


//파일에서 파일명만 리턴
String getOnlyFileNameFromFile(String fullPath){
      return fullPath.subString(fullPath.lastIndexOf(File.separator)+1, fullPath.length());
}

String getOnlyFileNameFromFile(String fullPath, String separator){
        return fullPath.subString(fullPath.lastIndexOf(separator)+1, fullPath.length());
}


//파일에서 파일 확장자만 리턴
String getOnlyFileExtFromFile(String fileName) {
        return fileName.subString(fileName.lastIndexOf(",")+1, fileName.length());
}


String getOnlyFileExtFromFile(String fileName, String separator){
      return fileName.subString(fileName.lastIndexOf(separator) + 1, fileName.length));
}

Mobaxterm 마우스 오른쪽 클릭으로 복사 붙여넣기 기능 설정

Posted by HULIA(휴리아)
2018. 3. 30. 06:03 호스팅_서버_툴/툴


setting-configuration-terminal에서

paste using right-click을 설정하면

드래그한 내용을 마우스 오른쪽 클릭으로 붙여넣기가 됨^^