728x90

 웹 서비스를 하고 분석 자료를 구하기 위해 구글 어시스트와 같이 유료 서비스가 있지만 결국 Data분석을 별도로 활용하기 어려운 것이 현실이다.

 그래서 대안이 오픈 소스를 활용해서 데이터를 필요에 따라 수집하고 검색하는 것을 구현했다.

 Elasticsearch, Kibana, Beats, Logstach( ELK Stack 이라고도 함 ) 등으로 구성하여 데이터를 확보해서 사이트 맞춤 데이터를 수집하는 것이 그것이다.

 로그를 쌓는 것만하고 실제 구현이후 활용하는 것부터는 구현 프로젝트 진행자들이 경험하기 어려운 것이 업무영역의 한계이다. 

 그래서 오늘을 이것에 대해서 알아보려 한다.


 

 1. ELK 스택이란?

 ELK 스택은 로그 수집, 저장, 검색, 시각화를 위한 오픈소스 기반의 통합 플랫폼이다. 이름은 세가지 주요 구성 요소의 앞글자를 따러 부른다.

  • Elasticsearch (엘라스틱서치): 분산형 검색 및 분석 엔진으로, 대용량의 로그 데이터를 빠르게 검색하고 분석할  수 있습니다.
  • Logstach (로그스태시): 데이터 수집 및 처리 파이프라인 도구로, 다양한 소스에서 데이터를 수집하고 변환하여 Elasticsearch로 전송합니다.
  • Kibana (키바나) : Elasticsearch에 저정된 데이터를 시각화하고 대시보드를 통해 모니터링 할 수 있는 도구입니다.

 이러한 구서은 시스템 로그, 애플리케이션 로그, 보안 로그 등 다양한 로그 데이터를 중앙에서 관리하고 분석하는 데 유용하다.

 

 2. ELK 스택과 유사한 기능을 하는 다른  구성 방법

 ELK 스택과 비슷한 기능을 제공하는 다른 오픈소스 및 상용 솔루션들이 있다.

  • EFK 스택: Logstash 대신 **Fluentd (플루언트디)**를 사용하는 구성으로, 로그 수집 및 전송에 특화되어 있습니다.
  • Graylog (그레이로그): Elasticsearch와 MongoDB를 기반으로 하는 로그 관리 플랫폼으로, 사용자 친화적인 인터페이스를 제공합니다.
  • Splunk (스플렁크): 강력한 로그 분석 및 시각화 기능을 제공하는 상용 솔루션입니다.
  • Datadog (데이터독), New Relic (뉴렐릭): 애플리케이션 성능 모니터링(APM)과 로그 관리를 통합한 클라우드 기반의 상용 서비스입니다.

※ perplexity를 이용한 시장점유율 참고 자료

더보기

※ perplexity를 이용한 사용량 검색하니 실제 그래프는 저작권 때문에 자료 검색이 안되네요. 대신 아래와 같이 알려주었습니다.

- ELK와 경쟁 시스템의 시장 점유율 및 도입률 참고용

 

ELK      ██████████████████████ 45%
Splunk   ████████████           25%
EFK      █████████              15%
Graylog  ██████                 8%
기타      ████                   7%

  스택데이터 수집저장/검색시각화라이선스주요 특징

ELK Logstash/Beats Elasticsearch Kibana 오픈소스 강력한 검색/시각화, 확장성
EFK Fluentd Elasticsearch Kibana 오픈소스 경량 수집, 플러그인 다양
Splunk 자체 수집기 자체 엔진 자체 대시보드 상용 통합 솔루션, 자동화 강점
Graylog 자체 수집기
/Beats
Elasticsearch 자체 대시보드 오픈소스
/상용
쉬운 관리, 플러그인 지원
Prometheus+Grafana 자체 수집기 Prometheus TSDB Grafana 오픈소스 메트릭 특화, Alerting

 

3. 유료/무료 구분 및 오픈소스로 구성하기 좋은 추천
- 오픈소스 기반 (무료):

  • ELK 스택: 강력한 커뮤니티 지원과 다양한 플러그인을 통해 유연한 구성이 가능합니다.
  • EFK 스택: 경량화된 로그 수집 도구인 Fluentd를 활용하여 리소스 효율적인 구성이 가능합니다.
  • Graylog: 사용자 친화적인 인터페이스와 함께 다양한 플러그인을 지원합니다.

