728x90
반응형

 

이전 글을 통해 PDFKit을 사용하여 단일, 다중 PDF 파일을 표시 하였습니다.

https://gigas-blog.tistory.com/262

 

[Swift] PDFKit 사용하기 #2 다중 PDF

이전글에서 PDFKit을 사용하여 간단하게 단일 PDF를 표시하는 앱을 만들어 봤습니다. 이번글에서는 여러 PDF를 하나로 병합하여 표시하는 앱을 만들어 보겠습니다. https://gigas-blog.tistory.com/261 [Swift]

gigas-blog.tistory.com

 

그런데 몇번 페이지를 보고 있는지. 전체 페이지가 몇개가 있는지 보여지는게 없네요.

 

이번 글에서는 전체페이지와 현재 페이지를 아래처럼 표시해보도록 하겠습니다.

 

아래와 같이 3개의 변수를 선언해주었습니다.

 

pageInfoContainer 는 페이지번호를 감싸주는 Container입니다.

 

currentPageLabel 은 페이지번호를 표시해주는 Label입니다.

 

timer는 일정시간 페이지번호를 표시해준뒤 PDF를 가리지 않기 위해 pageInfoContainer를 가려주는 용도로 사용합니다.

var pageInfoContainer: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.layer.cornerRadius = 6
    view.backgroundColor = UIColor.gray
    return view
}()

var currentPageLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.font = UIFont.systemFont(ofSize: 12, weight: .medium)
    label.textColor = UIColor.white
    return label
}()

private var timer: Timer?

 

 

 

페이지 UI의 제약을 주기 위해 아래처럼 작성을 해주었습니다.

 

UI구성을 마쳤으니 실제 페이지번호를 보여주도록 처리해보겠습니다.

func setUpUI() {
    view.addSubview(pageInfoContainer)
    
    pageInfoContainer.addSubview(currentPageLabel)
    
    NSLayoutConstraint.activate([
        pageInfoContainer.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
        pageInfoContainer.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20),
        
        currentPageLabel.topAnchor.constraint(equalTo: pageInfoContainer.topAnchor, constant: 5),
        currentPageLabel.leadingAnchor.constraint(equalTo: pageInfoContainer.leadingAnchor, constant: 10),
        currentPageLabel.trailingAnchor.constraint(equalTo: pageInfoContainer.trailingAnchor, constant: -10),
        currentPageLabel.bottomAnchor.constraint(equalTo: pageInfoContainer.bottomAnchor, constant: -5),
    ])
}

 

 

 

PDFKit에서 지원을 하고 있으며 다양한 Notification을 지원하고 있습니다.

 

그중 PDFViewPageChanged 를 통해 페이지 상태가 변하면 handlePageChange함수로 알림을 받도록 등록합니다.

NotificationCenter.default.addObserver(self, selector: #selector(handlePageChange), name: .PDFViewPageChanged, object: nil)

 

 

 

PDFViewPageChanged 으로 등록한 Notification이 handlePageChange함수를 호출해주는데요.

 

pageIndex를 가져온 뒤 pageInfoContainer를 표시해주고 startTimer를 호출합니다.

 

startTimer에서는 타이머를 invalidate 하고 새로운 Timer를 생성해줍니다.

 

그리고 2초 뒤에 pageInfoContainer를 사라지게 해주는 whenTimerEnds함수를 호출해 줍니다.

// MARK: - PDFView PDFViewPageChanged
extension ViewController {
    @objc
    func handlePageChange() {
        view.bringSubviewToFront(currentPageLabel)
        if let currentPage: PDFPage = pdfView.currentPage,
           let pageIndex: Int = pdfView.document?.index(for: currentPage) {
            UIView.animate(withDuration: 0.5, animations: {
                self.pageInfoContainer.alpha = 1
            }) { (finished) in
                if finished {
                    self.startTimer()
                }
            }
            currentPageLabel.text = "\(pageIndex + 1) of \(pdfView.document?.pageCount ?? .zero)"
        }
    }
    
    private func startTimer() {
        timer?.invalidate()
        timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(whenTimerEnds), userInfo: nil, repeats: false)
    }

    @objc
    func whenTimerEnds() {
        UIView.animate(withDuration: 1) {
            self.pageInfoContainer.alpha = 0
        }
    }
}

 

 

 

타이머를 사용했다면 deinit 될때 꼭 invalidate 처리를 해주어야겠죠.

deinit {
    timer?.invalidate()
}

 

 

 

이렇게 작성된 코드를 Build하면 아래처럼 페이지 이동시 현재페이지와 전체페이지를 보여주는 View를 보실 수 있습니다.

 

이로써 기본 기능에 충실한 PDFViewer를 만들어 보았습니다.

 

다양한 용도로 Custom 을 하여 더 멋진 PDFViewer를 만들어보세요.

 

 

 

 

지금까지 작성한 코드는 GitHub 를 통해 확인하실 수 있습니다.

https://github.com/bonjin-app/iOS/blob/main/PDFKitExample/PDFKitExample/ViewController.swift

 

bonjin-app/iOS

Contribute to bonjin-app/iOS development by creating an account on GitHub.

github.com

 

728x90
반응형
728x90
반응형

 

이전글에서 PDFKit을 사용하여 간단하게 단일 PDF를 표시하는 앱을 만들어 봤습니다.

 

이번글에서는 여러 PDF를 하나로 병합하여 표시하는 앱을 만들어 보겠습니다.

https://gigas-blog.tistory.com/261

 

