728x90

🤖 딥러닝이란?

딥러닝은 데이터를 통해 스스로 학습하고 판단하는 인공지능 기술이에요.
사람의 뇌 구조를 본뜬 '인공 신경망'을 이용해 이미지, 소리, 텍스트 등 다양한 정보를 분석하죠.
우리가 흔히 쓰는 넷플릭스 추천, 포토앱의 자동 분류도 다 딥러닝 덕분!


🛠️ 케라스란?

케라스(Keras)는 복잡한 딥러닝 모델을 쉽고 간결한 코드로 구현할 수 있게 도와주는 파이썬 기반 도구예요.
복잡한 수학 없이도, 딥러닝을 '만들고 실행'까지 가능하게 해줘서 입문자에게 최고예요!


📐 딥러닝 기본 구조 (한눈에 보기)

  • 입력층: 예를 들어, 28x28 이미지 픽셀
  • 은닉층: 데이터의 특징을 추출
  • 출력층: 숫자/이미지/문자 등 예측 결과 제공

💻 직접 만들어보는 AI 모델 (코랩 실습 예시)

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten

# 1) 데이터 준비
:contentReference[oaicite:7]{index=7}
:contentReference[oaicite:8]{index=8}
:contentReference[oaicite:9]{index=9}

# 2) 모델 구성
model = Sequential([
    :contentReference[oaicite:10]{index=10}
    :contentReference[oaicite:11]{index=11}
    :contentReference[oaicite:12]{index=12}
])

# 3) 컴파일
:contentReference[oaicite:13]{index=13}
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 4) 학습
:contentReference[oaicite:14]{index=14}

# 5) 평가
:contentReference[oaicite:15]{index=15}
:contentReference[oaicite:16]{index=16}

구글 코랩에 붙여넣기만 하면 바로 실행 가능! 🤩


🎯 왜 코랩 & 케라스인가?

  • 💸 무료 GPU 지원
  • ⏱ 빠른 실행 속도
  • 💬 초보자도 이해할 수 있는 직관적인 코드

🔜 다음 단계로는?

🧠 CNN (Convolutional Neural Network)

  • 이미지 처리 특화된 딥러닝 구조예요.
  • 필터(커널)를 통해 사진 속 윤곽, 모양, 패턴을 잡아냅니다.
  • 예: 얼굴 인식, 자율주행 자동차, X-ray 판독 등에 활용

🧠 RNN (Recurrent Neural Network)

  • 시간 순서를 고려하는 네트워크로, 텍스트나 음성 처리에 강력해요.
  • 과거 데이터를 기억하며 문맥을 이해할 수 있어요.
  • 예: 자동 번역기, 음성 인식, 감정 분석 등에 사용

💬 챗봇, 추천 시스템

  • 지금 여러분이 보고 있는 챗GPT도 딥러닝 기반이에요!
  • 추천 시스템은 유튜브, 넷플릭스처럼 사용자 취향 분석 후 콘텐츠 추천
  • 이런 응용 모델들은 CNN, RNN 기술을 응용해 만든 고급 AI 시스템이랍니다.

🏷️ 태그:

#AI트렌드 #딥러닝쉽게배우기 #구글코랩입문 #케라스튜토리얼
#캐글시작하기 #스마트기술 #AI초보탈출 #딥러닝은재밌다

728x90
728x90

인공지능의 정의

인공지능(Artificial Intelligence, AI)이란 인간의 지적 능력을 컴퓨터에서 구현한 기술로, 다양한 소프트웨어와 시스템이 포함됩니다. 이 개념은 1956년 미국 다트머스 회의에서 존 매카시에 의해 공식화되었습니다. 그는 "기계를 인간처럼 행동하게 만드는 것"이라 정의했습니다.

인공지능의 역사

  • 앨런 튜링은 컴퓨터도 사고할 수 있다는 주장을 제시하며, '튜링 테스트'를 고안했습니다. 이 테스트는 지금도 AI 판별 기준으로 쓰입니다.

인공지능의 발전

  • 1956년 다트머스 회의: 존 매카시가 '인공지능(AI)'이라는 용어를 처음으로 사용하며, AI 연구의 시초가 되었습니다.
  • 앨런 튜링의 기여: ‘튜링 테스트’를 통해, 기계가 사람처럼 사고할 수 있는지 평가하는 기준을 제시하며 AI의 철학적 기반을 마련했습니다.

🚀 1990년대 ~ 2010년대의 발전

  • 빅데이터와 GPU의 등장: 1990년대 후반~2000년대, 저장 장치와 컴퓨팅 파워의 발전으로 데이터 기반 AI가 가능해졌습니다.
  • 딥러닝의 등장: 2012년, 이미지넷(ImageNet) 대회에서 딥러닝 기반 모델 'AlexNet'이 기존 모델을 압도하면서 딥러닝이 본격적으로 각광받기 시작했습니다.

📈 2020년대 이후의 인공지능

  • 초거대 AI 모델의 시대:
    • 구글의 BERT, OpenAI의 GPT 시리즈, 메타의 LLaMA 등 수십억~수천억 파라미터를 가진 언어모델이 탄생했습니다.
    • 이 모델들은 검색, 번역, 이미지 생성, 코딩, 교육 등 다양한 분야에서 활용되며 범용 인공지능(AGI)의 가능성까지 논의되고 있습니다.
  • 멀티모달 AI:
    • 텍스트, 이미지, 음성 등 다양한 데이터를 동시에 처리할 수 있는 AI 기술이 발전하고 있습니다. 대표적으로 GPT-4, Gemini, Claude 등은 텍스트와 이미지 이해를 동시에 수행할 수 있습니다.
  • 생성형 AI의 상용화:
    • ChatGPT, Midjourney, Runway ML, DALL·E, Sora 등 다양한 생성형 AI 도구들이 일상과 산업에 보급되고 있습니다.
    • 콘텐츠 제작, 마케팅, 게임 개발, 의료 등 다양한 산업에서 AI가 창의적 도구로 활용되고 있습니다.

