2018년 7월 18일 수요일

언제까지의 개인정보처리방침

1. 개인정보의 처리 목적 언제까지 은(는) 다음의 목적을 위하여 개인정보를 처리하고 있으며, 다음의 목적 이외의 용도로는 이용하지 않습니다.
- 고객 가입의사 확인, 고객에 대한 서비스 제공에 따른 본인 식별.인증, 회원자격 유지.관리, 물품 또는 서비스 공급에 따른 금액 결제, 물품 또는 서비스의 공급.배송 등


2. 개인정보의 처리 및 보유 기간

① 언제까지 은(는) 정보주체로부터 개인정보를 수집할 때 동의 받은 개인정보 보유․이용기간 또는 법령에 따른 개인정보 보유․이용기간 내에서 개인정보를 처리․보유합니다.

② 구체적인 개인정보 처리 및 보유 기간은 다음과 같습니다.
☞ 아래 예시를 참고하여 개인정보 처리업무와 개인정보 처리업무에 대한 보유기간 및 관련 법령, 근거 등을 기재합니다.
(예시)- 고객 가입 및 관리 : 서비스 이용계약 또는 회원가입 해지시까지, 다만 채권․채무관계 잔존시에는 해당 채권․채무관계 정산시까지
- 전자상거래에서의 계약․청약철회, 대금결제, 재화 등 공급기록 : 5년





3. 개인정보의 제3자 제공에 관한 사항

① 언제까지 은(는) 정보주체의 동의, 법률의 특별한 규정 등 개인정보 보호법 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.
② 언제까지 은(는) 다음과 같이 개인정보를 제3자에게 제공하고 있습니다.


1. <>
- 개인정보를 제공받는 자 : 어플관리자
- 제공받는 자의 개인정보 이용목적 : 어플출시
- 제공받는 자의 보유.이용기간: 3년


4. 개인정보처리 위탁

① 언제까지 은(는) 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다.
1. <>
- 위탁받는 자 (수탁자) : 어플관리자
- 위탁하는 업무의 내용 : 어플관리
- 위탁기간 :3년


② 언제까지 은(는) 위탁계약 체결시 개인정보 보호법 제25조에 따라 위탁업무 수행목적 외 개인정보 처리금지, 기술적․관리적 보호조치, 재위탁 제한, 수탁자에 대한 관리․감독, 손해배상 등 책임에 관한 사항을 계약서 등 문서에 명시하고, 수탁자가 개인정보를 안전하게 처리하는지를 감독하고 있습니다.

③ 위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다.
5. 정보주체와 법정대리인의 권리·의무 및 그 행사방법 이용자는 개인정보주체로써 다음과 같은 권리를 행사할 수 있습니다.
① 정보주체는 언제까지 에 대해 언제든지 다음 각 호의 개인정보 보호 관련 권리를 행사할 수 있습니다.
1. 개인정보 열람요구
2. 오류 등이 있을 경우 정정 요구
3. 삭제요구
4. 처리정지 요구


6. 처리하는 개인정보의 항목 작성

① 언제까지 은(는) 다음의 개인정보 항목을 처리하고 있습니다.
1<절대적 비공개방식>
- 필수항목 : 이메일
- 선택항목 :



7. 개인정보의 파기 언제까지은(는) 원칙적으로 개인정보 처리목적이 달성된 경우에는 지체없이 해당 개인정보를 파기합니다. 파기의 절차, 기한 및 방법은 다음과 같습니다.
-파기절차
이용자가 입력한 정보는 목적 달성 후 별도의 DB에 옮겨져(종이의 경우 별도의 서류) 내부 방침 및 기타 관련 법령에 따라 일정기간 저장된 후 혹은 즉시 파기됩니다. 이 때, DB로 옮겨진 개인정보는 법률에 의한 경우가 아니고서는 다른 목적으로 이용되지 않습니다.

-파기기한
이용자의 개인정보는 개인정보의 보유기간이 경과된 경우에는 보유기간의 종료일로부터 5일 이내에, 개인정보의 처리 목적 달성, 해당 서비스의 폐지, 사업의 종료 등 그 개인정보가 불필요하게 되었을 때에는 개인정보의 처리가 불필요한 것으로 인정되는 날로부터 5일 이내에 그 개인정보를 파기합니다.



