분류 전체보기 235

[DB] Slow Query Log 를 통해 병목 현상 진단 및 개선

회사에서 첫 개발 기능을 배포했다. 테스트 환경에서는 문제가 없었으나, 수천만개의 데이터가 쌓인 운영 DB 에서 호출 지연 이슈가 있었다. 어디서 병목이 생기는지 정확히 파악하기 위해 Slow Query Log 를 사용한 과정을 작성해보겠다. ※ 보안 안내: 본 포스팅은 실제 운영 서비스의 도메인 정보를 보호하기 위해 '학사 관리 시스템(학생 성적 이력)' 사례로 치환하여 작성되었습니다. 기술적 트러블슈팅의 핵심 로직과 명령어, 해결 과정은 실제 사례와 동일합니다. 1. Slow Query 로그 설정 명령어DB에 직접 접속하여 아래 명령어들을 차례로 실행한다. 1.1 슬로우 쿼리 로그 기능을 활성화한다.SET GLOBAL slow_query_log = 'ON'; 1.2 슬로우 쿼리로 기록할 임계 시..

카테고리 없음 2026.01.05

[cicd] 셀프호스팅 gitlab 에서 자동 배포 파이프라인 구축하기

이직했다.회사에서 배포 프로세스로 FTP 프로토콜 기반의 FileZilla를 사용해 서버에 파일을 업로드하는 방식을 사용하고 있었다. 전 회사에서 초창기에 FileZila로 배포해 본 경험이 있는데 이게 여간 불편하게 아니다. 사람이 수동으로 파일을 업로드하는 거다 보니 실수할 확률이 높은데, 그래서 배포 때마다 동료들과 모여 앉아서 교차 검증하며 배포를 진행해야 한다.예를 들어 배포할 파일이 50개가 넘어선다고 가정하면, 사람이 일일이 옮기는 과정에서 누락이 없다고 100% 보장하기 어렵다. 또 배포 과정이 이러니까 자연스럽게 자주 배포하기보다는 한 번에 배포하게 된다.그래서 배포 프로세스를 가장 먼저 개선하게 되었다. 자사는 셀프 호스팅 GitLab을 사용하고 있다. GitLab Container..

카테고리 없음 2026.01.05

[Python] Pythanic 하게 횡단 관심사 분리

Python 데코레이터로 서비스 레이어의 횡단 관심사 분리하기참고: 이 글의 코드 예시는 실제 업무에서 진행한 리팩토링을 기반으로 작성되었지만, 회사의 비즈니스 로직과 도메인 정보는 모두 제거하고 일반적인 예시(음식 주문 시스템)로 변경했음. 핵심은 횡단 관심사를 어떻게 분리했는가이지, 구체적인 비즈니스 로직이 아니기 때문. 패턴과 접근 방식은 동일하게 유지했음.현재 서비스 로직FastAPI 사용중/api/v2/order├── service_base.py # 모든 서비스가 상속받음├── main/│ ├── router.py│ ├── service.py│ └── dependencies.py└── platform/ ├── router.py ├── service.py ├──..

Python 2025.11.21

[Python] 모듈

학습 자료 : https://docs.python.org/ko/3.13/tutorial/modules.html모듈자바에서는 자주 사용하는 클래스나 함수들을 패키지로 묶어놓고 import 해서 사용한다. 파이선의 Module이 이와 같은 역할을 한다. 모듈이 왜 필요한가 ?인터프리터에서 직접 작성한 코드는 종료하면 사라져버린다. 그러나 모듈로 만들면 코드를 파일(*.py)로 저장할 수 있어서 재사용하거나 공유하기가 편리하다.모듈 불러오기: importimport fibo위 코드는 fibo 라는 모듈 객체를 만든다. 이 객체를 통해 모듈 안의 함수에 접근할 수 있다.fibo.fib(1000)fibo.fib2(100)__name__ 변수: 스크립트의 이름표모든 파이썬 모듈에는 __name__이라는 특별한 변..

Python 2025.09.25

[Python] 자료구조

학습 자료 : https://docs.python.org/ko/3.13/tutorial/datastructures.html자료구조리스트파이썬의 리스트는 객체지향적으로 설계되어 있어 다양한 내장 메서드를 제공한다. 아래 메서드들은 대부분 리스트를 제자리에서(in-place) 수정하고 None 을 반환한다. 요소 추가 및 확장list.append(x): 리스트 끝에 하나의 요소를 추가한다.list.extend(iterable): 리스트 끝에 다른 iterable(리스트, 튜플 등)의 모든 요소를 추가한다.요소 삽입 및 삭제list.insert(i, x): 특정 인덱스 i에 요소를 삽입한다.list.remove(x): 리스트에서 첫 번째로 발견된 x의 값을 삭제한다.list.pop([i]): 특정 인덱스의 i..

Python 2025.09.25

[Python] 조건문·반복문·함수

