DB
PHP
LLM

S&P 500

SPI@SPX 미국 2025.12.16 09:40 현지시간 기준 |10분 지연제공

6,802.40

전일대비 14.11 ( -0.21% )

나스닥 종합

NAS@IXIC 미국 2025.12.16 09:35 현지시간 기준 |15분 지연제공

23,007.69

전일대비 49.72 ( -0.22% )

다우 산업

DJI@DJI 미국 2025.12.16 09:35 현지시간 기준 |15분 지연제공

48,394.30

전일대비 22.26 ( -0.05% )

Spring AOP 용어정리

작성자아이디 : skok1025, 2023-04-17 21:20:12
카테고리 : Spring Framework Spring Framework 게시글 수정

용어

설명

조인포인트 (Join Point)

  • 어드바이스가 적용될 수 있는 위치

  • aop 를 적용할 수 있는 모든지점

포인트컷 (Point Cut)

  • 조인포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능

  • 주로 Aspectj 표현식을 사용하여 선별함

타켓 (Target)

  • 어드바이스를 받는 객체

  • 포인트컷으로 결정

어드바이스 (Advice)

  • 부가기능

  • Around, Before, After ...

에스펙트 (Aspect)

  • 어드바이스 + 포인트컷을 모듈화 해둔 것

위빙 (Weaving)

  • 포인트컷으로 결정한 조인포인트에 어드바이스를 적용하는 행위

쿠버네티스 (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(); // 세션 정리