- 상용 솔루션 (유료):

  • Splunk: 대규모 환경에서의 로그 분석에 강점을 가지며, 다양한 기업에서 사용되고 있습니다.
  • Datadog, New Relic: 클라우드 기반의 통합 모니터링 및 로그 분석 서비스를 제공합니다.

 오픈소스로 구성하기에 가장 추천하는 것은 ELK 스택인것 같습니다. 다양한 커뮤니티 자료와 플러그인을 통해 유연하게 시스템을 구성할 수 있으며, 대규모 로그 데이터를 효과적으로 처리할 수 있을것 같네요.

 참고로, Cloud 기반으로 시스템 구성시 Fluentd를 사용한 EFK가 좋아 보이네요


4. ELK 스택 데이터를 활용한 AI 챗봇 구성 사례 및 방법
 4.1. 사례:
ELK 스택에 수집된 로그 데이터를 활용하여 AI 챗봇을 구성한 사례 예:

  • 고객 지원 챗봇: 고객의 문의 로그를 분석하여 자주 묻는 질문(FAQ)을 자동으로 생성하고, 이를 기반으로 챗봇이 응답하도록 구성합니다.
  • 시스템 모니터링 챗봇: 시스템 로그를 분석하여 이상 징후를 감지하고, 이를 챗봇을 통해 관리자에게 실시간으로 알립니다.

 4.2. 구성 방법:
   4.2.1. 데이터 수집 및 전처리:

  • Logstash 또는 Fluentd를 사용하여 다양한 소스의 로그 데이터를 수집합니다.
  • 수집된 데이터를 Elasticsearch에 저장하고, 필요한 전처리 작업을 수행합니다.

   4.2.2.  AI 모델 학습:

  • Elasticsearch에 저장된 데이터를 기반으로 자연어 처리(NLP) 모델을 학습시킵니다.
  • 예를 들어, 고객 문의 로그를 분석하여 의도 분류 및 개체 인식 모델을 구축합니다.

   4.2.3.  챗봇 인터페이스 구성:

  • 학습된 AI 모델을 기반으로 챗봇을 개발합니다.
  • 사용자로부터 입력을 받아 모델을 통해 분석하고, 적절한 응답을 제공합니다.

   4.2.4.  시각화 및 모니터링:

  • Kibana를 활용하여 챗봇의 응답 로그 및 사용자 상호작용 데이터를 시각화하고 모니터링합니다.

 시스템 로그 분석을 통한 보안 강화와 최근 AI 도입을 위한 데이터 확보를 통한 챗봇 구성까지 간략하게 정리해 보았습니다. 

 

728x90
728x90

프로젝트 해보니 심플하게 나와서 비슷한게 어떤 것이 있는지 잠시 생각해 봤습니다.

더보기

심심풀이 여담

 스벨렛이 나왔을때 이걸 주로하는 개발자 인터뷰를 본적이 있었습니다. 마치 이천년대 초 초기 웹서비스 만들던 때와 유사한 코드를 보면서 과연 이게 장점이 될수 있을까 ? 왜 장점이 되지 라는 생각을 했습니다.

 테스트 코드에 대해서 빠르게 해볼 수 있다는 장점을 본다면 상용서비스를 기획해서 만드는 사람입장에서 약간 의아할 수 있다 생각들었습니다.

 또 react를 보고 vue를 해본사람이 하기 쉽다는 말을 들었을때 과연 vue가 뭐길래...

 그리고 파이썬으로 스크랩핑과 웹서비스 장고를 만들어 보고 ... 이러저러한 것을들 해본적이 있었는데, 때 마침 vue가 궁금해져서 pinia 상태관리를 가지고 게시판을 한번 만들어 보고 싶었습니다.

 react를 해본 사람이 vue를 해보면 더 쉽다. 그리고 jsp와 기타 axios등 부가적인 내용들을 기본적으로 알고 있는 사람이라면 더욱 쉽다. 

 그럼 이걸로 뭘 할 수 있지? 샘플 코드 짜보는 것을 쉽겠다 라는 생각이 들었습니다. 

 그래서 해본건데 확실히 요즘 개발하기 쉬운 환경이 되어있네요.

자 그럼 간단하게 정리를 해보면 vue 는 한 페이지에 html 과 파라메터 입력이 같이 되는 것이다 라는 한줄 소감을 추가하고 싶네요.

세부 문법이나 표현의 미려함을 담기에는 조금더 사용해 봐야 겠지만 특성을 경험하기에는 이번 예제도 좋다고 생각들어 다시 정리해 봅니다.

 

1. 프로젝트 구조

2025.04.24 - [프로그램/vue] - vue3 pina 크린아키텍쳐 적용 샘플 플젝

 

vue3 pina 크린아키텍쳐 적용 샘플 플젝

