Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Deploy Quartz site to GitHub Pages

on:
push:
branches:
- v4

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history for git info
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install Dependencies
run: npm ci
- name: Build Quartz
run: npx quartz build
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: public

deploy:
needs: build
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
5 changes: 5 additions & 0 deletions 2025-12-15.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title:
tags:
draft:
---
Empty file removed content/.gitkeep
Empty file.
77 changes: 77 additions & 0 deletions content/DB/001_Information Scheme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
title:
tags:
draft: false
---
## DB 명세서 작성

```sql
WITH tb AS (
SELECT *
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
),
tc AS (
SELECT *
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
),
ts AS (
SELECT *
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
)
SELECT
tb.TABLE_NAME,
-- 정렬을 위한 테이블별 컬럼 총 개수
tc.COLUMN_NAME,
tc.ORDINAL_POSITION,


-- [1] PK 여부: 'PRIMARY' 인덱스가 있으면 'O' CASE
WHEN SUM(CASE WHEN ts.INDEX_NAME = 'PRIMARY' THEN 1 ELSE 0 END) > 0 THEN 'O'
ELSE ''
END AS PK,

-- [2] Auto Increment 여부: 있으면 'O' CASE
WHEN tc.EXTRA LIKE '%auto_increment%' THEN 'O'
ELSE ''
END AS AUTO_INCREMENT,

-- [3] Index 존재 여부: 개수가 1 이상이면 'O', 없으면 'X' CASE
WHEN COUNT(ts.INDEX_NAME) > 0 THEN 'O'
ELSE ''
END AS `INDEX`,

tc.COLUMN_TYPE,
tc.IS_NULLABLE,
tc.EXTRA,

-- 실제 인덱스 정보 (참고용)
COUNT(ts.INDEX_NAME) AS Index_Count,
GROUP_CONCAT(DISTINCT ts.INDEX_NAME) AS Index_Names,
COUNT(tc.COLUMN_NAME) OVER (PARTITION BY tb.TABLE_NAME) AS Table_Column_Count,
tb.TABLE_ROWS
FROM
tb
LEFT JOIN
tc ON tc.TABLE_NAME = tb.TABLE_NAME
LEFT JOIN
ts ON tc.TABLE_NAME = ts.TABLE_NAME
AND tc.COLUMN_NAME = ts.COLUMN_NAME
GROUP BY
tb.TABLE_NAME,
tb.TABLE_ROWS,
tc.COLUMN_NAME,
tc.ORDINAL_POSITION,
tc.COLUMN_TYPE,
tc.IS_NULLABLE,
tc.EXTRA
ORDER BY
Table_Column_Count DESC, -- 컬럼 많은 순
tb.TABLE_NAME,
tc.ORDINAL_POSITION;
```

알고보니 db에 테이블, 컬럼도 다 하나의 table에 row 형태로 저장된다는 사실을 알게됨
기존 방식: sql generator로 테이블 생성문을 가져옴
22 changes: 22 additions & 0 deletions content/OpenSSL/001_OpenSSL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
title:
tags:
draft: false
---
## 1. OpenSSL
> Open Secure Socket Layer

SSL: 암호화 기반 인터넷 보안 프로토콜이며, 현재 사용중인 TLS 암호화의 전신
SSL/TLS를 사용하는 웹사이트의 URL에는 http 대신 https가 사용됨.

## 2. 암호화 목적
1. 평문을 암호화하여 공격자가 알아볼 수 없는 형태로 변환
2. 통신장치 사이에 handshake라는 인증 프로세스를 시작하여 각 장치의 id를 확인
3. 디지털 서명을 통해 데이터가 조작되지 않음을 확인

