블로그

개발하며 배운 것을 나중의 내가 다시 이해할 수 있도록 씁니다.

글 아카이브

25개 표시

기능 검증 뒤 디자인을 다시 확인한 이유

운영 화면을 원본 디자인과 실제 browser state에 대조하고 완료 기준을 만든 과정

프로토타입을 운영 구조에 맞게 이식한 방법

실제 데이터와 Server Component, cache와 MDX 계약을 유지하며 화면을 바꾼 과정

런타임 전환 뒤 느려진 요청을 나눠 측정하기

Network와 route rendering, MDX compile 비용을 측정하고 각각의 cache 경계를 적용한 과정

애플리케이션과 운영 설정을 따로 배포하기

하나의 repository 안에서 App과 Ops release를 나누고 누적 호환성을 검사한 과정

자산 동기화에서 MySQL 의존성을 제거한 과정

공통 원본 검증은 유지하고 DB 동기화와 자산 발행의 실행 환경을 분리한 과정

Checksum이 같아도 상태가 달랐던 이유

경로와 생명주기, 중단된 작업과 원본 검증까지 동기화의 성공 조건에 포함한 과정

콘텐츠 변경과 프런트엔드 배포를 분리하기

글 변경은 콘텐츠만 갱신하고 프런트엔드 code 변경만 Vercel 배포를 만들게 한 과정

프런트엔드에서 posts checkout을 제거한 과정

상세와 검색, 분류, Sitemap을 백엔드로 옮기고 로컬 생성 계층을 제거한 과정

글의 첨부 파일을 빌드에서 분리한 방법

공개 글의 자산만 snapshot으로 만들고 원자적으로 전환한 과정

개인 블로그에 운영 경계를 늘린 이유

Markdown 블로그에 조회 모델과 두 운영 파이프라인을 추가하며 얻은 것과 남은 한계

운영 배포가 systemd 권한에서 두 번 멈춘 이유

실제 배포와 rollback을 검증하며 로컬 테스트가 놓친 filesystem 경계를 찾은 기록

정확한 이전 이미지로 되돌리는 방법

성공한 image digest를 current와 previous로 기록하고 안전하게 교환한 과정

Spring Boot에 Docker 권한 없이 백엔드 배포하기

배포 요청 검증과 호스트 작업을 분리해 정확한 image digest만 적용한 과정

ARM 서버에서 빌드하지 않고 배포할 이미지 만들기

검증된 commit을 ARM64 이미지로 한 번 만들고 GHCR digest로 고정한 과정

백엔드 CI에서 네 가지 경계를 검증한 이유

테스트부터 실행 파일과 운영 설정, Docker 이미지까지 하나의 검증 관문으로 묶은 과정

캐시를 즉시 비우면서 300초 TTL을 남긴 이유

콘텐츠 동기화 뒤 캐시를 즉시 비우되 시간 기반 갱신도 유지한 이유

UMask 때문에 새 글을 읽지 못한 이유

실제 Git 갱신에서 드러난 파일 권한 문제를 보안 설정을 유지한 채 해결하고 복구한 기록

Docker 권한 없이 콘텐츠 동기화를 자동화하기

Webhook 검증과 호스트 작업을 분리해 Git 변경을 안전하게 동기화한 과정

콘텐츠 동기화를 애플리케이션 시작에서 분리한 이유

API 서버를 재시작하지 않고 콘텐츠만 동기화하도록 일회성 실행 단위를 만든 과정

OCI 방화벽 규칙을 재부팅 뒤에도 유지하기

외부 HTTP timeout을 host firewall에서 찾아 수정하고 두 차례 reboot로 복구를 확인한 기록

Markdown을 MySQL 조회 모델로 동기화하기

Markdown을 검증하고 변경 상태를 구분해 MySQL 조회 모델로 동기화한 과정

Git 원본과 MySQL 조회 모델을 나눈 이유

Markdown 작성 방식을 유지하면서 공개 조회 책임을 MySQL로 분리한 과정

SSH 복구 뒤 Oracle Cloud 보안을 다시 정리한 과정

메인·비상 SSH 키와 IAM, network ingress, Boot Volume Backup을 다시 점검한 기록

Oracle Cloud에서 잃어버린 SSH 접근 복구하기

OCI Serial Console과 GRUB root shell로 새 SSH 공개키를 등록한 과정

정적 블로그에 백엔드를 둔 이유

검색과 본문 로딩을 먼저 고친 뒤에도 콘텐츠 조회 책임을 분리해야 했던 이유