[Swift] PDFKit #1 단일 PDF

PDFKit은 공식 문서를 보면 PDF데이터를 보여주거나 작성 및 검색을 할 수 있다고 나와있습니다. iOS 11 이상부터 사용이가능하기에 이전 버전을 지원하는 앱에서는 사용이 불가능합니다. https://devel

gigas-blog.tistory.com

 

 

 

이전처럼 함수로 미리 작성해 주겠습니다.

 

PDFDocument를 배열로 받아서 document에 insert함수를 이용하여 추가하는 방식입니다.

 

PDFDocument를 PDFPage로 변환하여 보여질 document에 insert만 하면 된다는게 정말 쉽군요.

func loadMultiplePdfView(inputDocuments: [PDFDocument]) {
    let document: PDFDocument = PDFDocument()
    for input in inputDocuments {
        for i in .zero...input.pageCount {
            if let page: PDFPage = input.page(at: i) {
                document.insert(page, at: document.pageCount)
            }
        }
    }
    
    pdfView.autoScales = true
    pdfView.displayMode = .singlePageContinuous
    pdfView.displayDirection = .vertical
    pdfView.document = document
}

 

 

 

아래 코드를 ViewDidLoad함수에 넣어서 실행해보겠습니다.

let urlStrings = ["http://www.africau.edu/images/default/sample.pdf",
                 "http://www.africau.edu/images/default/sample.pdf",
                 "http://www.africau.edu/images/default/sample.pdf"]
        
let documents = urlStrings.compactMap { (urlString) -> PDFDocument? in
    if let url = URL(string: urlString),
       let document = PDFDocument(url: url) {
        return document
    }
    return nil
}
loadMultiplePdfView(inputDocuments: documents)

 

 

 

하나의 pdf가 2개 page 를 갖고 있기 때문에 3개를 호출하여 6개의 page를 만들어서 표시 했습니다.

 

 

정말 간단하지요? PDFKit의 장점은 Custom이 가능하다는 것입니다.

 

TableView를 추가하여 좌측에 전체 페이지를 보여주는것도 가능하고, PDFView의 go 라는 함수로 특정 페이지로 스크롤을 이동시키는것도 가능합니다.

 

 

WebKit으로 PDF를 병합하려고 찾지 마시고 PDFKit을 통해서 해결해보시는게 어떨까요?

 

다양하게 본인만의 PDFViewer를 만들어보세요.

 

728x90
반응형
728x90
반응형

 

PDFKit은 공식 문서를 보면 PDF데이터를 보여주거나 작성 및 검색을 할 수 있다고 나와있습니다.

 

iOS 11 이상부터 사용이가능하기에 이전 버전을 지원하는 앱에서는 사용이 불가능합니다.

https://developer.apple.com/documentation/pdfkit/pdfdocument

 

Apple Developer Documentation

 

developer.apple.com

 

 

 

 

기존 프로젝트에 약관을 확인하려는 용도로 WebKit을 사용하여 html파일을 로드하는 방식으로 사용을 하고 있었습니다.

 

Server 에서 pdf로 보내도 WebKit에서 변환하여 잘 보여주고 있는데요.

 

PDFKit을 사용하여 다양한 방식으로 표시를 해보겠습니다.

 

 

 

새로운 xcode 프로젝트를 PDFKitExample이라는 이름으로 만들어줍니다.

 

그리고 Main.storyboard의 ViewController에 UIView를 만들어주는데 class를 'PDFView'로 연결해줍니다.

 

PDFView는 PDFKit에서 지원하는 UIView를 상속하여 만들어진 View이고 PDF파일을 보여주는 역할을 합니다.

 

 

ViewController로 돌아와 PDFKit을 import하고 조금전에 만든 PDFView 를 pdfView 와 연결합니다.

import UIKit
import PDFKit

class ViewController: UIViewController {