8. 개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항
언제까지 은(는) 정보주체의 이용정보를 저장하고 수시로 불러오는 ‘쿠키’를 사용하지 않습니다.


9. 개인정보 보호책임자 작성

① 언제까지 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.
▶ 개인정보 보호책임자
성명 : 이재호
직책 : 어플 관리자
직급 : 관리자
연락처 : ljhdevelop@naver.com,
※ 개인정보 보호 담당부서로 연결됩니다.

▶ 개인정보 보호 담당부서
부서명 :개인정보보호처리부서
담당자 :이재호
연락처 : ljhdevelop@naver.com,
② 정보주체께서는 언제까지 의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 언제까지 은(는) 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.


10. 개인정보 처리방침 변경
①이 개인정보처리방침은 시행일로부터 적용되며, 법령 및 방침에 따른 변경내용의 추가, 삭제 및 정정이 있는 경우에는 변경사항의 시행 7일 전부터 공지사항을 통하여 고지할 것입니다.


11. 개인정보의 안전성 확보 조치 언제까지 은(는) 개인정보보호법 제29조에 따라 다음과 같이 안전성 확보에 필요한 기술적/관리적 및 물리적 조치를 하고 있습니다.
1. 해킹 등에 대비한 기술적 대책
언제까지 은(는) 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.

2. 개인정보의 암호화
이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.

3. 접속기록의 보관 및 위변조 방지
개인정보처리시스템에 접속한 기록을 최소 6개월 이상 보관, 관리하고 있으며, 접속 기록이 위변조 및 도난, 분실되지 않도록 보안기능 사용하고 있습니다.

4. 개인정보에 대한 접근 제한
개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.

2017년 6월 8일 목요일

[ES] elasticsearch Kibana Discover에서 사용하던 조건 그대로 DevTools 에서 사용하기

elasticsearch Kibana 에서 Discover에서 검색 한 조건 그대로 DevTools 에서 사용하기 위해서는 "query_string" 을 사용하면 된다. 아래는 예제이며, 검색 기간은 "range"로 적용하였다.
GET _search
{
  // 결과 값 개수
  "size" : 10,   

  // paging 의 start position
  "from" : 0,

  // 원하는 필드만 뽑을 수 있다.
  "_source" : ["referrer", "userAgent"],

  "query": {
    "bool": {
      "must" : [
        {
          // Discover에서 사용하던 query를 그대로 사용하고자 할 때 
          // "query_string" 사용 (쿼리 내용에 " 가 들어 갈 경우 \" 형식으로 치환해서 입력해주어야 한다)
          "query_string": {
            "query": "NAME:TOM"
            }
        },
        
        {
          // 검색 기간 설정 (한국시간 기준으로 뽑기 위해서 "time_zone" : "+09:00" 해주었다)
          "range": {
            "@timestamp" : {
              "gte" : "2017-03-21T00:00:00.000",
              "lte" : "2017-03-21T23:59:59.999",
              "time_zone": "+09:00"
            }
          }
        }
        
        
      ]
    }
  }
}

2016년 11월 30일 수요일

[javascript] get parameter from url

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = null;
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                return arrParamValues[i];
            }
        }
        return null;
    } else {
     return null;
    }
}

2016년 11월 16일 수요일

라즈베리파이3 (raspberry pi 3) 및 적외선 카메라 개봉기

개인적으로 집에서 컨텐츠를 만들기 위해서

그동안 눈 여겨보던 라즈베리파이를 구입하게 되었습니다.

어떤 키트를 살까? 어떤 모듈을 살까? 하고

몇일 고민한 끝에 라즈베리파이 키트를 구입하였습니다.

모델은 라즈베리파이3 이며

랜선, Micro SD카드, SD카드 리더기, HDMI 케이블, 어댑터, 

투명 케이스, 키트보관함 구성으로 구입하였습니다.





택배를 받았을 때 구성품 모습입니다.

1차적으로는 테스트 및 주요 기능 여부 확인을 위해