## 3. SSL 인증
SSL은 CA(인증 기관) 에서 발급한 [[002_SSL인증서, 비밀키 생성|SSL 인증서]]가 있는 웹사이트만 실행할 수 있음.
## refs
1. [cloudflare - what is https](https://www.cloudflare.com/ko-kr/learning/ssl/what-is-https/)
2. [Microsoft - 디지털 서명](https://learn.microsoft.com/ko-kr/windows/win32/seccrypto/digital-signatures)
3.
67 changes: 67 additions & 0 deletions content/OpenSSL/002_SSL인증서, 비밀키 생성.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
title:
tags:
draft: false
---

## 1. SSL 인증서
> SSL(TLS) 인증서는 비밀키와 한 세트로 작동한다.
### 1. 인증서
> SSL 인증서에는 다음과 같은 정보가 포함된다.

1. 인증서가 발급된 대상 도메인 이름
- url 상의 도메인과 일치 여부를 확인하여 해당 인증서가 유효한지 확인할 수 있음.
2. 발급받은 사람, 조직, 장치
3. 발급한 인증 기관(CA)
- 인증서를 제공하는 신뢰할 수 있는 제 3자 외부조직
4. 인증 기관의 디지털 서명
5. 관련 하위 도메인
6. 인증서 발급 일시
7. 인증서 만료 일시
8. 공개키
- 비대칭 암호화를 위한 공개키

### 2. 비밀키
> SSL 인증서에 포함된 공개키와 함께 비대칭 암호화에 사용됨.

## 2. SSL 인증서 생성 과정

### 1. 비밀 키 생성

```cmd
openssl genrsa -out private.key 2048
openssl genrsa -out private.key 2048 -nodes
```
> nodes: 비밀키를 암호화하지 않고 저장

비밀키는 수학적으로 하나의 공개키에만 대응된다.
### 2. 공개키 추출(선택사항)

```cmd
openssl rsa -in private.key -pubout -out public.key
```
> 공개키, 비밀키를 통해 비대칭 암호화 수행

### 3. 인증서 서명 요청
> private key로 [[003_Digital Signature|디지털 서명]]하여 공개키 소유권을 증명하고, CA에 제출할 요청 파일 생성

```
openssl req -new -key private.key -out server.csr
```

1. csr: Certificate Signing Request, 인증서 서명 요청
2. -new: 새로운 인증서 서명 요청 생성
3. -key: 이미 존재하는 private.key를 사용하여 요청 생성
### 4. 인증서 발급

1. 공식 CA에 제출: CA의 private key로 서명된 인증서를 발급
1. CA는 server.csr에 포함된 공개키로 신청자의 서명을 확인하여, 신청자가 private.key의 소유주임을 확인.
2. 문제가 없으면 CA의 개인키로 서명하여 최종 인증서(crt)를 발급.
2. 자체 서명(자체 생성한 private.key로 서명)
```
openssl x509 -req -in server.csr -signkey private.key -out server.crt -days 365 -sha256
```




9 changes: 9 additions & 0 deletions content/OpenSSL/003_Digital Signature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
title:
tags:
draft: true
---

## refs
1. [Microsoft - 비대칭 키](https://learn.microsoft.com/ko-kr/windows/win32/seccrypto/public-private-key-pairs?redirectedfrom=MSDN)
2.
6 changes: 6 additions & 0 deletions content/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
title: Welcome to Quartz
---

This is a blank Quartz installation.
See the [documentation](https://quartz.jzhao.xyz) for how to get started.
25 changes: 25 additions & 0 deletions content/pnpm/001_package manager 선택 과정.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
tags:
draft:
---
### 패키지 매니저 선택
### 1. 우리 회사의 배포 과정
1. 개인 pc에서 개발
2. 내부망 서버에 배포 및 테스트
3. 실제 배포시 고객사 서버(주로 폐쇄망)에 CD, USB등을 통해 파일을 가져가서 설치함

### 2. 패키지 매니저 선정 기준
1. 폐쇄망에 배포할 수 있도록, 오프라인 설치를 지원
2. 내부망 테스트시 동일한 패키지 중복설치 방지
3. hoisting으로 인한 phantom dependency 방지
4. 낮은 러닝커브, 현재 프로젝트와의 호환성

> pnpm, yarn berry를 후보군으로 선정

### 3. pnpm 선택 이유
1. 기존 npm과 비슷하여 낮은 러닝커브
2. 패키지 저장 방식의 효율성(global 저장소에 한번 설치 후 파일을 참조하는 방식)
3. npm보다 약 2배 빠른 성능



97 changes: 97 additions & 0 deletions content/pnpm/002_pnpm 내부망 배포.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
---
title:
tags:
draft: false
---
> 테스트용 내부망 서버에 배포하는 과정을 정리함.

## 1 기존 방식 및 개선 목표
### 1. 기존 내부망 배포 방식
1. docker image에는 패키지만 설치되어있음
2. 개발한 소스 코드를 volume mount시킴
3. container를 올릴 때 mount 시킨 소스를 빌드 및 배포함

![[Pasted image 20251215144318.png]]

> 다수의 이미지에 같은 패키지가 중복 설치되어 있어, 저장 공간의 효율성이 떨어지는 문제 발생

### 2. pnpm 사용 목적
1. 내부망 서버에 패키지 설치 후 container에 mount하여, 패키지 설치 용량을 줄임
2. 다수의 프로젝트에서 한 이미지를 사용하여 배포
3. source 코드를 mount하는 방식은 유지

## 2. pnpm 배포

### 1. Docker Image 생성
1. 현재 사용하고 있는 node 버전의 이미지를 사용
2. pnpm store path를 환경변수로 설정(다수의 컨테이너에서 동일한 store를 참조하기 위함)

#### pnpm설치, 환경변수를 설정한 Docker Image 생성

[pnpm 공식 문서](https://pnpm.io/ko/docker)의 Dockerfile을 변형함.
```Dockerfile
FROM node:24-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV PNPM_STORE_DIR=/pnpm/store

#ADD --chown=node:node https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linux-x64 /usr/local/bin/pnpm
RUN npm i -g pnpm
RUN chmod +x /usr/local/bin/pnpm

WORKDIR /app


EXPOSE 20990
```
> pnpm을 설치하는 2가지 방법(하나는 주석처리됨)중 1가지를 선택하여 사용

```cmd
docker build . --no-cache --platform=linux/amd64 -t pnpm-node-24
```
### 2. Docker Compose.yml 파일 작성

```yml
version: '3.8'
services:
asmk-mgr:
image: pnpm-node-24
restart: always
container_name: asmk-mgr-server
volumes:
- ./source:/app
- /app/node_modules
- ${HOME}/pnpm/store:/pnpm/store
ports:
- "30950:30950"
environment:
- CI=true
entrypoint: ["sh", "-c", "/app/entrypoint.sh"]
```

### 3. entrypoint.sh 작성

```
#!/bin/sh
# 에러 발생 시 즉시 스크립트 중단
set -e

echo "--- 0. Clearing previous build caches (.nuxt, .output) ---"
rm -rf .nuxt .output

pnpm config set store-dir ${PNPM_STORE_DIR}

echo "--- 1. Running pnpm install (offline from store) ---"
# pnpm install을 실행하여 node_modules 구성
pnpm install --frozen-lockfile

echo "--- 2. Building the Nuxt application ---"
# Nuxt 프로젝트 빌드 (package.json의 build 스크립트 실행)
pnpm build

echo "--- 3. Starting the production server ---"
# Nuxt 프로젝트 시작 (package.json의 start 스크립트 실행)
# exec를 사용하면 불필요한 셸 프로세스를 남기지 않고 주 프로세스로 실행됩니다.
exec pnpm start
```

Loading