🌍 사회적 변화와 윤리

  • AI 윤리와 규제: 기술의 발전과 함께 AI의 책임, 공정성, 투명성, 저작권 문제 등을 다루는 윤리적 논의가 활발히 진행되고 있으며, 유럽연합(EU) 등은 AI 법안을 제정 중입니다.
  • 일자리 변화: 반복적이고 단순한 작업은 자동화되고, 창의적/분석적인 업무에 AI가 협력자로 투입되며, 직업 구조에 변화가 생기고 있습니다.

자율제조 인공지능

  • 자율제조 AI는 제조현장에서 데이터를 바탕으로 설비 제어, 이상 감지, 품질 분석 등을 자동으로 수행하는 기술입니다.
  • 주요 기술: 비전 AI 기반 불량 검출, 센서 데이터 분석, CNN으로 이미지 인식, RNN으로 생산 예측
  • 스마트팩토리와 연계되어 실시간 공정 최적화와 인력 최소화를 실현합니다.

머신러닝의 종류

  • 지도학습: 정답 데이터를 기반으로 학습 (SVM, 결정트리 등)
  • 비지도학습: 정답 없이 패턴 탐지 (군집화 등)
  • 강화학습: 보상을 통해 행동 전략을 스스로 학습

강화학습의 개념

  • 보상을 통해 학습을 진행하며, 시계열 행동을 최적화합니다.
  • 게임, 로봇 제어, 물류 시스템 최적화 등에 활용됩니다.

딥러닝의 구조

  • 인간의 뇌를 모방한 인공신경망(ANN)을 기반으로 구성
  • 입력층 → 은닉층(hidden layer) → 출력층으로 이루어지며, 비선형 문제 해결에 탁월

DNN의 발전

  • 은닉층이 많은 딥 신경망(DNN)은 다양한 특성 학습에 강점을 가집니다.
  • 응용 모델: CNN(이미지), RNN(시계열), LSTM, GRU 등

CNN의 특징

  • 이미지 인식에 탁월한 신경망
  • Convolution + Pooling + FC layer로 구성
  • 얼굴 인식, 불량 검출, 자율주행 비전 등에 활용

RNN의 활용

  • 시간 흐름에 따른 데이터(텍스트, 음성 등)에 강력
  • 과거 입력을 현재 예측에 반영하는 구조

케라스(Keras) 소개

  • Python 기반 딥러닝 라이브러리
  • TensorFlow 백엔드를 사용하며, 간단한 코드로 강력한 모델 구현 가능
  • 대표 함수: compile(), fit(), evaluate(), predict()

딥러닝 모델 구성 순서

  1. 데이터셋 생성: 원본 데이터를 전처리해 훈련/검증/시험셋 생성
  2. 모델 구성: Sequential 또는 함수형 API로 모델 설계
  3. 학습 설정: 손실함수, 옵티마이저 정의
  4. 모델 학습: fit() 함수로 훈련 수행
  5. 성능 평가: evaluate() 함수 사용
  6. 결과 예측: predict() 함수로 출력 도출

📥 정리된 PPT 파일 다운로드

이번 포스팅에서 소개한 인공지능과 딥러닝에 대한 내용을 한눈에 보기 쉽게 PPT로 정리해두었습니다.
강의자료, 스터디, 발표 등에 활용하고 싶으신 분들은 댓글로 메일 주소 남겨주시면 등록하겠습니다.
등록후에 아래 링크를 통해 다운로드하실 수 있어요.
https://drive.google.com/drive/folders/1S8dv7zUDu6e5cpcIxICC_NHCg_hL3eqB?usp=sharing

728x90
728x90

✅ OPC UA란?

**OPC UA (OPC Unified Architecture)**는 제조 장비와 시스템 간 안전하고 신뢰성 높은 데이터 통신을 가능하게 하는 산업용 통신 표준입니다. 기존의 OPC(Classic)와 달리 플랫폼 독립적이며, 보안, 확장성, 데이터 모델링 기능이 강화되어 있습니다.


🔧 OPC UA 구조 (쉽게 설명)

1. 서버(Server) - 데이터를 제공하는 쪽

  • PLC, 센서, 로봇 등 실제 장비에 설치됨
  • 내부의 변수(예: 온도, 속도, 상태 등)를 OPC UA 객체로 외부에 제공

2. 클라이언트(Client) - 데이터를 읽거나 제어하는 쪽

  • HMI, SCADA, MES, 분석 시스템 등
  • OPC UA 서버에 접속하여 실시간 데이터를 구독하거나 값을 변경함

3. 정보 모델(Information Model)

  • 데이터들이 단순한 값이 아닌 구조화된 객체로 표현됨 (예: ‘모터 → 속도, 전류, 상태’ 식)

4. 통신 방식

  • TCP/IP 기반으로 통신
  • 보안(암호화, 인증), 데이터 구독(Subscription), 이력 저장(History Access) 등을 지원

🖥️ Python OPC UA 서버 코드

from opcua import Server
from datetime import datetime
import random
import time

# OPC UA 서버 생성
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

# 네임스페이스 등록
uri = "http://example.org/opcua"
idx = server.register_namespace(uri)

# 객체 생성: Sensor
objects = server.get_objects_node()
sensor = objects.add_object(idx, "MySensor")

# 변수 생성
temperature = sensor.add_variable(idx, "Temperature", 25.0)
humidity = sensor.add_variable(idx, "Humidity", 40.0)

# 외부에서 값을 쓸 수 있도록 설정
temperature.set_writable()
humidity.set_writable()

# 서버 시작
server.start()
print("OPC UA 서버 실행 중...")