적외선 카메라 모듈 및 적외선 LED를

같이 구매하였습니다.

적외선 카메라 모듈의 경우 적외선 LED를 켜지 않을 경우

주간 카메라로 사용이 가능합니다.

일반 카메라, 적외선 카메라를 따로 구입하지 않으셔도 됩니다.


적외선 카메라 모듈 및 적외선 LED 모습입니다.

다음 포스팅은 라즈베리파이 구동 및 

카메라 테스트를 진행하겠습니다.




2016년 7월 12일 화요일

VisualVM jstatd

./rmiregistry 1099

./jstatd -p 1099  -J-Djava.security.policy=tools.policy -J-Djava.rmi.server.hostname=10.10.0.0

2016년 7월 11일 월요일

elasticsearch search query


GET _search
{
  
  "query": {
    "bool": {
      "must" : [
        { 
          "exists": { 
            "field": "exception.exception_class" 
          }
        },
        
        {
          "match": {
            "level": {
              "query" : "INFO"
            }
          }
        },
               
        {
          "range": {
            "@timestamp" : {
              "gte" : "now-1h",
              "lte" : "now",
              "time_zone": "+09:00"
            }
          }
        }
        
        
      ]
    }
  }
}

2016년 7월 6일 수요일

logstash output index naming daily

기존의 log4j 로그를 logstash를 이용하여 elasticsearch에 Indexing 하는 작업을 진행 하던 중 Index를 일별로 나누어서 관리를 하기 위해서 log-YYYY-MM-dd 형식으로 쌓기로 결정을 하게 되었음.

우선 아래의 depandency를 추가하여 기존 log4j 로그를 json형식으로 쌓이도록 하였음.

 net.logstash.log4j
 jsonevent-layout
 1.7

json형식으로 쌓인 로그를 아래와 같이 설정을 하였음

input {
  file {
    path => "/*"
    start_position => "beginning"
    type => "log4j-json"
    codec => json
  }
}

output {
  elasticsearch {
    index => "log-%{+YYYY-MM-dd}"
  }
}

위와 같이 설정을 하게 될 경우 logstash에서 output되는 current_time이 인덱스 명으로 사용이 되어 일 별 인덱스 생성이 가능하였다.

만약 실시간으로 로그를 전송하는 경우가 아니라 주기적으로 로그를 전송하게 된다면 index명에 들어가는 일자가 맞는 것일까?
로그가 실제로 쌓인 시간을 인덱스 날짜로 사용을 할 필요가 생겨 구글링을 통하여 아래와 같이 설정을 하였음

input {
  file {
    path => "/*"
    start_position => "beginning"
    type => "log4j-json"
    codec => json
  }
}

filter {
  ruby {
    code => "event['index_day'] = Time.at(event['@timestamp'].to_i).strftime('%Y-%m-%d')"
  }
}

output {
  elasticsearch {
    index => "log-%{index_day}"
  }
}

필터를 통하여 index_day라는 키에 @timestamp 값을 원하는 포맷으로 변경 한 값을 주어 index명에서 사용을 함으로서

로그에 있는 시간을 기준으로 index 설정이 가능해졌다.


====== 추가 ======

@timestame의 경우 한국 시간으로 표시 되지 않고 09:00 시간을 뺀 시간을 알려주고 있어 index명에서 한국 기준이 아닌 경우가 있어 아래와 같이 수정하여 해결함

code => "event['index_day'] = Time.at(event['@timestamp'].to_i).localtime.strftime('%Y-%m-%d')"


2016년 6월 27일 월요일

spring 4.x + jackson json response

Spring버전을 3.x 에서 4.x로 버전을 올리면서 발생 한 이슈 가운데 한가지로
@ResponseBody를 이용하여 rest api 결과를 돌려주고 있었는데
JSON으로 잘 뽑히던 부분이 XML로  뽑히는 현상이 발생하여
구글링하여 아래와 같이 수정하였음



  com.fasterxml.jackson.core
  jackson-core
  2.7.3



  com.fasterxml.jackson.core
  jackson-databind
  2.7.3