react 처음 사용할때 뷰와 유사하다는 말을 많이 들었지만 막상 프로그램을 만들어본적이 없어 샘플 프로젝트를 진행해 보았다. 기본폴더구조더보기src/├── assets/ # 이미지, 폰트, CSS 등 정적

jsi0.tistory.com

 

2. vue에 라우터 적용

2025.04.29 - [프로그램/vue] - vue router

 

vue router

단계별로 글을 적어야 나중에 분리해서 다른 사람에게 알려주기 쉬울것 같아서 중간 정리를 했습니다. 가장 쉽게 vue router 이해하기더보기/src/main.js ( use(router) 사용 ) ... import router from './router' cre

jsi0.tistory.com

 

3. 목업 게시판 vue

vue_moc_board_files.zip
0.20MB

 

이글을 보러 오신분들이라면 간단하게 돌려보면서 소스를 따라가는 것이 좋을 것이라 생각해서 전체를 공유합니다.

 

4. api 연동 vue

vue_api_board_files.zip
0.20MB

/src/router/index.js       # 라우팅 정보
/src/stores/boardStore.js  # 상태와 axios 를 통한 api 호출부
/src/views/boards/BoardDetail.vue  # 게시글 읽기
/src/views/boards/BoardForm.vue    # 쓰기, 수정하기
/src/views/boards/BoardList.vue    # 목록
/src/App.vue               # 라우터 뷰등록
/src/axios.js              # api 경로
/main.js                   # pinia, router 사용

어려워야 뭔가 더 열심히 파헤쳐 볼 것 같은데 쉽게 되어 보시는 분에게 도움이 될 만한 설명이 필요한지 모르겠네요.

 

5. 파이썬 api

python_flask_sqlite_board_files.zip
0.00MB

 

파이썬으로 sqlite flask를 이용한 api 구현 했습니다.

파이썬 v3이상에서는 sqlite가 기본 지원하고 있고 flask가 가벼운 웹서비스가 가능하기 때문에 선택해서 만들었습니다.

더보기
from flask import Flask, request, jsonify
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
import os
import sqlite3


app = Flask(__name__)
CORS(app, origins=["http://localhost:8080"])

# SQLite DB 설정
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(BASE_DIR, 'board.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# 게시글 모델
class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)

    def to_dict(self):
        return {
            'id': self.id,
            'title': self.title,
            'content': self.content
        }

# DB 초기화
appHasRunBefore:bool = False

@app.before_request
#@ app.before_first_request
def create_tables():
    db.create_all()
    appHasRunBefore = True


# 게시글 목록 조회
@app.route('/api/posts', methods=['GET'])
def get_posts():
    print('/api/posts *** get_posts()')
    posts = Post.query.all()
    return jsonify([p.to_dict() for p in posts])

# 게시글 단건 조회
@app.route('/api/post/<int:post_id>', methods=['GET'])
def get_post(post_id):
    print('/api/posts/post_id *** get_post()')
    post = Post.query.get_or_404(post_id)
    return jsonify(post.to_dict())

# 게시글 등록
@app.route('/api/posts', methods=['POST'])
def create_post():
    print('/api/posts *** create_post()')
    data = request.get_json()
    post = Post(title=data['title'], content=data['content'])
    db.session.add(post)
    db.session.commit()
    return jsonify(post.to_dict()), 201

# 게시글 수정
@app.route('/api/posts/<int:post_id>', methods=['PUT'])
def update_post(post_id):
    print('/api/posts/post_id **PUT* update_post()')
    post = Post.query.get_or_404(post_id)
    data = request.get_json()
    post.title = data['title']
    post.content = data['content']
    db.session.commit()
    return jsonify(post.to_dict())

# 게시글 삭제 (선택사항)
@app.route('/api/posts/<int:post_id>', methods=['DELETE'])
def delete_post(post_id):
    post = Post.query.get_or_404(post_id)
    db.session.delete(post)
    db.session.commit()
    return jsonify({'message': 'Deleted'})

# 헬스 체크크
@app.route('/', methods=['GET'])
def get_helth():
    return jsonify({'message': 'server live'})

if __name__ == '__main__':
    app.run(debug=True)

 

※ sqlite 참고 : DB사용은 기본은 비슷하니 참고하시면 될 것 같습니다. 

엑셀파일 비교 간단 개념이해

: 물리적 DB 파일 == 엑셀 파일, 테이블 == 엑셀.시트, 컬럼 == 엑셀.시트.열, 데이터1row = 엑셀.시트.행

DB 사용 방법 이해

