분류 전체보기
-
개요laravel 프로젝트를 도커에 얹기 위해 sail로 컨테이너를 빌드하는데 apt-get update && apt-get upgrade ... 명령어에서 억겁의 시간이 걸리는 상황이 발생했다.원인sail로 컨테이너를 빌드할때 패키지 파일을 ports.ubuntu.com에서 받아오는데 이 서버가 영국에 있기 때문에 한국과 물리적으로 거리가 멀어 지연이 발생하는 것으로 확인되었다.해결방법권장되는 방법은 아닐 것 같지만(애초에 vendor 내의 파일을 수정하려고 하면 PhpStorm에서 안내 메시지가 나온다.) vendor 디렉토리 내에 있는 기본 Dockerfile에서 저장소 서버의 url을 한국에 위치한 비공식 미러서버 url로 바꿔주는 명령어를 추가해 해결하였다.이 방법에서 사용한 미러서버는 KAIS..
laravel - sail 컨테이너 apt-get update 지연 해결 방법개요laravel 프로젝트를 도커에 얹기 위해 sail로 컨테이너를 빌드하는데 apt-get update && apt-get upgrade ... 명령어에서 억겁의 시간이 걸리는 상황이 발생했다.원인sail로 컨테이너를 빌드할때 패키지 파일을 ports.ubuntu.com에서 받아오는데 이 서버가 영국에 있기 때문에 한국과 물리적으로 거리가 멀어 지연이 발생하는 것으로 확인되었다.해결방법권장되는 방법은 아닐 것 같지만(애초에 vendor 내의 파일을 수정하려고 하면 PhpStorm에서 안내 메시지가 나온다.) vendor 디렉토리 내에 있는 기본 Dockerfile에서 저장소 서버의 url을 한국에 위치한 비공식 미러서버 url로 바꿔주는 명령어를 추가해 해결하였다.이 방법에서 사용한 미러서버는 KAIS..
2025.08.30 -
빈약한 도메인 모델(Anemic Domain Model)이란?빈약한 도메인 모델은 겉모습은 도메인 모델처럼 보이지만, 실제로는 데이터(속성)만 가지고 있고, 행동(비즈니스 로직)은 거의 없는 객체들을 말한다.즉, 도메인 객체가 단순히 ‘데이터 보관용 그릇’ 역할만 하고, 핵심 로직은 전부 별도의 서비스 객체에 분리되어 있는 구조왜 문제가 될까?객체지향 설계의 기본 원칙 위반객체지향 설계에서는 데이터와 그 데이터를 처리하는 행위(동작)를 한 객체 안에 함께 담는 것이 원칙빈약한 도메인 모델은 이 원칙을 무시하고, 데이터를 가진 객체와 로직을 가진 서비스를 따로 분리해 놨기 때문에 사실상 절차지향 프로그래밍과 크게 다르지 않음도메인 모델의 장점을 살리지 못함도메인 모델을 잘 활용하면 비즈니스 로직을 객체 안..
기타 - 빈약한 도메인 모델(Anemic Domain Model)이란?빈약한 도메인 모델(Anemic Domain Model)이란?빈약한 도메인 모델은 겉모습은 도메인 모델처럼 보이지만, 실제로는 데이터(속성)만 가지고 있고, 행동(비즈니스 로직)은 거의 없는 객체들을 말한다.즉, 도메인 객체가 단순히 ‘데이터 보관용 그릇’ 역할만 하고, 핵심 로직은 전부 별도의 서비스 객체에 분리되어 있는 구조왜 문제가 될까?객체지향 설계의 기본 원칙 위반객체지향 설계에서는 데이터와 그 데이터를 처리하는 행위(동작)를 한 객체 안에 함께 담는 것이 원칙빈약한 도메인 모델은 이 원칙을 무시하고, 데이터를 가진 객체와 로직을 가진 서비스를 따로 분리해 놨기 때문에 사실상 절차지향 프로그래밍과 크게 다르지 않음도메인 모델의 장점을 살리지 못함도메인 모델을 잘 활용하면 비즈니스 로직을 객체 안..
2025.07.25 -
개요php로 서비스를 운영하며 속도가 너무 느려 원인을 찾아보려 했으나 코드상에서 병목이 발생할만한 부분을 찾지 못했다.서버 성능의 문제가 아닌가 싶었지만 원인을 분명히 하고 싶어 모니터링 시스템을 추가하게 되었고 많은 모니터링 시스템 중 Prometheus Grafana 조합을 선택하게 되었다.왜 Prometheus + Grafana인가?기준Prometheus + GrafanaZabbixNagiosInfluxDB + ChronografDatadog데이터 수집Pull 기반, PHP-FPM exporter로 PHP 메트릭 수집 가능, 다양한 exporter 지원Push 기반, 에이전트 설치 필요, PHP 스크립트로 커스텀 메트릭 지원스크립트 기반 체크, PHP 메트릭은 플러그인으로 제한적Push 기반, T..
PHP - Docker Prometheus Grafana 모니터링개요php로 서비스를 운영하며 속도가 너무 느려 원인을 찾아보려 했으나 코드상에서 병목이 발생할만한 부분을 찾지 못했다.서버 성능의 문제가 아닌가 싶었지만 원인을 분명히 하고 싶어 모니터링 시스템을 추가하게 되었고 많은 모니터링 시스템 중 Prometheus Grafana 조합을 선택하게 되었다.왜 Prometheus + Grafana인가?기준Prometheus + GrafanaZabbixNagiosInfluxDB + ChronografDatadog데이터 수집Pull 기반, PHP-FPM exporter로 PHP 메트릭 수집 가능, 다양한 exporter 지원Push 기반, 에이전트 설치 필요, PHP 스크립트로 커스텀 메트릭 지원스크립트 기반 체크, PHP 메트릭은 플러그인으로 제한적Push 기반, T..
2025.05.15 -
개요여러 서버를 운영하다보면 가끔 필요해지는 서버간 파일 전송 방법에 대해 정리해보았다.scp보다는 rsync를 사용하는게 안정적이라고는 들었으나 일단은 scp로도 충분한 것 같아 rsync는 추후에 사용하게 되면 그때 정리할 예정이다.1. 서버 A에 SSH 접속ssh 서버A유저@서버A의IP# ex. ssh userA@123.123.123.1232. SSH 키쌍 생성 (서버 A에서)ssh-keygen -t rsa -b 40963. 생성된 키쌍 파일 확인ls -al4. pub key 내용 확인 및 복사cat ~/.ssh/id_rsa.pub5. 서버 B에 SSH 접속ssh 서버B유저@서버B의IP# ex. ssh userB@456.456.456.4566. 서버 A의 pub key를 서버 B의 authorize..
Ubuntu - 서버간 파일 전송(scp 명령어)개요여러 서버를 운영하다보면 가끔 필요해지는 서버간 파일 전송 방법에 대해 정리해보았다.scp보다는 rsync를 사용하는게 안정적이라고는 들었으나 일단은 scp로도 충분한 것 같아 rsync는 추후에 사용하게 되면 그때 정리할 예정이다.1. 서버 A에 SSH 접속ssh 서버A유저@서버A의IP# ex. ssh userA@123.123.123.1232. SSH 키쌍 생성 (서버 A에서)ssh-keygen -t rsa -b 40963. 생성된 키쌍 파일 확인ls -al4. pub key 내용 확인 및 복사cat ~/.ssh/id_rsa.pub5. 서버 B에 SSH 접속ssh 서버B유저@서버B의IP# ex. ssh userB@456.456.456.4566. 서버 A의 pub key를 서버 B의 authorize..
2025.05.12 -
개요GCP 인스턴스에서 OCI 인스턴스로 서버를 이전하던 중 기존 GCP에서는 문제없이 작동하던 Docker 기반 네트워크 구조가 OCI에서는 제대로 동작하지 않았고, 그로 인해 Nginx Proxy Manager(이하 npm) 컨테이너가 다른 서비스 컨테이너와 통신을 할 수 없어 도메인을 연결할 수 없게 되었다.이를 해결하기 위해 꽤나 많은 시간을 허비하게 되었고, 이는 그 과정을 압축한 글이다.문제 상황OCI로 서버를 옮긴 뒤 Docker 설정을 기존과 동일하게 구성했지만, npm이 다른 컨테이너와 통신하지 못했다.1. GCP에서는 npm이 `172.17.0.1:[service port]`로 통신하면 정상 작동했지만 OCI에서 같은 방식으로 설정할 경우 502 bad gateway 에러 발생2. `n..
Nginx - Nginx Proxy Manager 502 bad gateway 에러 해결개요GCP 인스턴스에서 OCI 인스턴스로 서버를 이전하던 중 기존 GCP에서는 문제없이 작동하던 Docker 기반 네트워크 구조가 OCI에서는 제대로 동작하지 않았고, 그로 인해 Nginx Proxy Manager(이하 npm) 컨테이너가 다른 서비스 컨테이너와 통신을 할 수 없어 도메인을 연결할 수 없게 되었다.이를 해결하기 위해 꽤나 많은 시간을 허비하게 되었고, 이는 그 과정을 압축한 글이다.문제 상황OCI로 서버를 옮긴 뒤 Docker 설정을 기존과 동일하게 구성했지만, npm이 다른 컨테이너와 통신하지 못했다.1. GCP에서는 npm이 `172.17.0.1:[service port]`로 통신하면 정상 작동했지만 OCI에서 같은 방식으로 설정할 경우 502 bad gateway 에러 발생2. `n..
2025.05.12 -
MAC 주소란?MAC 주소(Media Access Control Address)는 네트워크에 연결된 기기의 네트워크 인터페이스(예: Wi-Fi 칩, 이더넷 포트)에 부여된 고유한 식별자이다.데이터 링크 계층(Layer 2)에서 로컬 네트워크(LAN) 내에서 기기를 식별하고, 데이터를 정확히 전달하는 데 사용된다.애플의 mac과는 전혀 상관 없다. 애플에서는 혼동되지 않도록 mac 주소를 프로토콜 주소(Ex. 와이파이 주소) 같은 식으로 표기한다.MAC 주소의 특징형식: 48비트(6바이트) 16진수. 예: AA:BB:CC:DD:EE:FF앞 24비트: OUI(제조사 고유 ID) — 예: 삼성, 애플 등뒤 24비트: 제조사가 임의로 지정하는 고유 번호고유성:총 가능한 조합: 2^48 ≈ 281조 개 → 전 세..
MAC 주소란?MAC 주소란?MAC 주소(Media Access Control Address)는 네트워크에 연결된 기기의 네트워크 인터페이스(예: Wi-Fi 칩, 이더넷 포트)에 부여된 고유한 식별자이다.데이터 링크 계층(Layer 2)에서 로컬 네트워크(LAN) 내에서 기기를 식별하고, 데이터를 정확히 전달하는 데 사용된다.애플의 mac과는 전혀 상관 없다. 애플에서는 혼동되지 않도록 mac 주소를 프로토콜 주소(Ex. 와이파이 주소) 같은 식으로 표기한다.MAC 주소의 특징형식: 48비트(6바이트) 16진수. 예: AA:BB:CC:DD:EE:FF앞 24비트: OUI(제조사 고유 ID) — 예: 삼성, 애플 등뒤 24비트: 제조사가 임의로 지정하는 고유 번호고유성:총 가능한 조합: 2^48 ≈ 281조 개 → 전 세..
2025.05.09 -
개요최근 GCP 프리티어 VM이 너무 느린 것 같아 Oracle Cloud Infrastructure(OCI)의 프리티어로 서버를 옮기게 되었다. OCI는 상상 이상으로 쾌적하게 잘 작동했지만, 인스턴스 간 네트워크 구성에서 예상치 못한 문제가 발생했다.OCI에서는 프리티어 기준으로 VM 인스턴스를 2개까지 생성 가능하지만, Public IP는 1개만 예약 가능하다.그리하여 아래와 같이 구성했다.main-instance: 실제 서비스 운영 (Nginx, 백엔드 API 등), Public IP 보유db-instance: MySQL DB만 운영, 사설 IP만 존재하지만 위 구조로 진행 중 DB 툴(MySQL Workbench, DBeaver 등)에서 MySQL에 접속하려고 할 때 문제가 발생했다.원인처음엔 ..
Nginx - Nginx Proxy Manager Stream 설정개요최근 GCP 프리티어 VM이 너무 느린 것 같아 Oracle Cloud Infrastructure(OCI)의 프리티어로 서버를 옮기게 되었다. OCI는 상상 이상으로 쾌적하게 잘 작동했지만, 인스턴스 간 네트워크 구성에서 예상치 못한 문제가 발생했다.OCI에서는 프리티어 기준으로 VM 인스턴스를 2개까지 생성 가능하지만, Public IP는 1개만 예약 가능하다.그리하여 아래와 같이 구성했다.main-instance: 실제 서비스 운영 (Nginx, 백엔드 API 등), Public IP 보유db-instance: MySQL DB만 운영, 사설 IP만 존재하지만 위 구조로 진행 중 DB 툴(MySQL Workbench, DBeaver 등)에서 MySQL에 접속하려고 할 때 문제가 발생했다.원인처음엔 ..
2025.05.08 -
개요Docker 컨테이너 안에서 cron을 실행해야 하는 작업이 있어서 Dockerfile에 cron 설정을 추가했는데, 컨테이너는 잘 올라갔지만 cron이 실행되지 않는 문제가 발생했다.crontab -l로 확인해보면 제대로 등록까지 되어 있었는데도 아무 반응이 없었고, 구글로 검색했더니 명확한 해결방법을 찾지 못해 수많은 삽질을 통해 찾게된 해결방법을 정리해본다(몹시 간단).Dockerfile에 crontab 설정하기처음에 사용한 Dockerfile은 대략 아래와 같았다# 베이스 이미지FROM ubuntu:20.04# 패키지 설치RUN apt-get update && apt-get install -y cron# cron 파일 복사COPY cronfile /etc/cron.d/cronfile# cron..
Docker - Dockerfile에서 crontab 설정하기개요Docker 컨테이너 안에서 cron을 실행해야 하는 작업이 있어서 Dockerfile에 cron 설정을 추가했는데, 컨테이너는 잘 올라갔지만 cron이 실행되지 않는 문제가 발생했다.crontab -l로 확인해보면 제대로 등록까지 되어 있었는데도 아무 반응이 없었고, 구글로 검색했더니 명확한 해결방법을 찾지 못해 수많은 삽질을 통해 찾게된 해결방법을 정리해본다(몹시 간단).Dockerfile에 crontab 설정하기처음에 사용한 Dockerfile은 대략 아래와 같았다# 베이스 이미지FROM ubuntu:20.04# 패키지 설치RUN apt-get update && apt-get install -y cron# cron 파일 복사COPY cronfile /etc/cron.d/cronfile# cron..
2025.04.25