    @IBOutlet weak var pdfView: PDFView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

 

 

 

이제 pdfView에 pdf파일을 연결하는 함수를 작성해 줍니다.

 

PDFDocument라는 Parameter를 받아서 pdfView와 연결해줍니다.

 

autoScales 는 뷰의 크기가 조정되거나 회전 될 때 배율이 자동으로 변경되는 모드입니다.

true, false 로 구성되어있습니다.

 

displayMode는 문서 표시 모드 이며 기본값은 singlePageContinuous로 단일 페이지 방식입니다.

singlePage, singlePageContinuous, twoUp, twoUpContinuous 모드가 있습니다.

 

displayDirection은 vertical과 horizontal로 구성되어있고 기본값은 vertical 모드 입니다.

 

마지막으로 document라는 속성에 PDFDocument를 연결하면 됩니다.

func loadPdfView(document: PDFDocument) {
        pdfView.autoScales = true
        pdfView.displayMode = .singlePageContinuous
        pdfView.displayDirection = .vertical
        pdfView.document = document
    }

 

 

 

url을 받아서 PDFDocument로 변환하여 loadPdfView함수를 호출하도록 처리 했습니다.

 

local방식과 web방식을 선택하여 사용하면 되고, 아래 코드를 ViewDidLoad 함수에 넣어서 실행해보겠습니다.

// local Sample Pdf
// let url = Bundle.main.url(forResource: "sample", withExtension: "pdf")

// web Sample Pdf
let url = "http://www.africau.edu/images/default/sample.pdf"

if let url = URL(string: urlString),
	let document = PDFDocument(url: url) {
	loadPdfView(document: document)
}

 

 

 

WebView처럼 pdf파일을 잘 불러온것을 확인할 수 있습니다.

 

 

위처럼 간단하게 하나의 pdf파일을 로드해서 표시를 해봤습니다.

 

다음글에서는 pdf파일이 여러개 있을때 하나로 표시하는 방법을 알아보도록 하겠습니다.

 

728x90
반응형
728x90
반응형

 

이전글에서 ELS Stack 구성하기 위해 설치를 진행했습니다.

 

이번 글에서는 Logstash의 설정을 알아보겠습니다.

 

gigas-blog.tistory.com/255

[Server] MacOS X ELK Stack 구성하기 #1 설치

어플리케이션이 구동 중 발생하는 Exception을 모니터링할 수 있는 시스템을 위해 ELK Stack 환경을 구성하려고 합니다. ELS (ElK Stack) 구성 Java 8 Elasticsearch 7.1 Logstash 7.1 Kibana 7.1 Mac OS X에 ELK..

gigas-blog.tistory.com

 

 

 

우선 services로 등록된 목록을 조회합니다.

brew services list

 

 

 

logstash의 상태가 error로 나와있는데

Name          Status  User  Plist
elasticsearch started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
kibana        started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.kibana.plist
logstash      error   gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.logstash.plist

 

 

 

logstash.log 파일을 보면 왜 error 가 발생하는지 확인이 가능합니다.

/usr/local/var/log/logstash.log

 

 

 

내용을 보면 pipeline.yml 설정파일이 비어있다고 나오는군요.

ERROR: Pipelines YAML file is empty. Location: /usr/local/Cellar/logstash/7.12.0/libexec/config/pipelines.yml
usage:
  bin/logstash -f CONFIG_PATH [-t] [-r] [] [-w COUNT] [-l LOG]
  bin/logstash --modules MODULE_NAME [-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.VARIABLE_NAME=VALUE"] [-t] [-w COUNT] [-l LOG]
  bin/logstash -e CONFIG_STR [-t] [--log.level fatal|error|warn|info|debug|trace] [-w COUNT] [-l LOG]
  bin/logstash -i SHELL [--log.level fatal|error|warn|info|debug|trace]
  bin/logstash -V [--log.level fatal|error|warn|info|debug|trace]
  bin/logstash --help
[2021-04-15T14:35:20,917][FATAL][org.logstash.Logstash    ] Logstash stopped processing because of an error: (SystemExit) exit

 

 

 

pipelines 파일을 열어보겠습니다.

oepn /usr/local/etc/logstash/pipelines.yml
or
vi /usr/local/etc/logstash/pipelines.yml

* deb 또는 rpm으로 설치를 진행하면 /etc/logstash/conf.d 디렉토리에 구성파일이 배치 됩니다. *

 

하지만 위와 같이 설치 하지 않았기에 이전글을 따라 설치하셨다면 /usr/local/etc/logstash 경로에 배치 됩니다.

 

공식문서는 아래와 같습니다.

www.elastic.co/guide/en/logstash/7.x/dir-layout.html

Logstash Directory Layout | Logstash Reference [7.x] | Elastic

Logstash Docker containers do not create log files by default. They log to standard output.

www.elastic.co

 

 

 

많은 라인의 설정 내용이 있지만 모두 주석처리가 되어있습니다.

 

주석을 제거하여 pipeline.id와 path.config를 수정하였습니다. 

 

syslog.conf 는 조금 더 아래부분에서 새로 만들겠습니다.

# - pipeline.id: test
- pipeline.id: sample

#   path.config: "/tmp/logstash/*.config"
path.config: "/usr/local/etc/logstash/syslog.conf"

 

 

 

/usr/local/etc/logstash/ 경로에는 pipeline.yml 뿐만아니라 아래처럼 몇가지 파일들이 기본으로 있습니다.

 

logstash를 실행하려면 conf 파일이 필요한데 기본적으로 logstash-sample.conf 설정파일이 샘플로 들어있습니다.

jvm.options
log4j2.properties
logstash-sample.conf
logstash.yml
pipelines.yml
startup.options
/usr/local/etc/logstash/logstash-sample.conf

 

 

 

샘플 conf 파일은 아래와 같이 구성되어있습니다.

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

 

 

 

기존파일도 사용가능하고 새로운 파일을 만들어서 연결도 가능합니다.

 

syslog.conf 파일을 만들어 보겠습니다.

vi /usr/local/etc/logstash/syslog.conf

 

 

 

MacOS X의 로그를 보여줄 수 있도록 file을 읽는 설정과 filter 설정으로 message를 만들었습니다.

input {
  file {
    path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ]
    type => "syslog"
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200"] 
    index => "syslog-demo"
  }
  stdout { codec => rubydebug }
}

 

 

 

새로 생성한 syslog.conf 파일의 구성을 로드 합니다.

 

별도 설정파일없이 -f 옵션으로 시작하고 있기 때문에 brew services 로 등록되지는 않습니다.

/usr/local/bin/logstash -f syslog.conf 
Using JAVA_HOME defined java: /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Sending Logstash logs to /usr/local/Cellar/logstash/7.12.0/libexec/logs which is now configured via log4j2.properties
[2021-04-15T12:21:23,862][INFO ][logstash.runner          ] Log4j configuration path used is: /usr/local/Cellar/logstash/7.12.0/libexec/config/log4j2.properties
[2021-04-15T12:21:23,874][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.12.0", "jruby.version"=>"jruby 9.2.13.0 (2.5.7) 2020-08-03 9a89c94bcc Java HotSpot(TM) 64-Bit Server VM 10.0.2+13 on 10.0.2+13 +indy +jit [darwin-x86_64]"}
[2021-04-15T12:21:24,004][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2021-04-15T12:21:24,036][INFO ][logstash.agent           ] No persistent UUID file found. Generating new UUID {:uuid=>"31d249d3-662b-4761-a658-482e72562d5c", :path=>"/usr/local/Cellar/logstash/7.12.0/libexec/data/uuid"}
[2021-04-15T12:21:24,642][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
[2021-04-15T12:21:25,664][INFO ][org.reflections.Reflections] Reflections took 38 ms to scan 1 urls, producing 23 keys and 47 values 
[2021-04-15T12:21:26,763][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[2021-04-15T12:21:26,924][WARN ][logstash.outputs.elasticsearch][main] Restored connection to ES instance {:url=>"http://127.0.0.1:9200/"}
[2021-04-15T12:21:27,123][INFO ][logstash.outputs.elasticsearch][main] ES Output version determined {:es_version=>7}
[2021-04-15T12:21:27,126][WARN ][logstash.outputs.elasticsearch][main] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[2021-04-15T12:21:27,137][INFO ][logstash.outputs.elasticsearch][main] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//127.0.0.1:9200"]}
[2021-04-15T12:21:27,202][INFO ][logstash.outputs.elasticsearch][main] Using a default mapping template {:es_version=>7, :ecs_compatibility=>:disabled}
[2021-04-15T12:21:27,262][INFO ][logstash.outputs.elasticsearch][main] Index Lifecycle Management is set to 'auto', but will be disabled - Index Lifecycle management is not installed on your Elasticsearch cluster
[2021-04-15T12:21:27,263][INFO ][logstash.outputs.elasticsearch][main] Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[2021-04-15T12:21:27,293][INFO ][logstash.outputs.elasticsearch][main] Installing elasticsearch template to _template/logstash
[2021-04-15T12:21:27,362][INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1500, "pipeline.sources"=>["/usr/local/etc/logstash/syslog.conf"], :thread=>"#<Thread:0x39654f6f run>"}
[2021-04-15T12:21:28,430][INFO ][logstash.javapipeline    ][main] Pipeline Java execution initialization time {"seconds"=>1.07}
[2021-04-15T12:21:28,709][INFO ][logstash.inputs.file     ][main] No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/usr/local/Cellar/logstash/7.12.0/libexec/data/plugins/inputs/file/.sincedb_7a95d797537896d7bc2d7c8449373a40", :path=>["/var/log/*.log", "/var/log/messages", "/var/log/syslog"]}
[2021-04-15T12:21:28,740][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
[2021-04-15T12:21:28,774][INFO ][filewatch.observingtail  ][main][976adb32015ef413e59b22b156956b8bec525ed6230bfb57972bc53d08535932] START, creating Discoverer, Watch with file and sincedb collections
[2021-04-15T12:21:28,792][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
{
    "syslog_severity_code" => 5,
                 "message" => "Apr 15 12:21:35 gigasui-MacBookPro Google Chrome Helper[6300]: Libnotify: notify_register_coalesced_registration failed with code 9 on line 2835",
              "syslog_pid" => "6300",
             "received_at" => "2021-04-15T03:21:36.161Z",
              "@timestamp" => 2021-04-15T03:21:35.000Z,
         "syslog_facility" => "user-level",
          "syslog_message" => "Libnotify: notify_register_coalesced_registration failed with code 9 on line 2835",
                "@version" => "1",
         "syslog_hostname" => "gigasui-MacBookPro",
                    "host" => "gigasui-MacBookPro.local",
          "syslog_program" => "Google Chrome Helper",
           "received_from" => "gigasui-MacBookPro.local",
                    "path" => "/var/log/system.log",
    "syslog_facility_code" => 1,
         "syslog_severity" => "notice",
                    "type" => "syslog",
        "syslog_timestamp" => "Apr 15 12:21:35"
}

 

 

 

편한 관리를 위해 brew services로 등록해보겠습니다.

 

pipeline.yml 에 설정된 conf 파일을 읽도록 처리가 되었기 때문에 bres services list 명령어로 상태 관리를 할 수 있습니다.

brew services start logstash

 

 

 

그리고 Logstash 자체도 REST API를 제공하고 있습니다.

 

정상적으로 실행이 되었는지 확인하기 위해 기본 설정된 9600 포트로 접속해봅니다.

curl localhost:9600/_node?pretty

 

 

 

Logstash설정이 완료 되었기 때문에 Kibana를 통해 시각화가 필요합니다.

설정에 되어있는 index가 자동으로 생성되지만 수동으로 등록 할 수도 있습니다.

 

Kibana 스택 관리 메뉴에서 index를 등록합니다.

 

http://localhost:5601/app/home#/

 

 

 

 

conf 파일의 output에 설정된 elasticsearch-> index 로 색인 등록을 할 수 있습니다.

 

syslog-demo를 입력하면 해당 인덱스를 찾았다는 문구가 보여지게 됩니다.

 

확인 후 Next step 버튼을 클릭합니다.

 

 

 

 

 

시간 필터 필드 이름으로 @timestamp 필드를 선택하고 'Create index pattern' 버특을 클릭합니다.

 

 

 

 

 

정상적으로 index pattern 등록이 되었습니다.

 

 

 

 

 

Discover 페이지를 열면 Kibana에서 syslog 데이터를 볼 수 있습니다.

 

날짜별로 필터도 가능하며 검색을 통해서 빠르게 조회가 가능합니다.

 

 

 

 

 

이렇게 Kibana를 통해서 로그를 시각화 하도록 구성을 해보았습니다.

 

728x90
반응형
728x90
반응형

 

어플리케이션이 구동 중 발생하는 Exception을 모니터링할 수 있는 시스템을 위해 ELK Stack 환경을 구성하려고 합니다.

 

 

 

ELS (ElK Stack) 구성

Java 8

Elasticsearch 7.1

Logstash 7.1

Kibana 7.1

 

 

 

Mac OS X에 ELK Stack을 구성해보겠습니다.

 

www.elastic.co/kr/

 

오픈 소스 검색: Elasticsearch, ELK Stack 및 Kibana 개발사 | Elastic

우리는 Elastic (ELK) Stack -- Elasticsearch, Kibana, Beats 및 Logstash를 만든 개발사입니다. 클라우드 또는 온-프레미스에서 데이터를 안전하고 안정적으로 검색하고 분석하고 시각화하세요.

www.elastic.co

 

 

Homebrew 설치

Homebrew를 사용하여 ELK를 설치 합니다.

 

기존 환경에 Homebrew 가 설치되어있다면 업데이트를 진행합니다.

brew update

 

 

 

설치하지 않았다면 터미널에서 아래의 명령어로 설치를 진행합니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 

 

 

 

 

Java 설치

ELK는 JVM 환경에서 동작하기 때문에 Java 설치는 필수 입니다.

 

최소 Java 8을 설치 해야 합니다.

www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

java -version을 확인해보니 10.0.2 버전을 사용하고 있네요.

 

Mac OS X 는 기본적으로 Java 가 설치되어있음으로 해당 명령어로 현재 버전을 확인할 수 있습니다.

java -version

java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

 

 

 

공식 사이트 내용을 보면 Logstash는 Java9를 지원하지 않기 때문에 Java8을 맞춰줘야 됩니다.

 

만약 다른 Java 버전을 사용한다면 brew services에 등록된 상태를 보면 error로 보여집니다. (pipeline.yml 에서 오류가 발생하여 start가 안되던 문제였습니다.)

 

www.elastic.co/guide/kr/logstash/current/installing-logstash.html

 

Logstash 설치 | Logstash 참조 [5.4] | Elastic

앞서 설명한 echo 메서드를 사용하여 Logstash 리포지토리를 추가합니다. add-apt-repository`는 사용하지 마십시오. 이는 `deb-src 항목도 추가하는데 소스 패키지가 제공되지 않습니다. deb-src 항목을 추가

www.elastic.co

Logstash에는 Java 8이 필요합니다. Java 9는 지원되지 않습니다. official Oracle distribution 또는 오픈소스 배포판(예: OpenJDK)을 사용합니다.

 

 

 

vi 편집기나 open 명령어로 파일을 열어서 JAVA_HOME 환경변수를 Java 8로 변경하였습니다.

open ~/.bash_profile
or
vi ~/.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

 

 

 

source 명령어를 통해 환경변수를 다시 로드 합니다.

source ~/.bash_profile

 

 

 

 

Elasticsearch 설치

www.elastic.co/kr/downloads/past-releases/elasticsearch-7-2-0

 

Elasticsearch 7.2.0 | Elastic

View the detailed release notes here. Not the version you're looking for? View past releases. The pure Apache 2.0 licensed distribution is available here. The distribution that's not bundled with a JDK is available here. You can obtain the source code for

www.elastic.co

기본 환경이 만들어졌다면 Elasticsearch 아래의 명령어로 구성 요소 설치를 진행합니다.

 

Elasticsearch는 데이터 저장소 및 검색엔진 역할을 합니다.

brew install elasticsearch && brew info elasticsearch

 

 

 

Homebrew로 Elasticsearch 를 시작합니다.

brew services start elasticsearch
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 1155 (delta 13), reused 13 (delta 9), pack-reused 1121
Receiving objects: 100% (1155/1155), 335.91 KiB | 5.17 MiB/s, done.
Resolving deltas: 100% (490/490), done.
Tapped 1 command (41 files, 425.7KB).
==> Successfully started `elasticsearch` (label: homebrew.mxcl.elasticsearch)

 

 

 

터미널을 통해 curl 명령어로 접속하거나 브라우저를 통해 http://localhost:9200 으로 접속하면 아래와 같이 출력됩니다.

curl -X GET localhost:9200
{
  "name" : "gigasui-MacBookPro.local",
  "cluster_name" : "elasticsearch_brew",
  "cluster_uuid" : "8TGDIm0lT6-IjUmdz29zig",
  "version" : {
    "number" : "7.10.1-SNAPSHOT",
    "build_flavor" : "oss",
    "build_type" : "tar",
    "build_hash" : "unknown",
    "build_date" : "2020-12-09T19:28:12.431816Z",
    "build_snapshot" : true,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

 

 

 

 

Logstash 설치

www.elastic.co/kr/downloads/past-releases/logstash-7-2-0

 

Logstash 7.2.0 | Elastic

View the detailed release notes here.

www.elastic.co

이번엔 아래의 명령어로 Logstash 설치를 진행합니다.

 

Logstash는 데이터 수집, 필터링, Elasticsearch에 색인하는 역할을 합니다.

brew install logstash

 

 

 

아직 Logstash 파이프라인을 구성하지 않아서 의미가 없지만 아래에서 구성을 진행하도록 하겠습니다.

brew services start logstash
==> Successfully started `logstash` (label: homebrew.mxcl.logstash)

 

 

 

 

Kibana 설치

www.elastic.co/kr/downloads/past-releases/kibana-7-2-0

 

Kibana 7.2.0 | Elastic

View the detailed release notes here.

www.elastic.co

ELK의 마지막 구성 요소인 Kibana를 설치하겠습니다.

 

Kibana는 수집된 데이터를 시각화 해주는 역할을 합니다.

 

아래의 명령어를 통해 Kibana 설치를 진행합니다.

brew install kibana

 

 

 

Kibana를 실행합니다.

brew services start kibana
==> Successfully started `kibana` (label: homebrew.mxcl.kibana)

 

 

 

 

Kibana를 시작하고 모든 ELK 서비스가 실행 중인지 확인합니다.

 

logstash 서비스 상태는 error로 나오는데 다음글에서 다루겠습니다.

brew services list
Name          Status  User  Plist
elasticsearch started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
kibana        started gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.kibana.plist
logstash      error   gigas /Users/gigas/Library/LaunchAgents/homebrew.mxcl.logstash.plist

 

 

 

Kibana를 접속하려면 설정을 변경해야합니다.

 

Kibana 설정이 있는 kibana.yml 파일을 열어줍니다.

sudo vi /usr/local/etc/kibana/kibana.yml

 

 

 

server.port 와 elasticsearch.hosts 라인의 주석을 해제 합니다.

 

기본값으로 진행을 하지만 서버 환경에 맞는 설정으로 수정하면 됩니다.

server.port: 5601
elasticsearch.hosts: ["http://localhost:9200"]

 

 

기본적으로 Kibana server.host는 localhost 로 되어있습니다.

 

외부접속을 허용할 수 있도록 server.host="localhost" 주석을 해제하고 특정 ip를 허용하면 됩니다.

 

0.0.0.0 으로 모든 ip를 허용하도록 처리해보겠습니다.

server.host: "0.0.0.0"

 

 

 

수정 뒤 Kibana를 재시작 합니다.

brew services restart kibana

 

 

 

설정 수정이 완료되었다면 Kibana 상태를 보여주는 페이지이동해 봅니다.

 

정상적으로 설정이 되었다면 아래처럼 페이지 내용이 보여집니다.

http://localhost:5601/status

 

 

이것으로 기본적은 설치를 마무리 하였습니다.

 

728x90
반응형
728x90
반응형

 

최초에 서버 설치를 진행했다면 운영체제 정보도 알 수 있겠지만 기존에 설치되어있는 정보가 궁금할 수 있습니다.

 

현재 설치되어있는 운영체제가 어떤것인지 알아야 환경에 맞는 설정을 할 수 있습니다.

 

 

 

 

커널 정보

Linux의 커널 정보를 보여줍니다.

cat /proc/version

Linux version 3.10.105 (root@build4) (gcc version 4.9.3 20150311 (prerelease) (crosstool-NG 1.20.0) ) #25556 SMP Thu Mar 4 18:00:29 CST 2021

 

 

 

 

시스템 정보

uname 명령어로 시스템 정보를 확인할 수 있습니다.

 

옵션은 아래와 같습니다.

 

옵션이 없을 경우 -s옵션과 같은 결과를 출력합니다.

  • -a, --all : 모든 정보를 출력
  • -s, --kernel-name : 커널 이름을 출력
  • -n, --nodename : 네트워크 노드의 호스트 이름
  • -r, --kernel-release : 커널 release 번호
  • -v, --kernel-version : 커널 버전번호
  • -m, --machine : 하드웨어 이름
  • -p, --processor : 프로세서 타입
  • -i, --hardware-platform : 하드웨어 플렛폼정보
  • -o, --operating-system : 운영체제 정보
uname -a

Linux centos 3.10.105 #25556 SMP Thu Mar 4 18:00:29 CST 2021 x86_64 x86_64 x86_64 GNU/Linux

 

 

 

Linux 배포 정보

centos-release

redhat-release

os-release

system-release

cat /etc/*release

CentOS Linux release 7.6.1810 (Core)                                                                                                   
NAME="CentOS Linux"                                                                                                                    
VERSION="7 (Core)"                                                                                                                     
ID="centos"                                                                                                                            
ID_LIKE="rhel fedora"                                                                                                                  
VERSION_ID="7"                                                                                                                         
PRETTY_NAME="CentOS Linux 7 (Core)"                                                                                                    
ANSI_COLOR="0;31"                                                                                                                      
CPE_NAME="cpe:/o:centos:centos:7"                                                                                                      
HOME_URL="https://www.centos.org/"                                                                                                     
BUG_REPORT_URL="https://bugs.centos.org/"                                                                                              
                                                                                                                                       
CENTOS_MANTISBT_PROJECT="CentOS-7"                                                                                                     
CENTOS_MANTISBT_PROJECT_VERSION="7"                                                                                                    
REDHAT_SUPPORT_PRODUCT="centos"                                                                                                        
REDHAT_SUPPORT_PRODUCT_VERSION="7"                                                                                                     
                                                                                                                                       
CentOS Linux release 7.6.1810 (Core)                                                                                                   
CentOS Linux release 7.6.1810 (Core) 

 

 

 

 

위와같은 명령어를 통해 Linux 운영체제 및 버전 확인 방법을 알아보았습니다.

 

728x90
반응형
728x90
반응형

 

Apple 개발중 인증서가 필요한 상황과 자주 맞닥뜨리게 됩니다.

 

다양한 기능을 추가하거나 연동할 때 필요한 부분이니 자주 사용하게 되는데요.

 

쉽고 간략하게 키체인 인증서를 생성해 보도록 하겠습니다.

 

 

 

 

Launchpad 프로그램을 실행하여 기타 폴더에 들어가보면 있습니다.

 

 

 

 

키체인 접근 프로그램을 실행하고 상단메뉴로 가면 '키체인 접근' 항목이 보여집니다.

 

해당 메뉴에서 인증서 지원 -> 인증 기관에서 인증서 요청... 메뉴를 클릭합니다.

 

 

 

 

사용자 이메일을 작성해주고 '디스크에 저장됨' 항목을 선택 후 계속 버튼을 클릭합니다.

 

 

보관하고 싶은 폴더를 생성하여 저장합니다.

 

기본적으로 CertificateSigningRequest.certSigningRequest 파일명이 지정되어 있지만 파일명을 변경해서 저장해도 상관없습니다.

 

 

 

 

아래 파일처럼 생성이 끝입니다.

 

 

 

다운받아진 파일을 잘 보관하여 다양하게 활용할 수 있습니다.

 

728x90
반응형
728x90
반응형

 

MacPro 2012 를 구매하고 모니터도 좋은걸로 바꿔줬습니다.

 

한쪽은 4k를 지원하지만 28인치, 한쪽은 WQHD를 지원하지만 32인치입니다.

 

32인치가 보기 편해서 주 모니터를 사용하려는데 계속 4k모니터 해상도도 낮은데 이게 주 모니터로 설정되더군요.

 

프로그램을 실행하면 주 모니터 기준으로 열리기 때문에 상당히 불편했습니다.

 

 

 

 

케이블도 바꿔보고 이것저것 시도해봤지만 바보같은 짓 이었습니다 ㅎ

 

간단하게 주로 사용하고 싶은 모니터를 설정 해보도록 하겠습니다.

 

 

 

 

좌측 상단에 애플 로고를 클릭합니다.

 

아래 메뉴가 보여지는데 '시스템 환경설정...' 메뉴로 진입합니다.

 

 

 

 

시스템 환경설정 메뉴들이 보이는데 모니터 설정이 있는 '디스플레이' 메뉴로 진입합니다.

 

 

4개의 탭이 있는데 '정렬' 탭으로 들어가면 현재 연결되어있는 모니터의 위치가 보여집니다.

 

박스를 이동해서 좌우를 변경할 수 있고, 모니터를 미러링해 동일한 화면이 보이도록 설정도 가능합니다.

 

그리고 박스안에 보여지는 흰색 테두리가 중요한 녀석입니다.

 

 

저 흰색 박스를 마우스로 끌어다 원하는 박스에 넣으면 해당 모니터가 주 모니터가 됩니다.

 

 

이렇게 간단한 설정으로 주 모니터를 지정할 수 있습니다.

 

728x90
반응형
728x90
반응형

 

iOS 에서 NavigationViewController 를 사용하면 다양한 옵션들이 있습니다.

 

기본 옵션이지만 상당히 부드럽고 깔끔하죠.

 

Flutter로 개발을 하는 이유는 Android에도 iOS처럼 부드러운 애니메이션 작업이 가능하다는 겁니다.

 

iOS스러운 앱을 만들기 위해 작은 예제를 정리하도록 하겠습니다.

 

 

 

 

 

첫번째로는 iOS 에서 지원하는 LargeTitle NavigationBar 기능을 Flutter로 구현해 보겠습니다.

Navigation Bar Title

 

Scroll시 Large Title에 NavigationBar 에 올려진다

 

 

하나의 StatelessWidget 클래스를 상속하는 Page 클래스를 만들어 줍니다.

 

Scaffold를 리턴해줘야 흰색 배경이 나옵니다.

class ExmaplePage extends StatelessWidget {
	@override
	Widget build(BuildContext context) {
  		return Scaffold();
  	}
}

 

 

 

 

Scaffold의 속성중 body에 NestedScrollView를 넣어줍니다.

 

NestedScrollView 속성에는 headerSliverBuilder가 있는데 이부분에서 CupertinoSliverNavigationBar 위젯을 사용하면 됩니다.

 

NestedScrollView를 감싼다음 body에는 기존에 사용하던 코드를 넣어주면 iOS처럼 멋진 디자인이 보여집니다.

class ExamplePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: NestedScrollView(
        headerSliverBuilder: (context, innerBoxIsScrolled) {
          return [
            CupertinoSliverNavigationBar(
              largeTitle: Text('Example'),
            ),
          ];
        },
        body: Center(
          child: Text("ExamplePage"),
        ),
      ),
    );
  }
}

 

 

 

 

NestedScrollView 또한 physics 속성이 있으니 BouncingScrollPhysics()코드를 넣어 효과를 넣을수도 있습니다.

 

이렇게 기존 iOS 네이티브 디자인을 Flutter코드로 작성해보았습니다.

 

728x90
반응형
728x90
반응형

<본진>('http://bonjin.co.kr'이하 'BONJIN')은(는) 「개인정보 보호법」 제30조에 따라 정부주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다.

 

○ 이 개인정보처리방침은 2021년 3월 26부터 적용됩니다.

 

 

제1조(개인정보의 처리 목적)

 

<본진>('http://bonjin.co.kr'이하 'BONJIN')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 겨우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.

 

1. 홈페이지 회원가입 및 관리

 

회원 가입의사 확인, 회원제 서비스 제공에 따른 본인 식별·인증, 회원자격 유지·관리, 서비스 부정이용 방지 목적으로 개인정보를 처리합니다.

 

 

2. 민원사무 처리

 

민원인의 신원 확인, 민원사항 확인, 사실조사를 위한 연락·통지 목적으로 개인정보를 처리합니다.

 

 

3. 재화 또는 서비스 제공

 

서비스 제공, 콘텐츠 제공, 맞춤서비스 제공, 본인인증을 목적으로 개인정보를 처리합니다.

 

 

4. 마케팅 및 광고에의 활용

 

신규 서비스(제품) 개발 및 맞춤 서비스 제공, 이벤트 및 광고성 정보 제공 및 참여기회 제공 , 서비스의 유효성 확인 등을 목적으로 개인정보를 처리합니다.

 

 

5. 개인영상정보

 

범죄의 예방 및 수사 등을 목적으로 개인정보를 처리합니다.

 

 

 

 

제2조(개인정보의 처리 및 보유 기간)

 

① <본진>은(는) 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다.

 

② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.

 

1.<홈페이지 회원가입 및 관리>

<홈페이지 회원가입 및 관리>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<3년>까지 위 이용목적을 위하여 보유.이용됩니다.

보유근거 : 회원 서비스 제공

관련법령 : 1)신용정보의 수집/처리 및 이용 등에 관한 기록 : 3년

2) 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년

예외사유 :

 

 

제3조(개인정보의 제3자 제공)

 

① <본진>은(는) 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.

 

② <본진>은(는) 다음과 같이 개인정보를 제3자에게 제공하고 있습니다.

 

1. <본진>

개인정보를 제공받는 자 : 본진

제공받는 자의 개인정보 이용목적 : 이메일, 휴대전화번호

제공받는 자의 보유.이용기간: 3년

 

 

제4조(개인정보처리 위탁)

 

① <본진>은(는) 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다.

 

1.

위탁받는 자 (수탁자) :

위탁하는 업무의 내용 :

위탁기간 :

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

 

③ 위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다.

 

 

 

제5조(정보주체와 법정대리인의 권리·의무 및 그 행사방법)

 

 

 

① 정보주체는 본진에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다.

 

② 제1항에 따른 권리 행사는본진에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 본진은(는) 이에 대해 지체 없이 조치하겠습니다.

 

③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.

 

④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.

 

⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.

 

⑥ 본진은(는) 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.

 

 

 

제6조(처리하는 개인정보의 항목 작성)

 

① <본진>은(는) 다음의 개인정보 항목을 처리하고 있습니다.

 

1< 홈페이지 회원가입 및 관리 >

필수항목 : 이메일, 휴대전화번호

선택항목 : 비밀번호, 로그인ID

 

 

제7조(개인정보의 파기)

 

 

① <본진> 은(는) 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다.

 

② 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다.

1. 법령 근거 :

2. 보존하는 개인정보 항목 : 계좌정보, 거래날짜

 

③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.

1. 파기절차

<본진> 은(는) 파기 사유가 발생한 개인정보를 선정하고, <본진> 의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.

 

2. 파기방법

 

전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다

 

 

 

제8조(개인정보의 안전성 확보 조치)

 

<본진>은(는) 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다.

 

1. 정기적인 자체 감사 실시

개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.

 

2. 개인정보 취급 직원의 최소화 및 교육

개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.

 

3. 내부관리계획의 수립 및 시행

개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.

 

4. 해킹 등에 대비한 기술적 대책

<본진>('bonjin')은 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.

 

5. 개인정보의 암호화

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

 

6. 접속기록의 보관 및 위변조 방지

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

 

7. 개인정보에 대한 접근 제한

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

 

 

 

 

제9조(개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항)

 

 

 

① 본진 은(는) 이용자에게 개별적인 맞춤서비스를 제공하기 위해 이용정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다. ② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터내의 하드디스크에 저장되기도 합니다. 가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다. 나. 쿠키의 설치•운영 및 거부 : 웹브라우저 상단의 도구>인터넷 옵션>개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다. 다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다.

 

제10조 (개인정보 보호책임자)

 

① 본진 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.

 

▶ 개인정보 보호책임자

성명 :최태호

직책 :매니저

직급 :매니저

연락처 :01050545654, bonjin.app@gmail.com,

※ 개인정보 보호 담당부서로 연결됩니다.

 

▶ 개인정보 보호 담당부서

부서명 :개인정보 보호 담당

담당자 :최태호

연락처 :01050545654, bonjin.app@gmail.com,

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

 

제11조(개인정보 열람청구)

정보주체는 「개인정보 보호법」 제35조에 따른 개인정보의 열람 청구를 아래의 부서에 할 수 있습니다.

<본진>은(는) 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.

 

▶ 개인정보 열람청구 접수·처리 부서

부서명 :

담당자 :

연락처 : , ,

 

 

제12조(권익침해 구제방법)

 

 

 

정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다.

 

1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr)

2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr)

3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr)

4. 경찰청 : (국번없이) 182 (cyberbureau.police.go.kr)

 

「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정·삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다.

 

※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다.

 

제13조(개인정보 처리방침 변경)

 

 

개인정보처리방침은 2021 3 26부터 적용됩니다.

728x90
반응형

+ Recent posts