try:
    while True:
        # 가상의 데이터 업데이트
        temp_val = round(random.uniform(20, 30), 2)
        hum_val = round(random.uniform(35, 60), 2)

        temperature.set_value(temp_val)
        humidity.set_value(hum_val)

        print(f"{datetime.now()} → Temp: {temp_val}°C, Humidity: {hum_val}%")
        time.sleep(2)

except KeyboardInterrupt:
    print("서버 종료 중...")
    server.stop()

 

📡 주요 기능 설명

항목 설명
set_endpoint 클라이언트가 접속할 수 있는 서버 주소 (IP, 포트) 설정
register_namespace 사용자 정의 네임스페이스 URI 등록
add_object, add_variable OPC UA 구조 내 객체 및 변수 생성 (노드 구성)
set_value() 주기적으로 변수 값을 갱신하여 클라이언트에 실시간 데이터 제공

💡 예제: Python으로 OPC UA 클라이언트 만들기

아래는 Python에서 opcua 라이브러리를 활용해 실제 값을 읽는 간단한 예시입니다.

from opcua import Client

# OPC UA 서버 주소 (예: 장비 또는 시뮬레이터)
url = "opc.tcp://localhost:4840"

# 클라이언트 생성 및 접속
client = Client(url)
client.connect()
print("서버에 연결되었습니다.")

# 노드(변수) 지정: Node ID는 장비마다 다름
node = client.get_node("ns=2;s=Temperature")  # 예: 온도 변수
value = node.get_value()
print(f"현재 온도 값: {value}")

client.disconnect()

이 코드는 OPC UA 서버에 연결하여 "Temperature"라는 변수 값을 읽어옵니다.

 

https://www.youtube.com/watch?v=Em_Gx0rWc5U

 


🧪 실습용 무료 서버 추천

  • Prosys OPC UA Simulation Server
    윈도우에서 무료로 제공, 다양한 변수 제공
  • Unified Automation UA Expert
    전문 OPC UA 클라이언트 툴로 실시간 확인 가능
  • FreeOPCUA (Python 서버 구현)
    Python 기반 OPC UA 서버도 직접 구현 가능

📦 활용 예시 (현장 중심)

분야 예시 사용
제조라인 장비 온도/속도/불량률 실시간 수집
에너지 태양광 인버터 상태 모니터링
물류 AGV, 컨베이어 센서 상태 모니터링
스마트팩토리 MES ↔ PLC 연동, 에너지 절감 분석 등
 

https://www.youtube.com/watch?v=ZlJCuAeGPis

 

728x90
728x90

3.1 버퍼 락의 필요성

오라클은 다수의 프로세스가 동시에 같은 데이터 블록을 읽고/쓰는 상황에서도 데이터 무결성과 동기화를 보장해야 한다. 만약 여러 프로세스가 동일한 버퍼를 변경한다면, 데이터 손상이나 충돌이 발생할 수 있다. 이를 방지하기 위해, 오라클은 Buffer Lock이라는 내부 락 메커니즘을 제공한다.

🔐 동시 접근 방지

  • 프로세스가 캐시된 버퍼 블록을 읽거나 변경하려면 먼저 해당 블록의 Buffer Lock을 획득해야 한다.
  • 버퍼 내용을 읽을 때는 Shared 모드, 변경할 때는 Exclusive 모드로 락이 설정된다.

🧠 이는 파일 시스템에서 읽기/쓰기 락을 거는 것과 유사하다.


3.2 버퍼 락 획득 과정

  1. 해시 체인 래치 획득: 버퍼를 찾기 위해 먼저 해시 버킷을 따라가는 체인 구조 접근 시 래치를 사용.
  2. 버퍼 블록 탐색: 요청 블록을 체인에서 탐색.
  3. 버퍼 락 확인:
    • 이미 다른 프로세스가 Buffer Lock을 Exclusive 모드로 점유 중이라면,
    • 현재 프로세스는 버퍼 락 대기자 목록에 등록되어 대기한다.
  4. 락 해제 감지 후 재시도: 기존 프로세스가 락을 해제하면, 대기 중이던 프로세스가 락을 획득한다.

3.3 블록 클린아웃(Block Cleanout)

오라클은 다중 트랜잭션 환경에서 **일관된 읽기(Read Consistency)**를 유지하기 위해 Undo를 사용한다. 하지만 한 번 트랜잭션이 커밋되면, 나중에 그 블록을 읽는 사용자가 해당 정보를 Undo에서 찾지 않도록, 해당 블록에 커밋 정보를 반영하는 작업을 수행한다. 이 작업을 블록 클린아웃이라 부른다.

  • 클린아웃은 SELECT 시점이나 백그라운드에서 수행될 수 있다.
  • 클린아웃 중에는 블록 수정이 발생하므로 Buffer Lock이 필요하다.

🔄 이 과정은 읽기 작업임에도 일시적으로 블록이 "쓰기 락" 상태로 바뀔 수 있다.


3.4 버퍼 핸들과 Pin 설정

📦 버퍼 핸들(Buffer Handle)이란?

  • 버퍼 헤더의 포인터를 통해 참조되는 구조체로, 특정 블록의 접근 제어 정보를 담고 있다.
  • 각 프로세스는 버퍼 핸들을 통해 블록을 Pin하여 사용.

🔗 Pinning의 과정:

  • 프로세스가 버퍼 핸들을 획득하면 헤더에 있는 소유자 리스트에 연결된다.
  • 이 리스트에 등록됨으로써, 해당 프로세스가 블록을 사용하는 동안 다른 프로세스가 블록을 교체하지 못하게 한다.

3.5 Buffer Pinning의 장점

Buffer Pinning은 논리적 블록 읽기(Logical Block Read) 시 발생하는 불필요한 작업을 제거하여 성능을 획기적으로 향상시킨다.

