DB
PHP
LLM

S&P 500

SPI@SPX 미국 2026.05.15 16:46 현지시간 기준 |10분 지연제공

7,408.50

전일대비 92.74 ( -1.24% )

나스닥 종합

NAS@IXIC 미국 2026.05.15 16:15 현지시간 기준 |15분 지연제공

26,225.15

전일대비 410.07 ( -1.54% )

다우 산업

DJI@DJI 미국 2026.05.15 16:20 현지시간 기준 |15분 지연제공

49,526.17

전일대비 537.29 ( -1.07% )

쿠버네티스 (K8S) 용어정리

작성자아이디 : skok1025, 2022-11-12 14:49:16
카테고리 : 인프라 쿠버네티스 (k8s) 게시글 수정

회사에서 담당하고 있는 서비스가 K8S 에서 운영하다 보니 기본적인 용어정리의 필요성을 느꼈다. (당장 깊게 살펴보는 건 아니더라도...)

실제로 업무중에 많이 들어본 오브젝트를 위주로 정리하였다.


Node

  • 클러스터에 속하는 VM 이거나 물리 머신.

  • 노드는 Pod 들을 구동하기 위해 필요한 서비스들을 가진다.

Cluster

  • Node 라고 불리는 머신들의 집합.

Pod

  • 최소단위의 쿠버네티스 객체.

  • 클러스터 상에서 동작하는 컨테이너 집합.

Service

  • Pod 집합과 같은 애플리케이션들에 접근하는 방법을 기술하는 오브젝트

Container

  • 경량, 포터블 실행가능한 이미지

  • 소프트웨어와 그에 필요한 의존성 모듈들을 포함함.

  • 컨테이너는 하부의 호스트 인프라스트럭처로부터 애플리케이션을 분리함으로써 다른 OS 환경에 배포하거나 스케일링하는 것을 간편하게 해준다.

Deployment

  • 최소 단위인 Pod 에 대한 기준 spec 을 정의한 오브젝트

  • 지정한 Replica 의 숫자만큼 Pod 수를 생성/ 유지

ReplicaSet

  • 특정 수의 pod 레플리카들이 동시에 구동되도록 하는 오브젝트

Namespace

  • 동일한 물리 클러스터에서 여러 가상 클러스터를 지원하기 위해 쿠버네티스가 사용하는 추상화

  • 네임스페이스는 클러스터 내의 객체들을 묶음지을 때, 사용

  • 클러스터 내 리소스들을 구분하는 방법이 된다/

  • 리소스 이름은 하나의 네임스페이스 내에서 유일해야 한다.



통계 정보 :: MariaDB

작성자아이디 : skok1025, 2022-09-26 13:07:05
카테고리 : DB MariaDB 게시글 수정

MariaDB 엔진의 옵티마이져가 쿼리 실행계획을 짤 때 확인하는 것이 통계정보이다. (통계 정보가 정확하지 않다면 엉뚱한 방향으로 쿼리실행을 함.)

기본적으로 MariaDB 에서 관리되는 통계 정보는 아래와 같습니다. 
  • 테이블의 레코드 건수
  • 인덱스의 유니크한 값의 개수
Mysql 5.5 버전까지는 "SHOW INDEX FROM 테이블" 으로만 인덱스 컬럼의 분포도를 확인할 수 있었지만 
Mysql 5.6 부터는 innodb_table_stats 테이블에서도 인덱스 분포 확인이 가능하다. 

SELECT * FROM mysql.innodb_table_stats;

쿼리 실행 절차 :: MariaDB

작성자아이디 : skok1025, 2022-09-23 17:02:48
카테고리 : DB MariaDB 게시글 수정

단계 1) 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MariaDB 서버가 이해할 수 있는 수준으로 분리 (파스 트리) 한다. - SQL 파싱 (Parsing)