pom.xml에 위의 라이브러리를 추가하고 기존의 jackson 라이브러리를 제거하였음

  
    
      
        
          text/html;charset=UTF-8
          application/json;charset=UTF-8
        
      
      
    
  


spring-mvc에 위의 annotation-driven을 추가하여 해결하였음

2016년 6월 23일 목요일

Redis 런타임 시 Replication (Master/Slave) 변경

Redis 운영 중 하드웨어 작업으로 인해 Master / Slave 를 변경 해야하는 이슈가 발생하여 아래와 같이 처리하였음

requirepassword 는 설정하지 않아 패스워드 없이 진행하였음

- 구성 -
S1 : Master
S2 : Slave

1. S1 부터 작업을 하게 되어 S2 를 Master로 변경하였음

# redis-cli slaveof no one


2. S1 작업 완료 후 S1을 S2의 Slave로 변경

# redis-cli slaveof xxx.xxx.xxx.xxx(s2) 6379
# redis-cli config set repl-ping-slave-period 10
# redis-cli config set repl-timeout 60

3. info로 확인하면서 동기화가 다되었을 경우 S1을 다시 Master로 변경하였음

# redis-cli slaveof no one

4. S2 작업 완료 후 S2를 S1의 Slave로 변경

# redis-cli slaveof xxx.xxx.xxx.xxx(s1) 6379
# redis-cli config set repl-ping-slave-period 10
# redis-cli config set repl-timeout 60

5. info로 확인하면서 동기화가 잘되는지 확인하고 종료 하였음

처음 해보는 작업이라 인터넷으로 검색 후 진행하였음

2016년 6월 22일 수요일

linux 디렉토리 용량 확인 du

1. 지정한 디렉토리에 존재하는 모든 파일의 용량을 표시
# du /etc

2. 지정한 디렉토리에 존재하는 모든 파일을 포함 한 용량을 표시
# du -s /etc

3. 2번의 결과에 읽기 쉽게 용량 단위를 붙여서 표시 (human-readable : 여기저기 많이 쓰임)
# du -sh /etc

2016년 6월 17일 금요일

[CSS] number input arrow hide

number 타입 input의 상하 화살표를 숨기는 CSS
input[type=number]::-webkit-inner-spin-button, 
input[type=number]::-webkit-outer-spin-button { 
  -webkit-appearance: none; 
  margin: 0; 
}

2016년 5월 13일 금요일

[Java/Javascript] URL 파라매터 GET 으로 전송시 한글 깨짐 현상

GET 방식으로 URL 파라매터를 넘길 때 한글이 깨지는 현상이 발생 할 때 아래와 같이 처리하면 된다.


var url = "./test.do?name="+encodeURI(encodeURIComponent("한글"));
location.href = url;

인코딩하여 넘긴 파라매터를 JAVA에서 받아서 아래와 같이 디코딩 하여 사용하면 된다.

String name = URLDecoder.decode(request.getParameter("name"),"UTF-8");

2016년 5월 4일 수요일

[Spring] error-page 설정 (web.xml)

웹 어플리케이션 개발 시 http error 발생 시 tomcat의 기본 페이지를 원하는 페이지로 변경하기 위해서는 web.xml에 아래와 같이 설정하면 된다.

    404
    /error.jsp

원하는 error-code 에 따른 페이지를 설정 할 수 있다.

[java] Collections.sort Asc/Desc

/** Ascending **/
static class AscCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getXXX().compareTo(arg1.getXXX());
    }
}
/** Descending **/
static class DescCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg1.getXXX().compareTo(arg0.getXXX());
    }
} 
/** Ascending **/
static class AscCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getNo() < arg1.getNo() ? -1 : arg0.getNo() > arg1.getNo() ? 1:0;
    }
}
/** Descending **/
static class DescCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getNo() > arg1.getNo() ? -1 : arg0.getNo() < arg1.getNo() ? 1:0; 
    } 
}

[JSTL] Get collection's length

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

${fn:length(list)}

2016년 4월 29일 금요일

java generic 제네릭 타입