🌟 효과:

  • 해시 체인 래치 재획득 없이 블록을 연속해서 참조 가능
  • 재검색 없이 캐시에 유지된 블록을 직접 재사용 가능

🔁 CPU와 메모리 자원을 절약하며, 특히 반복적인 액세스가 많은 인덱스 스캔에서 효과적이다.


3.6 인덱스 리프 블록과 Range Scan

📌 인덱스 리프 블록이란?

  • B-Tree 인덱스 구조에서, 실제 인덱스 항목들이 저장되는 최하위 블록.
  • 데이터베이스에서 인덱스를 통해 WHERE 조건을 만족하는 값을 찾을 때 참조된다.

🔍 Index Range Scan의 I/O 증가 원인

  • 인덱스 리프 블록은 여러 개로 나뉘어 있어 여러 블록을 순차적으로 탐색해야 함.
  • 매번 새로운 블록을 읽어야 하므로 디스크 I/O가 늘어날 수 있다.

3.7 Buffer Pinning으로 I/O 감소하는 원리

Buffer Pinning은 인덱스 리프 블록 같이 빈번하게 반복 접근되는 블록을 메모리에 고정시켜, 불필요한 디스크 접근을 줄여준다.

🔧 원리 요약:

  1. 첫 번째 액세스 시 블록을 버퍼 캐시에 로드하고 핀 설정
  2. 이후 동일 세션에서 동일 블록 재접근 시
    • 해시 체인 탐색, 래치 획득 없이 직접 재사용 가능
    • 디스크 I/O 생략 가능

📈 인덱스 기반 검색이 많은 OLTP 환경에서는 Buffer Pinning이 성능 최적화의 핵심이 될 수 있다.


📎 관련 태그

#Oracle #BufferLock #BufferPinning #Latch #BlockCleanout #IndexLeafBlock #RangeScan #LogicalRead #DatabasePerformance #ConcurrencyControl #SGA

728x90
728x90

2.1 Database Buffer Cache 구조

Database Buffer Cache는 오라클의 핵심 메모리 영역으로, 디스크 I/O를 줄이고 SQL 실행 성능을 높이기 위한 캐시 역할을 한다. 디스크에서 데이터를 읽을 때는 블록 단위 I/O가 수행되며, 이 블록들은 버퍼 캐시에 로드된다.

🔍 블록 식별 구조: 해시 버킷과 체인

  • 오라클은 데이터 블록을 빠르게 찾기 위해 해시 테이블을 사용한다.
  • 해시 테이블의 각 엔트리는 **해시 버킷(Hash Bucket)**이며, 동일 해시값을 가진 블록들은 **연결 리스트(체인)**로 연결된다.
  • 각 체인은 **버퍼 헤더(Buffer Header)**를 통해 연결되며, 이 버퍼 헤더는 해당 블록의 위치, 상태, LRU 및 해시 체인 포인터 등을 포함한다.
  • 사용자가 특정 블록을 요청하면, 오라클은 해당 블록의 주소를 해시 함수로 계산하여 버킷을 찾고, 그 버킷에 연결된 체인을 따라가며 원하는 블록을 탐색한다.
-- 해시 버킷 개수 확인 SQL 예시
SELECT name, value FROM v$parameter WHERE name = 'db_block_hash_buckets';

🎯 체인 탐색 비용 최소화 전략: 하나의 체인에 여러 버퍼가 걸리면 탐색 비용이 증가하므로, 하나의 체인에 하나의 버퍼만 걸리는 것을 이상적인 상태로 본다. 이를 위해 해시 버킷 수를 충분히 확보하고, 해시 분포가 균등해야 한다.


2.2 Latch(래치) 메커니즘

Buffer Cache는 다수의 세션이 동시에 접근하는 공유 영역이기 때문에, **자료구조에 대한 직렬화(Serialization)**가 필수적이다. 이 역할을 수행하는 것이 바로 **래치(Latch)**이다.

✅ 래치의 특징

  • 래치는 데이터 보호가 아닌, SGA의 공유된 내부 자료구조 보호를 위한 경량 락이다.
  • 사용 시점:
    • 해시 체인을 스캔할 때
    • 버퍼 블록을 추가하거나 제거할 때
    • LRU 리스트를 갱신할 때
  • 래치는 매우 빠르게 작동하는 Spin Lock 형태로 구현되어, 짧은 시간 동안만 유지되며 빠른 자원 접근을 보장한다.

🔄 오라클에서 '읽기 전용 모드'란 단순히 SELECT 문을 실행하는 것이 아니라, 해시 체인을 따라가며 필요한 블록을 찾는 작업 전체를 의미한다. 이 모든 탐색 작업은 래치의 보호 하에 수행된다.


2.3 LRU 체인 구조

Buffer Cache는 재사용 정책을 위해 LRU (Least Recently Used) 리스트를 사용한다. 이 리스트는 크게 두 가지로 나뉜다:

  • Dirty List:
    • 수정된 블록으로, 아직 디스크에 쓰이지 않음.
    • DBWR 프로세스가 디스크에 플러시하기 전까지 유지됨.
  • LRU List:
    • 아직 변경되지 않았거나, 이미 디스크에 반영된 블록들.
    • 재사용 대상이며, 새로운 블록을 로드할 때 가장 오래된 것부터 제거됨.

📌 버퍼 헤더는 이 두 리스트 중 하나에 반드시 소속되어 있으며, 리스트 간 이동 또한 래치의 보호 하에 수행된다.


2.4 버퍼 상태의 3가지 유형

Buffer Cache의 각 블록은 다음 세 가지 상태 중 하나로 존재한다:

상태설명

Free Buffer 어떤 데이터도 없는 초기 상태의 블록. 재사용 가능.
Dirty Buffer 변경되었지만 아직 디스크에 반영되지 않은 블록. DBWR 대상.
Pinned Buffer 현재 세션이 사용 중인 블록. 다른 세션에서 접근 불가.

