본문 바로가기

전체 글101

알림 발송 서버 분리하기 주문 완료 메일, 회원가입 메일, 비밀번호 재발급 메일 같은 걸 백엔드 서비스가 직접 보내고 있었다. 회원가입 API 요청 하나 처리하는 흐름 안에 SMTP 커넥션 생성, ejs 템플릿 렌더링, 메일 발송까지 전부 같이 물려있었다. 관리자 서비스도 마찬가지로 컨트롤러 안에서 view를 렌더링해서 바로 메일을 쐈다. 이 구조의 치명적인 문제는, 발송 실패가 곧 도메인 로직 실패로 이어진다는 거다.SMTP 서버가 잠깐 느려지면 처리 API의 응답도 같이 느려지고, 메일 발송 코드에서 예외가 나면 그게 비즈니스 로직의 트랜잭션에까지 영향을 줄 수 있다.또한, 알림 채널을 하나 늘리려고 해도 핵심 도메인 코드 안에 발송 로직을 또 끼워 넣어야 한다. 그래서 알림 서버를 따로 만들었다.알림 발송만 전담하는 서버를.. 2026. 8. 22.
AWS IAM Role 세팅기. 정적 액세스 키 대체용 AWS IAM 개발자 계정의 토큰 하나만 유출되면 AWS 계정 전체가 털리는 구조였다.인프라 담당자들 계정이 전부 admin 그룹(AdministratorAccess)에 속해 있었고, 인프라 배포용 서비스 계정도 정적 액세스 키를 상시 들고 있었다.이 인프라 서비스 계정도, IAM 사용자/정책 관리 권한까지 Resource="*"로 열려 있어서, 키 하나만 새면 계정 내 아무 사용자에게나 admin 정책을 붙이거나 새 액세스키를 발급할 수 있었다.여러 애플리케이션 서비스들도 S3/SNS/SQS/KMS에 접근할 때 IAM 사용자의 정적 액세스 키를 환경변수로 직접 주입하고 있었다. 사실 최근에 인프라를 새로 세팅하면서 편하자고 넣어둔 권한들이었다.초기엔 셋업 속도가 우선이라 일단 다 열어두고 나중에 정리하.. 2026. 8. 22.
토큰 마시따~ 클로드! 야호-! 5월 한달간 구독 3개. 단돈 10만원으로170만원 어치 토큰값 뽑아먹기 성공클로드! 야호-!클로드&코덱스 사용량 보기*사용 명령어npx ccusage@latest monthly --all*클로드 부계 포함CLAUDE_CONFIG_DIR="$HOME/.config/claude,$HOME/.claude,$HOME/.claude-a" \CODEX_HOME="$HOME/.codex" \npx ccusage@latest monthly --all잔재 대화 로컬 파일 보고 추정하는 방식.다만 클로드는 30일이 지난 대화 파일은 로컬에서 정리되기에 그 전 건은 조회 불가능함. 2026. 6. 3.
MySQL Index Skip Scan, 선행 컬럼 조건이 없는데도 복합 인덱스를 활용하는 방식 MySQL에서 복합 인덱스를 사용할 때는 보통 왼쪽부터 조건을 타는 것이 일반적이다.하지만 특정 조건에서는 선행 컬럼 조건이 없는데도 불구하고 해당 복합 인덱스를 활용하는 재미난 최적화 방식이 있다.이 방식을 Index Skip Scan이라고 한다.이 Index Skip Scan 에 대해 ALABOZAMySQL 지원 버전Index Skip Scan은 MySQL 8.0.13부터 지원된다.MySQL 8.0.13 릴리즈 노트에도 옵티마이저가 Skip Scan access method를 지원한다고 명시되어 있다.Index Skip Scan이란?일반적인 복합 인덱스는 선행 컬럼 조건이 있어야 효율적으로 사용할 수 있다.예를 들어 아래와 같은 인덱스가 있다고 가정하면,보통은 gender 조건이 있어야 created.. 2026. 4. 21.
인프라 비용 절감만큼 재미난 작업은 없는 것 같다 최근 딱 일주일정도. 집중해서 인프라 점검만 지속적으로 했다. 그의 결과로 인프라 유지비용 거의 반절가량 감소드라마같이 참 아름다운 그래프가 나왔다. 4.12 일요일 점심부터 새벽까지 하루 통째로 써서 참 여러가지로 다 뜯어본 것 같다. 미사용 고아 자원 정리각종 서비스 실사용량 측정하여 필요치만큼 다운사이징 dev 환경 야간&주말 자동 스케일다운admin 서버 무중단 배포를 위해 상시 서버 두대로 돌리던걸 한개로 재구성. *배포중에만 두대, 끝나면 한대로 다운사이징ECS Container Insights 비활성화 로드밸런서 통합 등... 회사에 제대로 돈 벌어준 것 같은 뿌듯함.작업하다 서버 여러차례 뻗어서 셋업 만지느라 머리좀 쥐어뜯고 있었지만,,가장 쉽고 빠르게 만족할만한 결과물이 나와서인지, .. 2026. 4. 21.
성장의 큰 치트키 중 하나는, 문제가 발생하기 전에 문제를 생각해볼 수 있는 능력이 아닐까. 개인적인 생각들을 메모의 느낌으로 남겨보는 글입니다. 생각 정리의 목적으로 작성되는 컨텐츠라, 글 작성에 있어 ai는 사용하지 않습니다.또한 다소 주관적인 글인지라 진짜 '정답'과는 다소 동떨어진 게시물일 수 있습니다.사람은 대체로 문제를 마주한 뒤에야 생각하기 시작한다.일이 틀어지고, 관계가 흔들리고, 선택의 결과가 눈앞에 드러난 뒤에야 비로소 “왜 이렇게 됐을까”를 고민한다.그리고 그 고민과 시행착오의 과정 속에서 우리는 성장한다. 많은 성장은 이렇게 문제와 고통을 통과한 뒤에 따라오는 보상처럼 주어진다.그런데 여기서 한 가지 질문을 던져볼 수 있다.만약 문제가 실제로 닥치기 이전에 이미 그 문제를 생각해볼 수 있으면 어떨까?보통의 경우에, 성장은 위의 예시처럼 실패라는 비용을 치르고 얻는다.하지만 .. 2026. 1. 26.
(Node.js)(Next.js) SSR 에서 localhost 연결 안되는 이슈 원인 & 해결방안 웹 서비스를 로컬 개발하다가 팀원의 컴퓨터에서 재미난 이슈를 발견하여 포스팅해본다. 문제상황클라이언트 사이드에선 말짱히 잘 조회되는 localhost url이서버 사이드에선 조회가 안된다.api url : http://localhost:3000/api/v1 ...fetch, axios 그 어떤걸 써봐도 동일하다 해결방법 먼저첫번째 해결 방법. node.js 버전이 17~23이고, 조금 낮은 버전대라면,node.js 최신 버전으로 업데이트를 해보자. 이 이슈가 정확히 몇버전에서 완전히 해결되었는지까진 전부 파악하지 못하였지만,우선 내가 확인한 Node.js의 최신 버전들에선 대부분 localhost IPv6 요청이 실패했을때 자동으로 IPv4 요청으로 재시도시켜주는 로직이 추가되어있었다. 확인해본 버.. 2025. 6. 12.
GCP 리소스를 볼 권한이 없습니다. dataform.repositories.list 권한이 있는지 확인하세요. 해결 구글 클라우드 플랫폼 bigquery를 셋팅하던 도중 아래 메시지가 떳다. 리소스를 볼 권한이 없습니다. dataform.repositories.list 권한이 있는지 확인하세요. 그래서 IAM에 뭔 왠만한 권한 다 넣어봤다.BigQuery Data ViewerBigQuery UserDataform AdminDataform EditorOwner 여전히 안된다. 이슈 서칭중에 어떤 한 게시물을 보고 혹시나해서 결제수단을 업데이트 해봤다.https://www.googlecloudcommunity.com/gc/Community-Hub/SOLVED-Permissions-error-when-deploying-to-Google-App-Engine/m-p/670085#M4107 [SOLVED] Permissions.. 2025. 5. 8.
윈도우에서 애플 트랙패드를 쓰는 정신나간 놈이 있다? 윈도우에서 애플 트랙패드를 쓰는 정신나간 놈이 있다?그게 바로.. 나다..  ㅋㅋ... 이 글에선 애플 트랙패드를 윈도우에서mac과 거의 동일한 수준으로 잘 사용할 수 있는 방법이 있어 소개해보고자 한다.  배경윈도우는 작업도구가 아니다. 게임기다.몇달 넘게 게임을 안하니 데스크탑을 켤 일도 없었다. 맥북만 주구장창 쓴지 몇달째...간만에 데스크탑좀 써보려다가... 마우스라는게 진짜 그렇게나 너무 불편하더라..키보드를 치다가 커서를 움직이려면 팔을 오른쪽으로 옮겨야 한다니세상 이렇게 번거로울수가.. 그래서 윈도우에서 애플 터치패드를 쓸 방법을 죽어라 뒤져봤다.근데 이게 웬걸, 누군가 이미 만들어놓은게 있다.ㅋㅋ여전히 세상엔 나처럼 정신나간 사람들이 많더라 결론부터 적어보자면 맥에서 쓰는거랑 95%정도, .. 2024. 12. 8.
composer 설치 명령어 php 먼저 깔려있어야함.php 설치 여부 확인.php -v  php 없다면 php 먼저 설치.brew install phphomebrew마저 없다면 아래글 참고.> ~/.zprofileeval "$(/opt/homebrew/bin/brew shellenv)"  설치" data-og-host="asj8000.tistory.com" data-og-source-url="https://asj8000.tistory.com/entry/home-brew-%EC%84%A4%EC%B9%98-%EB%AA%85%EB%A0%B9%EC%96%B4" data-og-url="https://asj8000.tistory.com/entry/home-brew-%EC%84%A4%EC%B9%98-%EB%AA%85%EB%A0%B9%EC%96.. 2024. 11. 26.
Homebrew 설치 명령어 설치 명령어/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Path 추가 (zsh 사용시)echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofileeval "$(/opt/homebrew/bin/brew shellenv)"  설치후 확인.brew --version 2024. 11. 26.
유의적 버전 (Semantic Versioning). 버전 관리 버저닝버전 번호는 소프트웨어의 변경사항을 나타내며, 개발자와 사용자가 소프트웨어의 상태를 쉽게 이해하고 관리할 수 있도록 도와준다. 일반적인 버전 번호는 보통 세부분으로 나누어지며 아래와 같은 형태를 가진다. MAJOR.MINOR.PATCH1.2.20   세상엔 정말 다양한 버전 관리 방법이 있으며, 그 중 Semantic Versioning이 특히 오픈 소스 프로젝트에서 매우 널리 사용된다.그래서 오늘은 이것에 대해 정리해보고자 한다. 유의적 버전 (Semantic Versioning) 위의 시맨틱 버저닝의 경우, 깃헙의 공동창업자인 Tom Preston-Werner이 만든 규칙이며, 아래 공식사이트에서 상세한 내용들을 읽어볼 수 있다.https://semver.org/이 글에선 이에 대해 요약해보려한.. 2024. 6. 23.