1. 제네릭 클래스
public class ArrayList<E> extends AbstractList<E> implements List<E> ...{ 
public boolean add(E o)
}
- E(Element): 컬렉션에 저장하고 컬렉션에서 리턴할 원소의 유형 ex) String, int, ...
클래스 생성시 설정해준 E 값으로 클래스 안에서 사용 
ex) ArrayList<String> a = new ArrayList<String>;
2. 제네릭 메소드
     
2.1 public <T extends Animal> void takeThing(ArrayList<T> list) 
- Animal 클래스의 확장(extends)이나 구현(implements)만 객체로 받을 수 있다.
- public void takeThing(ArrayList<Animal> list) 과 다른 점은 이 메소드의 list 파라미터는
ArrayList<Animal> 만 가능하다 하지만 위의 경우 ArrayList<Animal> 뿐만아니라 
Animal 클래스를 상속한 ArrayList<Dog>, ArrayList<Cat> 등도 다 가능하다.  
     2.2 public static <T extends Comparable<? super T>> void sort(List<T> list)
- sort 메서드의 파라미터 List의 인자가 Comparable 클래스 유형이여야 한다.
- <? super T> 이건 Comparable의 유형 매개 변수가 T 또는 T의 상위 유형이어야 한다는 것 

string vs stringbuilder vs stringbuffer

String
String 값의 비교(==, equals, compareTo, Collator 클래스)
1. ==                        -> 값과 상관없이 같은 오브젝트인지 확인
2. equals                    -> 값이 같은지 확인
3. compareTo              -> int 값 반환 (같으면 0 다르면 크기에 따라 음수와 양수로 나누어짐)
4. Collator클래스          -> 자연어를 비교하여 순서 매길 때

StringBuffer       vs        StringBuilder
스레드  안전                          단일 스레드에서만 보장
속도  String보다 완전빠름        StringBuffer보다 좀 더 빠름
메모리  String보다 완전적음       StringBuffer와 같음

이유 = String의 경우 + 연산을 할때마다 세로운 주소지에 더해진 String 값을 저장한다. 하지만 StringBuffer와 StringBuilder의 경우 처음 주소지에 값만 추가된다.새로 메모리를 할당하고 값을 옮겨갈 필요가 없다.

비교
- String은 짧은 문자열을 더할 경우 사용한다.
- StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 몰르 경우 사용하면 된다.
- StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.

생성자
- StringBuffer()                            => 기본 용량 16개의 char 이다.
- StringBuffer(CharSequence seq)  => CharSequence는 CharBuffer, String, StringBuffer, StringBuilder의 인터페이스이며 생성된 StringBuffer는 실재로 seq에 대한 값을 갖는다.
- StringBuffer(int capacity)               => capacity = 용량
- StringBuffer(String str)                  => str 값을 갖는 StringBuffer 생성

java collection

Collection
동기화= 다중 스레드에서 데이터 처리를 보장
동기화되어 있는 클래스는 Vector와 Hashtable 밖에 없지만 다음과 같이해서 동기화 처리가 된다.
Set s = Collections.synchronizedSet(new HashSet(…));

블로킹 큐= 크기가 정해져있는 큐에 공간이 더이상 없을때, 공간이 생길때까지 대기
Set
속도: TreeSet < HashSet < LinkedHashSet (많이 차이 없음)
List
속도: ArrayList < LinkedList  < Vector (별 차이 없지만 LinkedList에서 값을 가져올때 poll대신 get을 사용하면 많이 느려진다.)
Map
속도: TreeMap >> HashMap > HashTable > LinkedHashMap (TreeMap 이 좀 느리고 나머지는 비슷)

사실 모두 속도가 비슷해서 어떤걸 사용해도 별 상관없다 하지만 안정적인걸 봤을때 Sun이 선정한 인터페이스별 클래스는 다음과 같다.
Set -> HashSet
List -> ArrayList
Map -> HashMap
Queue -> LinkedList

언제까지의 개인정보처리방침

1. 개인정보의 처리 목적 언제까지 은(는) 다음의 목적을 위하여 개인정보를 처리하고 있으며, 다음의 목적 이외의 용도로는 이용하지 않습니다. - 고객 가입의사 확인, 고객에 대한 서비스 제공에 따른 본인 식별.인증, 회원자격 유지.관리, 물품 또는...