📘 이 상태들은 Buffer Management, Dirty List 처리, 세션 동기화에 모두 관여하며 성능에 직결되는 요소이다.


2.5 요약 및 실무 팁

  • Buffer Cache는 블록 단위 I/O를 캐싱하여 성능 향상을 꾀한다.
  • 해시 테이블 + 체인 구조를 통해 빠르게 원하는 블록에 접근 가능하다.
  • 버퍼 헤더는 블록 메타데이터와 해시 체인 및 LRU 포인터를 포함하여 탐색과 관리에 핵심적이다.
  • 래치는 SGA 자료구조 보호를 위한 경량 락으로, 모든 체인 탐색, 버퍼 이동 시점에 사용된다.
  • LRU는 Dirty와 Clean 리스트로 구성되어 버퍼 교체 정책을 제어한다.
  • 각 블록은 Free, Dirty, Pinned 상태를 가지며, 이를 통해 작업 흐름이 제어된다.

📎 관련 태그

#Oracle #SGA #BufferCache #Latch #HashChain #LRU #DirtyBuffer #PinnedBuffer #FreeBuffer #BlockIO #BufferHeader #DatabasePerformance #OracleMemoryArchitecture

728x90
728x90

1.1 오라클을 배우기 전에

오라클 데이터베이스는 기업에서 가장 널리 사용되는 RDBMS 중 하나로, 안정성과 성능, 확장성을 기반으로 다양한 산업군에서 활용되고 있다. 오라클을 제대로 배우기 위해서는 단순히 SQL을 실행하는 수준을 넘어, 내부 구조와 아키텍처를 이해하는 것이 중요하다. 이 장에서는 오라클의 핵심 구성 요소들과 이들이 어떤 원리로 작동하는지에 대해 직관적으로 설명한다.


1.2 오라클 아키텍처 개요

오라클 데이터베이스는 크게 두 가지 구성 요소로 이루어진다:

  • 오라클 인스턴스: 메모리 구조(SGA 등)와 백그라운드 프로세스
  • 오라클 데이터베이스: 실제 데이터가 저장되는 파일들의 집합

🔹 인스턴스 = SGA + 백그라운드 프로세스


1.3 SGA(System Global Area)

SGA는 오라클 인스턴스가 작동하기 위해 사용하는 공유 메모리 공간으로, 여러 세션이 동시에 접근하며 SQL 실행, 데이터 캐시, 트랜잭션 처리를 돕는다.

주요 구성 요소:

  • Database Buffer Cache: 디스크에서 읽어온 데이터 블록을 임시로 저장. 반복 조회 시 성능 향상.
  • Redo Log Buffer: 트랜잭션의 변경 내역을 일시 저장. 복구에 사용됨.
  • Shared Pool: SQL 실행 계획, PL/SQL 코드 등을 캐싱하여 파싱 부담 줄임.
  • Large/Java Pool: 병렬 처리, Java 실행을 위한 메모리.

💡 Dirty Buffer란? Buffer Cache 내에서 변경되었지만 아직 디스크에 반영되지 않은 블록을 의미. DBWR 프로세스가 디스크로 플러시할 때까지 메모리에 존재.


1.4 Lock 메커니즘

여러 사용자가 동시에 같은 데이터를 사용할 수 있기 때문에, 오라클은 Lock을 통해 데이터 일관성과 무결성을 보장한다.

주요 Lock 종류:

  • TX Lock: 행 단위 락. DML 트랜잭션 시 발생.
  • TM Lock: 테이블 락. DDL 또는 제약 조건 관련.
  • UL Lock: 사용자 정의 락 (DBMS_LOCK 사용).

💥 Deadlock: 서로 상대방의 락을 기다리는 교착 상태. 오라클은 이를 감지하고 하나의 세션을 종료함으로써 해결한다.


1.5 RAC(Real Application Clusters)

RAC는 여러 대의 서버가 하나의 데이터베이스를 동시에 접근할 수 있도록 구성된 클러스터 구조이다. 고가용성과 확장성이 필요한 엔터프라이즈 환경에서 자주 사용된다.

RAC의 장점:

  • 고가용성: 한 노드 장애 시 다른 노드로 자동 전환 가능
  • 수평 확장성: 서버를 추가하여 성능 향상 가능
  • 로드 밸런싱: 요청을 여러 인스턴스로 분산 처리

핵심 기술 - Cache Fusion:

  • 각 노드의 SGA를 네트워크로 연결해 메모리 블록을 공유. 데이터 일관성을 유지하면서도 빠른 처리 가능.

1.6 커넥션 풀의 필요성

애플리케이션이 DB와 통신할 때, 매번 새로 커넥션을 만드는 것은 성능적으로 비효율적이다. 커넥션 풀은 일정 수의 DB 커넥션을 미리 만들어 두고 재사용함으로써 다음과 같은 장점을 제공한다:

  • 커넥션 생성/소멸 오버헤드 제거
  • DB 자원 사용 제한 및 보호
  • 다수 사용자 처리 능력 향상

💡 실무에서는 HikariCP(Spring Boot), QueuePool(SQLAlchemy) 등을 통해 커넥션 풀을 관리한다.


1.7 요약

구성 요소설명

SGA SQL 실행, 캐시, 트랜잭션 관리를 위한 공유 메모리 공간
Dirty Buffer 수정된 상태이지만 디스크에 반영되지 않은 데이터 블록
Lock 데이터 일관성을 위한 동시성 제어 메커니즘
RAC 다중 서버가 하나의 DB를 공유해 고가용성과 확장성 제공
커넥션 풀 DB 커넥션을 미리 만들어 재사용함으로써 성능 최적화

이제 오라클의 기본 구조를 이해했으니, 다음 장에서는 SQL 실행 흐름과 옵티마이저에 대해 배워보자.

