grep 'fail|error' 했는데 왜 검색이 안 될까? 파이프 기호의 비밀
2025. 11. 8. 20:28
리눅스
🔍 이 글을 읽어야 하는 분: sudo dmesg | grep 'fail|error'를 실행했는데 원하는 결과가 안 나오는 분, grep에서 OR 검색할 때 언제 역슬래시()를 붙여야 하는지 헷갈리는 분문제 상황: 왜 내 grep이 작동 안 할까?리눅스에서 시스템 로그를 확인하다가 다음과 같은 명령어를 실행했습니다:sudo dmesg | grep 'fail|error'하지만 예상과 달리 아무것도 출력되지 않거나 엉뚱한 결과만 나왔다면? 이 글이 정확히 여러분을 위한 글입니다.실제로 발생하는 문제# ❌ 이렇게 하면 안 됩니다sudo dmesg | grep 'fail|error'# 결과: 'fail|error' 문자열 그대로만 검색 (OR 연산 아님!)# ❌ 이것도 문제sudo dmesg | grep 'f..
복잡한 YAML 이제 걱정 끝! Kubernetes 자동 생성 팁
2025. 11. 8. 14:28
k8s
Kubernetes를 처음 배우는 분이라면 .yaml 파일을 처음부터 작성하는 것이 너무 번거롭다고 느낄 때가 많습니다. 특히 Deployment, Service, ConfigMap, Secret 같은 리소스를 직접 작성하려면 필드와 옵션을 일일이 기억해야 하죠.하지만 kubectl --dry-run=client 옵션을 활용하면, 실제 클러스터에 적용하지 않고 YAML 파일을 바로 생성할 수 있습니다. 오늘은 이 유용한 팁과 함께 자동으로 YAML 파일을 만들어주는 간단한 쉘 스크립트까지 소개합니다.--dry-run=client 활용법예를 들어 Nginx Deployment를 만들고 싶지만, 먼저 YAML 파일로 확인하고 싶다면 다음 명령어를 사용할 수 있습니다.kubectl create deployme..
[강추] 리눅스 실습 환경 찾다가 발견한 최고의 사이트 LabEx 솔직 후기
2025. 11. 6. 21:38
리눅스
리눅스 실습 환경 찾다가 발견한 최고의 사이트 LabEx 솔직 후기안녕하세요! 요즘 리눅스 공부하고 계신가요? 저는 최근 리눅스 공부를 시작하면서 한 가지 확실하게 깨달은 게 있습니다. 이론만 보는 건 정말 비효율적이다라는 것이죠.명령어를 백날 외워봤자 직접 쳐보지 않으면 절대 내 것이 되지 않더라고요. 그래서 실습 위주로 공부하기로 마음먹었습니다.환경 구성이 너무 번거로운 문제그런데 문제가 생겼습니다. 내 컴퓨터에 Ubuntu 환경을 구성하는 게 생각보다 귀찮더라고요.듀얼 부팅? 너무 복잡해요가상머신? 램이 부족해서 느려요WSL? 뭔가 애매한 느낌...집에서는 데스크톱, 밖에서는 노트북을 쓰는데 각각 환경을 구성하는 것도 일이고, 무엇보다 언제 어디서든 바로바로 실습하고 싶은데 이게 안 되더라고요.우연..
start_date와 end_date가 같을 때, 왜 데이터가 비어 있을까?
2025. 10. 13. 17:15
라이브러리 & 프레임워크/FastAPI
프로젝트를 진행하면서 단일 날짜(start_date == end_date)로 시뮬레이션 데이터를 조회할 때, 해당 날짜의 레코드가 전혀 조회되지 않는 문제가 있었다. 처음엔 쿼리 조건이 단순해서 금방 해결될 줄 알았는데, 생각보다 꽤 깊은 이슈였다. --- 문제 상황start_date 와 end_date 를 동일하게 입력했을 때 하루 전체 레코드가 조회되지 않았다.query = query.where(Simulation.created_at >= start_date)query = query.where(Simulation.created_at 즉, created_at이 datetime 컬럼일 경우 00:00:00 시점에 정확히 일치하는 데이터만 포함되고,그 날짜의 나머지 레코드는 모두 누락되었다.원인 ..
FastAPI와 SQLAlchemy에서 이해하는 낙관적 락과 비관적 락
2025. 10. 6. 16:53
컴퓨터 과학/데이터베이스
웹 개발이나 API 설계에서 동시성 문제는 피할 수 없는 주제입니다. 특히 시뮬레이션 실행이나 계좌 잔액 수정처럼 동시에 여러 요청이 들어오는 상황에서는 데이터 정합성을 유지하는 것이 중요합니다. 이를 위해 흔히 사용하는 방법이 락(Lock) 전략입니다. 이번 글에서는 **낙관적 락(Optimistic Lock)**과 비관적 락(Pessimistic Lock), 그리고 분산 락(Redis 락) 개념을 정리합니다.1. 비관적 락(Pessimistic Lock)원리:데이터를 조회하거나 수정할 때 즉시 잠금다른 트랜잭션이 해당 데이터를 수정하지 못하도록 차단장점:동시성 충돌 방지데이터 정합성 강력 보장단점:락이 유지되는 동안 다른 트랜잭션은 대기 → 성능 저하데드락 가능DB 적용 예 (PostgreSQL + ..
map 함수를 사용 후 중괄호([])로 접근할 때
2024. 1. 4. 13:52
프로그래밍 언어/Python
map 을 사용해 여러 개의 값을 입력받아 바로 리스트에 저장하는 코드를 작성했다. 코드는 다음과 같았다. fish_price = map(int, input("가격: 2000 2500 3000").split()) 하지만 이것을 사용해서 fish_price의 원소에 [] 인덱스로 접근했을 때 fish_price = map(int, input("가격: 2000 2500 3000").split()) print(fish_price[1]) 위 코드를 실행하면 아래와 같은 에러가 발생한다. fish_price의 타입을 체크해보면 다음과 같다. fish_price의 타입은 바로 map 이다. map은 iterable을 반환합니다. 간단히 말하면 한 번에 하나씩 원소를 차례대로 내뱉은 존재이기 때문에 중괄호([])와 ..
얕은 복사와 깊은 복사
2024. 1. 4. 13:39
프로그래밍 언어/Python
얕은 복사와 깊은 복사는 프로그래밍에서 객체를 복사하는 두 가지 방법입니다. 얕은 복사(shallow copy) 얕은 복사란 원본 객체의 주소를 복사하여 새로운 객체를 생성하는 방식입니다. 원본 객체와 복사된 객체가 같은 메모리를 참조하므로 한쪽의 객체를 변경하면 다른 쪽의 객체도 함께 변경됩니다. old_list = [[1, 2, 3], [4, 5, 6], [7, 8, 'a']] new_list = old_list.copy() new_list[2][2] = 9 print(f"{old_list=}, {new_list=}") print(f"{id(old_list)=}, {id(new_list)=}") print(f"{id(old_list[0])=}, {id(new_list[0])=}") old_list를 ..
값 비교 시 is 연산자를 쓰면 안되는 이유
2023. 12. 29. 17:56
프로그래밍 언어/Python
is 연산자는 두 값이 같은지를 비교하는 것이 아닙니다. 두 객체가 메모리 상 동일한 주소에 저장되어 있는지를 비교합니다. 그렇기 때문에 두 값을 비교할 때는 반드시 is 연산자가 아닌 == 연산자를 사용해야 합니다. is 연산자는 어떻게 동작하는지 직접 코드를 작성하며 알아봤습니다. a = 1000 b = 1000 # 값이 같은지 비교 print(a == b) # 메모리 상에 각각 변수 a, b 에 저장된 값이 저장된 위치 print(id(a), id(b)) # 메모리 상 동일한 주소에 저장되어 있는지 비교 print(a is b) # 출력 결과 True 134878452576752 134878452577488 False 참고) 파이썬에서 정수 256 까지는 이미 해당 값이 메모리 상에 존재하면 기존의..