단계 2) SQL 의 파싱 정보 (파싱트리) 를 확인하면서, 어떤 테이블부터 읽고 어떤 인덱스를 읽을지 선택한다. - 옵티마이져

  • 불필요한 조건의 제거 및 복잡한 연산의 단순화

  • 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정

  • 각 테이블에 사용된 조건과 인덱스의 통계 정보를 이용해 사용할 인덱스를 결정

  • 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정

단계 3) 두번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.

  • 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고 MariaDB 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업진행.

세션(Session) 핸들러::PHP

작성자아이디 : skok1025, 2022-09-19 21:41:24
카테고리 : Language PHP 게시글 수정

데이터베이스를 이용한 session 처리 핸들러 예제입니다. (* SessionHandlerInterface 인터페이스 구현체,)

아래와 같이 open, close, read, write. destroy, gc 를 구현하면 DB 를 통해서도 세션관리가 가능합니다.

(일반적으로는 프레임워크에서 세션처리 구현이 되어있기 때문에 아래와 같이 작업할 일이 없음)


테이블

    CREATE TABLE sessions(
        id VARCHAR(255) UNIQUE NOT NULL,
        payload TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        update_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )



소스

<?php

date_default_timezone_set('Asia/Seoul');

/**
* Session Handler Interface
*/
class DatabaseSessionHandler implements SessionHandlerInterface
{
private PDO $pdo;

public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}

public function open($path, $name)
{
return true;
}

public function read($id)
{
$sth = $this->pdo->prepare('SELECT * FROM sessions WHERE `id` = :id');

if ($sth->execute([':id' => $id])) {
if ($sth->rowCount()>0) {
$payload = $sth->fetchObject()->payload();
} else {
$sth = $this->pdo->prepare('INSERT INTO sessions(`id`) VALUES(:id)');
$sth->execute([':id' => $id]);
}
}

return $payload ?? '';
}

public function close()
{
return true;
}

public function destroy($id)
{
$this->pdo
->prepare('DELETE FROM sessions WHERE `id` = :id')
->execute([':id' => $id])
;
}

public function gc($max_lifetime)
{
$sth = $this->pdo->prepare('SELECT * FROM sessions');

if ($sth->execute()) {
while ($row = $sth->fetchObject()) {
$timestamp = strtotime($row->created_at);

if (time() - $timestamp > $max_lifetime) {
$this->destroy($row->id);
}
}
return true;
}

return false;
}

public function write($id, $data)
{
return $this->
pdo->prepare('UPDATE sessions SET `payload` = :payload WHERE `id` = :id')
->execute([':payload' => $data, ':id' =>$id]);
}
}

// 세션 핸들러 등록
session_set_save_handler(new DatabaseSessionHandler(new PDO('mysql:dbname=test;host=127.0.0.1;', 'root', 'root')));
session_start();
$_SESSION['message'] = 'Hello world';
$_SESSION['foo'] = new stdClass();

session_gc(); // 세션 정리

리플렉션 (ReflectionClass) :: PHP

작성자아이디 : skok1025, 2022-09-19 21:25:23
카테고리 : Language PHP 게시글 수정

리플렉션을 통해 객체의 메타데이터 (properties, class) 를 확인이 가능하다.



/**
* ReflectionClass
*/

class A
{
private $message = "Hello world";

public function __construct($message)
{
$this->message = $message;
}
}

class B extends A
{

}
// 특정 클래스 "A" 에 대하여 private 의 properties 가져오기
$refClass = new ReflectionClass('\A');
var_dump($refClass->getProperties(ReflectionProperty::IS_PRIVATE));
==>
array(1) { [0]=> object(ReflectionProperty)#2 (2) { ["name"]=> string(7) "message" ["class"]=> string(1) "A" } } 

// B 클래스가 A 클래스의 자식클래스인지 확인 
$refClassB = new ReflectionClass('\B');
var_dump($refClassB->isSubclassOf('\A'));
==> bool(true)
// "message" 이름의 property 정보
$messageProperty = $refClass->getProperty('message');
var_dump($messageProperty);
=> 
object(ReflectionProperty)#3 (2) { ["name"]=> string(7) "message" ["class"]=> string(1) "A" }