728x90
728x90

멀티센서 융합 기반 품질 이상 판별 (Sensor Fusion + 이상 탐지 AI)

🎯 목표

정전용량 센서, 광센서, 유량센서 등 여러 센서를 통해 제품의 상태를 감지하고,
그 데이터를 AI 모델이 학습해 불량품을 자동 감지하는 시스템을 Unity에서 구현합니다.


🧩 사용 기술

  • Unity (센서 동작 시뮬레이션, 제품 상태 구현)
  • Python (이상 탐지 모델: Autoencoder / Isolation Forest)
  • C# (센서값 로깅, 판별 결과 반영)
  • 머신러닝 기반 이상 분류기
  • 선택: ONNX 모델 로딩 (Unity 추론 적용 시)

🖼️ 시뮬레이션 화면 예시

제품이 센서를 통과하면서 각 센서가 값을 수집하고, AI가 이 데이터를 분석해 불량 여부를 판단


🛠 Unity 구현 단계

1️⃣ 구성 요소 설계

오브젝트 설명
Product 감지 대상 물체 (Cube, Sphere 등 불량 포함)
CapacitiveSensor 재질 감지 (예: 금속 vs 비금속)
LightSensor 위치/정렬 상태 감지
FlowSensor 내부 유량 감지 시뮬레이션 (예: 정해진 액체 통과 여부)
InspectionManager 모든 센서 값을 종합하고 AI 호출
 

2️⃣ 센서 감지 스크립트 (C#)

public class SensorReader : MonoBehaviour
{
    public float sensorValue;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Product"))
        {
            sensorValue = Random.Range(0.8f, 1.2f); // 간단한 센서값 시뮬
        }
    }
}

3️⃣ 멀티센서 데이터 수집 및 라벨링

public class InspectionManager : MonoBehaviour
{
    public SensorReader capacitive;
    public SensorReader light;
    public SensorReader flow;
    public Text resultText;

    void Inspect()
    {
        float[] features = new float[]
        {
            capacitive.sensorValue,
            light.sensorValue,
            flow.sensorValue
        };

        bool isDefective = RunMLModel(features);
        resultText.text = isDefective ? "❌ 불량" : "✅ 정상품";
    }

    bool RunMLModel(float[] input)
    {
        // 예: 평균과 편차 기반 간단 판별
        float avg = input.Average();
        return avg < 0.85f || avg > 1.15f;
    }
}

※ 초기에는 간단한 수치 판별 사용 → 추후 Python 학습 모델 적용 가능


🧠 Python AI 모델 학습 (이상 탐지)

Isolation Forest 사용 예시

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("sensor_dataset.csv")  # 컬럼: Capacitive, Light, Flow
model = IsolationForest()
model.fit(df[['Capacitive', 'Light', 'Flow']])
df['Anomaly'] = model.predict(df[['Capacitive', 'Light', 'Flow']])  # 1 = 정상, -1 = 불량

# 저장
import joblib
joblib.dump(model, 'sensor_model.pkl')

Unity ↔ Python 연결 방법 (선택)

  • Flask 서버 구성 후 Unity에서 HTTP GET으로 예측 요청
  • 또는 ONNX로 모델 변환 후 Unity 내 ONNX 추론 적용 (고급)

🎁 기대 결과

  • 센서 3개 이상을 융합한 품질 검사 가능
  • AI 기반으로 불량 자동 감지 → 검사 속도 향상
  • Unity에서 품질 판별 시뮬레이션까지 시각화 완료

📈 확장 아이디어

확장 주제 설명
제품 회전/정렬 불량 감지 3D 위치 기반 센서 추가
센서 간 상관관계 분석 PCA, SHAP 등으로 중요도 분석
강화학습과 결합 검사 타이밍 최적화
728x90
728x90

강화학습 기반 공정 최적화 (Unity + ML-Agents)

🎯 목표

Unity에서 공정 시뮬레이터를 만들고, 강화학습을 통해 AI가 자동으로 공정을 최적화하도록 훈련합니다.
예: 서보모터 속도 조절, 물체 이송 타이밍, 실린더 동작 간격 등을 AI가 스스로 최적화합니다.


🧩 사용 기술

  • Unity (시뮬레이션 + 제어 환경)
  • ML-Agents Toolkit (강화학습 훈련)
  • PPO (Proximal Policy Optimization) 알고리즘
  • Python (훈련 파이프라인)

🖼️ 시뮬레이션 예시 화면

AI 에이전트가 공정 조건(속도, 타이밍)을 스스로 조정하며 목표 시간과 품질을 만족시키는 방향으로 학습


🛠 Unity 구현 과정

1️⃣ 공정 시나리오 설정 예시

 

구성 요소 설명
Item 이송할 물체 (Cube 등)
Conveyor 벨트, 속도 조절 가능
Cylinder 물체를 밀어주는 역할
Sensor 감지 위치, 도달 시간 측정
Agent 공정을 제어하는 AI 에이전트
 

2️⃣ ML-Agent 설치 및 설정

✅ 설치 (Python)

pip install mlagents

✅ Unity 패키지 설치


3️⃣ AI Agent 스크립트 작성