: 물리적 파일 연결 -> 커서 -> 테이블 -> CRUD -> COMMIT -> 닫기

2025.04.26 - [프로그램/python&&AI] - python에서 SQLite

 

python에서 SQLite

DataBase에 아직 개념이 없는 사람에게 쉽게 경험해 볼수 있는 것을 찾다가 Python에서 sqlite3 라이브러리를 기본 제공해서 바로 사용할 수 있다고 해서 정리해 보았다. 예제1 일반예제더보기import sqli

jsi0.tistory.com

 

728x90

'프로그램 > vue' 카테고리의 다른 글

vue router  (0) 2025.04.29
vue3 pina 크린아키텍쳐 적용 샘플 플젝  (0) 2025.04.24
728x90

단계별로 글을 적어야 나중에 분리해서 다른 사람에게 알려주기 쉬울것 같아서 중간 정리를 했습니다.

 

가장 쉽게 vue router 이해하기

더보기

/src/main.js   ( use(router) 사용 )

  ...

   import router from './router'

   createApp(App).use(router).mount('#app')

   ...

 

/src/App.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>
<script>
export default {
  name: 'App',
}
</script>

 

/src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import BoardList from '@/views/boards/BoardList.vue'
import BoardDetail from '@/views/boards/BoardDetail.vue'
import BoardForm from '@/views/boards/BoardForm.vue'

const routes = [
  { path: '/', redirect: '/boards' },
  { path: '/boards', name: 'BoardList', component: BoardList },
  { path: '/boards/:id', name: 'BoardDetail', component: BoardDetail },
  { path: '/write', name: 'BoardCreate', component: BoardForm },
  { path: '/edit/:id', name: 'BoardEdit', component: BoardForm }
]

const router = createRouter({
  history: createWebHistory(),
  routes,
})

export default router;

 

각화면 소스경로 '@' 사용 설정

/vue.config.js

const path = require('path')
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack:{
    resolve:{
      alias:{
        '@':path.resolve(__dirname,'src')
      }
   
    }
  }
})

vue 를 처음 사용해본다면 문법적인것은 받아들이면 될 것 같고, react를 해본 사람은 어려운 내용은 없어 보이네요.

728x90

'프로그램 > vue' 카테고리의 다른 글

vue python sqlite 게시판  (0) 2025.04.30
vue3 pina 크린아키텍쳐 적용 샘플 플젝  (0) 2025.04.24
728x90

DataBase에 아직 개념이 없는 사람에게 쉽게 경험해 볼수 있는 것을 찾다가 Python에서 sqlite3 라이브러리를 기본 제공해서 바로 사용할 수 있다고 해서 정리해 보았다.

 

예제1 일반예제

더보기

import sqlite3

# 1. DB 연결
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 2. 테이블 생성
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
    )
''')

# 3. 데이터 삽입
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('영희', 22))

# 4. 데이터 조회
cursor.execute('SELECT * FROM users')
for row in cursor.fetchall():
    print(row)

# 5. 저장 및 종료
conn.commit()
conn.close()

 

예제2 crud예제

더보기

import sqlite3

# 1. 데이터베이스 연결
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 2. 테이블 만들기
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
    )
''')

# 3. 데이터 추가 (Create)
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('철수', 12))
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('영희', 11))

# 4. 데이터 조회 (Read)
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
print('초기 데이터:')
for row in rows:
    print(row)

# 5. 데이터 수정 (Update)
cursor.execute('UPDATE users SET age = ? WHERE name = ?', (13, '철수'))

# 6. 데이터 삭제 (Delete)
cursor.execute('DELETE FROM users WHERE name = ?', ('영희',))

# 7. 수정 후 데이터 조회
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
print('수정 후 데이터:')
for row in rows:
    print(row)

# 8. 저장하고 연결 닫기
conn.commit()
conn.close()

예제 설명

더보기
- 일반적으로 설명이 필요없는 단순 내용이지만 DB자체 경험이 없다면 코드로 인식이 어려울수 있으니 설명을 한다면 다음과 같다.

단계설명
1단계 sqlite3.connect('example.db') 로 데이터베이스 파일 연결
2단계 CREATE TABLE 문으로 users 테이블 만들기
3단계 INSERT INTO 문으로 데이터 추가 (철수 12살, 영희 11살)
4단계 SELECT * FROM users 로 데이터 조회 후 출력
5단계 UPDATE 문으로 철수 나이를 13살로 변경
6단계 DELETE 문으로 영희를 삭제
7단계 변경된 데이터를 다시 조회해서 출력
8단계 commit() 하고 close() 로 연결 종료
728x90

+ Recent posts