학습 자료 : https://docs.python.org/ko/3.13/tutorial/controlflow.html자료형파이썬은 타입 명시 없이 변수를 바로 선언할 수 있다.List : 여러개의 데이터를 순서대로 저장할 수 있음Tuple : List와 비슷하지만 한번 생성하면 내용을 변경할 수 없다Dictionary : 키와 값 쌍으로 데이터를 저장한다문법조건문if age > 20: print("성인")반복문words = ['cat', 'window', 'defenestrate']for w in words: print(w, len(w))파이썬의 for 문은 인덱스를 직접 다루지 않고, 요소 자체를 순회하는 방식이 기본임그래서 range() 를 사용하는데, range()는 반복문을 돌릴 때 특..

Python 2025.09.25

[Restful 아키텍쳐] RMM의 의미와 각 단계의 설계적 의의

아래 글은 Martin Fowler 의 Richardson Maturity Model - steps toward the glory of REST 를 읽고 정리한 내용입니다. ※ RMMRichardson Maturity Model (RMM)미국 개발자 Leonard Richardson이 제안한 RESTful API 성숙도 측정 모델RMM 은 API가 REST 원칙을 얼마나 잘 지키고 있는지를 Level 0 → Level 3 네 단계로 나누어 설명한다. RMM 단계Level 0 – The Swamp of POX : HTTP를 단순 데이터 운반(RPC) 용도로만 사용. 모든 요청이 하나의 엔드포인트로 감.ㄴ RPC : Remote Procedure Call, 원격 프로시저 호출 / 네트워크에 있는 다른 ..

카테고리 없음 2025.08.08

[CS] 멀티스레딩과 멀티프로세싱

▶ 프로세스컴퓨에서 실행중인 프로그램각각의 프로세스는 독립된 메모리 공간을 할당 받는다 ▶ 메인 메모리프로세스가 CPU 에서 실행되기 위해 대기하는 곳 ▶ IO(input/output)파일을 읽고 쓰거나, 네트워크의 어딘가와 데이터를 주고 받는 것입출력 장치(마우스, 키보드 등)와 데이터를 주거나 받는 것 ▶ 단일 프로세스 한 번에 하나의 프로그램만 실행됨단점 : CPU 사용률이 좋지 않음해결책 : "여러개의 프로그램을 메모리에 올려놓고 동시에 실행시키자" 라는 아이디어. IO 작업이 발생하면 다른 프로세스가 CPU 에서 실행됨. 이런 종류의 프로그램을 멀티프로그래밍 이라고 함 ▶ 멀티 프로그래밍여러개의 프로그램이 동시에 실행되는 것 ( IO 작업이 발생하면 다른 프로세스가 CPU 에서 실행됨 ) 목..

카테고리 없음 2025.08.07

[프로젝트] Mixed Content 오류로 인한 API 요청 차단 – Nginx를 통한 HTTPS 리버스 프록시로 해결

이슈 내용프론트엔드(React)가 HTTPS에서 서비스되는 반면, 백엔드(Spring API)는 HTTP로 서비스되고 있어 브라우저에서 Mixed Content 오류로 인해 API 요청이 차단되는 문제가 발생함. Mixed Content ? HTTPS 페이지가 HTTP 리소스를 요청할 경우 발생하는 보안 오류. 브라우저가 보안을 이유로 요청을 차단함. 이를 해결하기 위해 Nginx를 EC2 인스턴스에 설치하고, HTTPS 리버스 프록시를 구성하여모든 API 요청을 https://api.flybrief.site 도메인으로 안전하게 전달하는 구조로 변경한다. 문제HTTPS 페이지가 HTTP 리소스를 불러올 때 발생하는 보안 오류 해결 API 서버에 인증서 설치Nginx를 통해 HTTPS 리버스 프록시 구성모..

프로젝트 2025.07.18

[Spring] AOP 동작원리 : 리플렉션, JDK 동적 프록시

🎓 이 글은 인프런에서 제공하는 "스프링 핵심 원리 - 고급편" 강의를 수강하면서 정리한 내용을 바탕으로 작성한 글입니다.https://inf.run/FWeFN 이전글 에서 프록시를 사용해서 기존 코드를 변경하지 않고 부가기능을 적용하는 방법을 알아봤다. 그러나 클래스 기반 프록시의 경우 부가기능을 적용해야 하는 대상 클래스가 100개라면 프록시 클래스도 100개 만들어야 했다. 프록시 클래스를 하나만 만들어서 모든 곳에 적용할 수는 없을까 ? 자바가 기본으로 제공하는 JDK 동적 프록시 기술을 활용하면 프록시 객체를 동적으로 만들어낼 수 있다. JDK 동적 프록시를 이해하기 위해서는 먼저 자바의 리플렉션 기술을 이해해야 한다. ※ 리플렉션 기술리플렉션 기술을 통해 클래스나 메서드의 메타정보를 동적..

Spring 2025.06.12