🎮 공정 최적화용 Agent 스크립트 (C#)

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class FactoryAgent : Agent
{
    public Transform item;
    public Transform sensor;
    public float conveyorSpeed = 1.0f;

    private float timer;

    public override void OnEpisodeBegin()
    {
        item.position = new Vector3(-2f, 0.5f, 0f);
        timer = 0;
    }

    public override void CollectObservations(VectorSensor sensor)
    {
        sensor.AddObservation(item.position.x);
        sensor.AddObservation(conveyorSpeed);
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        float speedAction = actions.ContinuousActions[0];
        conveyorSpeed = Mathf.Clamp(speedAction, 0.5f, 3.0f);
        item.Translate(Vector3.right * conveyorSpeed * Time.deltaTime);

        timer += Time.deltaTime;

        // 성공: 센서 위치 도달
        if (item.position.x >= sensor.position.x)
        {
            float reward = 1.0f - Mathf.Abs(timer - 2.0f); // 목표 시간 2초
            SetReward(reward);
            EndEpisode();
        }

        if (timer > 4.0f) // 제한 시간 초과
        {
            SetReward(-1.0f);
            EndEpisode();
        }
    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        actionsOut.ContinuousActions.Array[0] = 1.0f; // 테스트용 속도
    }
}

 


4️⃣ Python 훈련 설정 (config 파일)

behaviors:
  FactoryAgent:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 1024
      learning_rate: 0.0003
      beta: 0.005
      num_epoch: 3
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    max_steps: 100000
    time_horizon: 64
    summary_freq: 1000

5️⃣ 학습 시작 명령어

mlagents-learn config/ppo_factory.yaml --run-id=factory_run_01 --train

Unity 실행 상태에서 에이전트가 스스로 공정 타이밍을 조절하며 최적화 학습을 진행합니다.


🧠 보상 설계 팁 (강화학습 핵심)

행동 결과
정확히 목표 시간 도달 (2.0s ± 0.2s) +1.0
너무 빠르거나 느림 -0.3 ~ -1.0
실패 (타겟 미도달 or 충돌) -1.0
연속 성공 +0.2 (보너스)
 

🎁 기대 결과

  • AI가 자율적으로 공정 속도 조절 전략 학습
  • 실제로 이송 거리, 목표 시간이 바뀌어도 스스로 조정
  • 튜닝 없이 강건한 공정 제어 자동화 구현

📌 확장 아이디어

확장 주제 설명
실린더+벨트 조합 최적화 동시 제어
강화학습 + 예측 모델 결합 Hybrid 제어
다중 에이전트 협업 공정 간 AI 협력 제어
 

🏷️ 태그 (4편 전용)

강화학습, UnityMLAgents, PPO, 공정강화학습, AI자율제어, 스마트팩토리AI, 공정최적화, 강화학습시뮬레이션, UnityAI, 스마트제조

▶️ 다음 편 예고 (5편)

멀티센서 융합 기반 품질 이상 판별 – AI가 다양한 센서 데이터를 조합해 불량 자동 감지

728x90
728x90

예측 기반 실린더 속도 제어 (LSTM + Unity)

🎯 목표

실린더의 이동 거리, 속도, 환경 조건을 기반으로 도착 시간을 AI가 예측하고, 예측 결과에 따라 속도 또는 입력 값을 실시간 보정하는 Unity 시뮬레이터를 제작합니다.


🧩 활용 기술

  • Unity (물리 기반 이동 시뮬레이션)
  • Python (LSTM 예측 모델 학습)
  • C# (속도 제어 및 보정 로직 구현)
  • ML.NET (선택: Unity 내 ML 추론 가능)

🖼️ 시뮬레이션 화면 예시

실린더가 이동 거리에 따라 도착 시간을 AI가 예측 → 속도 자동 보정 → 일정한 도착 시간 유지


🛠 Unity 구현 과정

1️⃣ 실린더 + 거리 기반 제어 스크립트

public class PredictiveCylinder : MonoBehaviour
{
    public Transform target;
    public float speed = 2f;
    private float moveStartTime;
    private float predictedTime;

    public void StartMove(float predictedTime)
    {
        this.predictedTime = predictedTime;
        moveStartTime = Time.time;
        StartCoroutine(MoveRoutine());
    }

    IEnumerator MoveRoutine()
    {
        Vector3 start = transform.position;
        Vector3 end = target.position;

        while (Vector3.Distance(transform.position, end) > 0.01f)
        {
            float distance = Vector3.Distance(start, end);
            speed = distance / predictedTime;
            transform.position = Vector3.MoveTowards(transform.position, end, speed * Time.deltaTime);
            yield return null;
        }

        Debug.Log("🟢 실린더 도착! 실제 시간: " + (Time.time - moveStartTime));
    }
}

 


2️⃣ 데이터 수집 (거리, 속도, 도착 시간)

public class TimeLogger : MonoBehaviour
{
    public Transform start;
    public Transform target;
    public float speed;
    private float startTime;

    void Start()
    {
        float distance = Vector3.Distance(start.position, target.position);
        startTime = Time.time;

        float estimatedTime = distance / speed;
        float actualTime = SimulateMovement(distance, speed); // 추후 구현

        Debug.Log($"{distance},{speed},{actualTime}");
    }
}

📁 CSV 예시:

 
Distance,Speed,ActualTime
0.5,2.0,0.24
0.8,2.0,0.38
1.0,2.5,0.40

🧠 AI 모델 학습 (Python - LSTM)

import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

df = pd.read_csv("cylinder_data.csv")
X = df[['Distance', 'Speed']].values
y = df['ActualTime'].values

X = X.reshape((X.shape[0], 1, X.shape[1]))  # LSTM 입력 형태

model = Sequential()
model.add(LSTM(32, input_shape=(1, 2)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=100, verbose=1)

model.save("lstm_predictor.h5")

 


🎯 예측 결과를 Unity에서 사용하는 방법

💡 옵션 1: 예측값 CSV로 저장 → Unity에서 로딩

float predictedTime = PredictTimeFromCSV(distance, speed);
cylinder.StartMove(predictedTime);

💡 옵션 2: Unity에서 Python 서버 호출 (Flask)

UnityWebRequest www = UnityWebRequest.Get("http://localhost:5000/predict?d=0.5&s=2.0");
yield return www.SendWebRequest();
float predictedTime = float.Parse(www.downloadHandler.text);

💡 옵션 3: ML.NET or ONNX 모델 로딩 (고급)


📢 보정 로직 개념

 

거리 예측 시간 속도 보정
0.8m 0.4s 0.8 / 0.4 = 2.0 m/s
1.2m 0.6s 1.2 / 0.6 = 2.0 m/s
1.2m 0.9s (부하 ↑) 1.2 / 0.9 = 1.33 m/s
 

→ AI가 예측한 시간에 맞춰 속도 보정


🎁 기대 결과

  • 실린더가 항상 일정한 시간에 도달
  • 공기압 변화, 부하 변화가 있어도 예측 기반으로 자동 보정
  • Unity 기반 시뮬레이션 + 제어 최적화 모델 완성

🧪 확장 아이디어

화장 설명
센서 피드백 추가 정전용량 센서로 도달 여부 검증
온도/공기압 영향 변수 추가 예측 정확도 개선
PID 보정 병행 AI+전통 제어 융합 가능
 

 


📌 태그 

#예측제어 #속도자동조절 #LSTM예측 #UnityAI #스마트팩토리제어 #공정시간보정 #AI제어최적화 #C샵유니티 #Unity시뮬레이션

 


▶️ 다음 편 예고 (4편)

강화학습 기반 공정 최적화 – Unity ML-Agents로 서보모터와 공정 순서를 스스로 학습하는 AI 만들기

728x90
728x90

실린더 외란 감지 + 알람 시스템 (Unity + AI)

🎯 목표

Unity에서 실린더의 동작을 시뮬레이션하고, 외란(지연, 위치 오차, 튀는 현상 등)을 감지하는 AI 모델을 적용하여 알람 시스템을 만들자.


🧩 사용 기술

  • Unity 2021+ (시뮬레이터 제작)
  • C# (센서/실린더 제어, 로그 저장)
  • Python (Autoencoder 또는 이상탐지 모델)
  • 머신러닝: 이상 탐지 기반 분류 모델 (Isolation Forest / Autoencoder)

🖼️ 시뮬레이션 화면 예시

💬 실린더가 동작할 때, 예상 위치에 도달하지 않거나 도달 시간이 지연되면 AI가 외란 상태로 판단하고 알림 발생


🛠 Unity 구현 단계

1️⃣ 실린더 제어 시뮬레이션

🎮 오브젝트 구성

 

오브젝트 설명
Cylinder 실린더 역할, 위치 이동
Target 목표 위치
LightSensor 도착 여부 판단
AlarmPanel 경고 UI 표시
 

🎮 이동 스크립트 (C#)

public class CylinderMover : MonoBehaviour
{
    public Transform target;
    public float speed = 2.0f;
    public float moveStartTime;
    public bool isMoving = false;

    void Update()
    {
        if (isMoving)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            if (Vector3.Distance(transform.position, target.position) < 0.01f)
            {
                isMoving = false;
                float arrivalTime = Time.time - moveStartTime;
                Debug.Log("도착 시간: " + arrivalTime);
                CylinderLogger.Instance.LogArrival(arrivalTime);
            }
        }
    }

    public void StartMove()
    {
        moveStartTime = Time.time;
        isMoving = true;
    }
}

2️⃣ 외란 기준 데이터 로깅

public class CylinderLogger : MonoBehaviour
{
    public static CylinderLogger Instance;
    public List<float> log = new List<float>();

    void Awake() => Instance = this;

    public void LogArrival(float time)
    {
        log.Add(time);
        // 예: time > 2.5초면 외란으로 라벨링 가능
    }
}

3️⃣ 외란 라벨링 기준 예시

도착 시간 (sec) 외란 여부
1.5 정상
2.7 외란 (지연)
1.6 정상
3.2 외란
 

이 데이터를 Python으로 Export (CSV)해서 학습에 사용합니다.


🧠 AI 모델 학습 (Python 예시)

Autoencoder 기반 이상 탐지

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("cylinder_data.csv")
model = IsolationForest()
model.fit(df[['arrival_time']])
df['anomaly'] = model.predict(df[['arrival_time']])
  • 1 → 정상, -1 → 외란
  • 모델을 Pickle 파일로 저장하여 Unity와 연동하거나, threshold 기반으로 Unity 내에서 직접 분류 가능

🖥 Unity 내 이상 감지 및 알람 출력

알람 표시 스크립트

public class AlarmController : MonoBehaviour
{
    public GameObject alarmUI;

    public void CheckForAnomaly(float arrivalTime)
    {
        if (arrivalTime > 2.5f) // 기준 시간 설정
        {
            alarmUI.SetActive(true);
            Debug.Log("⚠️ 외란 감지됨! 알람 발생");
        }
        else
        {
            alarmUI.SetActive(false);
        }
    }
}
  • 외란이 발생하면 빨간 경고창 (AlarmPanel) 활성화

🎮 UI 구성 추천

UI 요소 설명
TextMeshPro "정상 동작" / "외란 발생" 표시
LED Light (빨강) 외란 시 점등
Reset 버튼 다시 테스트 가능
Chart 버튼 로그 기반 도착 시간 시각화 (선택 사항)
 

🎁 기대 결과

  • 실린더 동작의 정상/비정상 판단 가능
  • 외란 발생 시 즉각 경고 → 공정 품질 확보
  • AI 기반 판단으로 휴먼 에러 감소

📊 실습 요약

 

항목 설명
센서 시뮬레이션 실린더 위치/도착 감지
외란 기준 정의 도착 시간, 위치 오차
AI 모델 적용 이상 탐지 기반 분류
알람 출력 Unity UI로 알림 표시
 

🔖 사용 태그

#Unity공정제어 #실린더제어 #AI이상탐지 #Autoencoder #IsolationForest #스마트팩토리 #외란감지 #산업자동화

📌 다음 편 예고

3편. 예측 기반 실린더 속도 제어 – LSTM으로 도착 시간 예측하고 제어 자동화하기

728x90

+ Recent posts