Node.js console.log가 [Object]를 출력하는 이유와 util.inspect depth 동작 정리

개요 Node.js에서 console.log로 객체를 찍다 보면 [Object], [Array]로 축약돼 상세 구조가 보이지 않는 경우가 많음 원인은 console.log가 내부적으로 util.inspect를 사용하고, 기본 depth가 2이기 때문임 아래에서 동작 방식과 옵션, 실무에서 흔히 하는 설정을 정리함 console.log가 [Object]로 축약되는 이유 console.log는 객체를 문자열로 만들 때 util.inspect를 사용함 기본 동작은 depth 2까지 펼치고 그 이후는 축약 표시 0단계 예시 { args: [Object] } 1단계 예시 { args: { take: 5, orderBy: [Array], where: [Object] } } 2단계 예시 { args: { take: 5, orderBy: [ [Object] ], where: { userId: 123 } } } 3단계 예시 { args: { take: 5, orderBy: [ { createdAt: 'desc' } ], where: { ... } } } 기본 depth가 2이므로 3단계 이상 중첩된 객체는 [Object], 배열은 [Array]로 축약 표시됨 util.inspect 간단 소개 util.inspect는 node:util 모듈에 있는 함수로, JS 값을 사람이 읽기 좋은 문자열로 직렬화하는 유틸리티 console.log(obj)는 실질적으로 util.inspect(obj, { depth: 2, colors: false })와 유사하게 동작함 ...

March 11, 2026

Sanity Testing vs Smoke Testing 핵심 차이와 적용 기준

개요 새너티 테스트와 스모크 테스트는 릴리스 안정성을 빠르게 가늠하기 위한 얕은 검증 활동. 용어가 비슷하지만 주체와 시점, 방법이 다름. 헷갈리면 품질 게이트가 흐려짐 개념과 정의 Sanity Testing 새로 추가된 기능이나 수정된 버그가 의도대로 동작하는지 개발자가 빠르게 확인하는 탐색형 확인. 사전에 문서화된 테스트 케이스 없이 핵심 경로 위주 확인 Smoke Testing 시스템의 주요 기능에 대해 미리 정의된 테스트 케이스의 부분 집합을 실행해 빌드가 더 깊은 테스트를 진행할 수 있을 만큼 건강한지 확인. 전자 기판에 전원을 넣어 연기가 나는지 보는 관행에서 유래 동작과 시점 주체 새너티는 대부분 개발팀 중심. 스모크는 개발팀 또는 검증팀 수행 대상 새너티는 신규 기능과 버그 수정 범위. 스모크는 로그인 결제 등 핵심 기능 전반 시점 새너티는 빌드 또는 릴리스 전 변경 단위 확인. 스모크는 빌드 후 통합본에서 수행 방법 새너티는 자유 탐색형 확인. 스모크는 사전 정의된 케이스 집합 실행 간단 예시 로그인 기능을 추가했다면 개발자는 로컬이나 스테이징에서 정상 로그인 실패 케이스 리그레션을 빠르게 새너티로 본다. 이후 통합 빌드가 배포되면 스모크에서 로그인 회원가입 대시보드 진입 등 핵심 플로우가 최소 기준을 충족하는지 본다. 하나라도 막히면 빌드 불합격 처리 ...

March 10, 2026

jQuery siblings와 DOM 형제 탐색 정리

개요 jQuery siblings 계열 메서드와 브라우저 DOM API에서 형제 노드를 탐색하는 방법 정리 jQuery는 요소 노드 기준으로 동작, DOM API의 일부 속성은 텍스트 노드를 포함하므로 차이 주의 핵심 개념 .siblings([selector]) 선택한 요소의 형제 요소 중 선택자에 일치하는 모든 요소 선택 .next() 바로 다음 형제 요소 선택 .nextAll([selector]) 다음에 위치한 형제 요소 모두 선택, 선택자 지정 시 필터링 .nextUntil(selector) 지정한 선택자에 해당하는 요소 바로 이전까지의 모든 다음 형제 요소 선택, 종료 요소는 미포함 .prev() 바로 이전 형제 요소 선택 .prevAll([selector]) 이전에 위치한 형제 요소 모두 선택, 선택자 지정 시 필터링 .prevUntil(selector) 지정한 선택자에 해당하는 요소 바로 다음까지의 모든 이전 형제 요소 선택, 종료 요소는 미포함 DOM 탐색 속성 ...

March 9, 2026

자바스크립트는 왜 프로토타입을 선택했나

개요 브라우저 스크립팅 수요와 10일 설계 제약 클래스보다 구현 단순, 런타임 확장 유리한 위임 모델 채택 개념 객체는 프로토타입 링크로 행동 위임 프로퍼티 조회는 체인 상향 전파 ES6 class는 프로토타입 문법 설탕 이유 동적 합성 용이, 메모리 공유로 중복 감소, 런타임 교체 가능 주의 깊은 체인 비용과 디버깅 난이도 this 바인딩 혼동, 내장 프로토타입 오염 금지 마무리 웹의 변화 속도에 맞춘 실용적 선택 외형은 class 사용 가능하나 내부 모델은 프로토타입 ...

March 8, 2026

Django ORM N+1 쿼리와 Lazy Loading, select_related vs prefetch_related 가이드

개요 N+1 쿼리 문제는 ORM에서 자주 발생하는 성능 이슈로, 기본 쿼리 1회 이후 연관 데이터를 접근하는 시점마다 추가 쿼리가 N회 발생하는 상황을 의미함 Django ORM은 기본적으로 lazy-loading 전략을 사용하므로 관계 필드 접근 시점에 쿼리가 실행됨 이 글에서는 N+1의 동작 맥락과 lazy-loading의 특성, 그리고 select_related와 prefetch_related로 N+1을 예방하는 방법을 정리함 N+1 쿼리 문제 예시 방문 기록 Visitor와 방문자 정보 Person이 외래키로 연결된 상황 가정 visitors = Visitor.objects.filter(visit_date__year=2022) for v in visitors: print(v.person.name, v.visit_date)위 코드는 다음 흐름으로 동작함 ...

March 7, 2026

Mac에서 docker: 'compose' is not a docker command 오류 해결

배경과 문제 정의 맥을 초기화하고 Homebrew cask로 Docker Desktop 설치 후 docker compose가 동작하지 않음 터미널에 docker: ‘compose’ is not a docker command 메시지 출력, buildx도 동일 증상 재설치와 초기화를 반복했지만 변화 없음 환경 macOS Ventura 13.0.1 Apple Silicon M1 Docker 20.10.21 build baeda1f 원인 가설 Docker Desktop에 포함된 CLI plugin 디렉터리가 docker가 검색하는 경로와 연결되지 않음 compose와 buildx는 독립 바이너리가 아니라 CLI plugin으로 배포됨 해결 CLI plugin 디렉터리에 심볼릭 링크 추가 ...

March 6, 2026

gRPC 핵심 정리와 실전 가이드 HTTP/2, Protocol Buffers, Proto 파일과 인코딩 원리

개요 소켓과 전통 RPC, 그리고 REST를 거쳐 gRPC가 등장한 배경과 핵심 특성 정리 HTTP/2와 Protocol Buffers를 결합한 gRPC의 구조, Proto 파일 작성 규칙, 그리고 실제 인코딩 원리까지 흐름 중심으로 정리 후반부에는 인증과 장애 상황에서의 동작 특성, 도입 적합 영역 요약 등장 배경 Server-Client 모델의 확산 배경 초기 모놀리식 메인프레임 시대에는 네트워크 통신 중요도 낮음 소형 컴퓨터와 워크스테이션 보급으로 기능 분산 필요성 증가 네트워크 계층 표준화 진행과 함께 서버 간 통신이 핵심 과제로 부상 ...

March 5, 2026

DNS TTL(Time To Live) 이해와 실무 설정 가이드

개요 DNS TTL은 레코드가 캐시로 유지되는 시간의 기준값으로 초 단위 설정값임. 권한 네임서버가 응답에 TTL을 포함하고, 재귀 리졸버와 클라이언트가 이 시간 동안 결과를 기억함. TTL이 만료되면 다시 질의가 발생함 핵심 개념 TTL Time To Live DNS 응답을 브라우저나 재귀 DNS 서버가 얼마 동안 캐시할지 정하는 값 예 TTL이 300이면 해당 레코드는 5분간 캐시 유지, 이후 재질의 발생 부존재 응답 NXDOMAIN 역시 SOA 설정에 따라 일정 시간 캐시됨 왜 중요한가 TTL이 짧으면 변경 사항이 빠르게 반영됨 트래픽 변화 대응 용이 대신 DNS 요청 수 증가로 지연과 비용 증가 가능 TTL이 길면 질의 수가 줄어 효율적이고 안정적임 캐시 적중률 상승 대신 변경 반영이 느림 권장 TTL 값 가이드 일반 웹사이트 300600 510분 트래픽 변화가 잦은 API 60~300 안정적이고 변경이 드문 서비스 360086400 1시간하루 레코드 변경 직전 예 이관 60 이하로 낮춰 사전 준비 참고 사항 ...

March 4, 2026

CSS 선택자 핵심 정리와 명시도 가이드

개요 CSS에서 선택자는 DOM에서 스타일을 적용할 대상 요소 집합을 정의하는 식 컴포넌트 스코프와 일관된 스타일링, 유지보수 비용에 직접 영향 핵심 유형과 매칭 원리, 명시도와 베스트프랙티스 중심 요약 핵심 개념 타입 선택자 tag 특정 태그 타깃 클래스 선택자 .class 재사용 가능한 스타일 단위에 적합 아이디 선택자 #id 고유 요소 타깃, 명시도 높음 속성 선택자 [attr], [attr=value], [attr*=substr] 속성 값 기반 매칭 가상 클래스 :hover, :focus, :active, :not(), :is() 상태나 집합 표현 가상 요소 ::before, ::after 논리적 하위 요소 생성 결합자 A B 하위, A > B 자식, A + B 인접 형제, A ~ B 일반 형제 관계 표현 그룹 A, B 동일 스타일의 대상 묶음 최신 선택자 :has() 부모가 특정 자식을 가질 때 매칭, 브라우저 지원 범위 확인 권장 동작 원리와 명시도 브라우저는 각 규칙의 선택자를 DOM 노드에 대조해 매칭된 규칙을 수집 후 명시도와 소스 순서로 충돌 해결 명시도 계산 규칙 요약 ...

March 3, 2026

Django Middleware 핵심 이해와 커스텀 구현 가이드

개요 Django의 미들웨어는 요청과 응답을 전역적으로 가로채어 공통 로직을 삽입하는 경량 플러그인 시스템임. 입력 또는 출력의 전역 수정이 필요할 때 사용함 미들웨어 시스템과 순서 settings.py의 MIDDLEWARE 리스트에 등록된 항목을 기준으로 동작함. 요청 단계는 위에서 아래 순서로 통과, 응답 단계는 아래에서 위 순서로 역순 통과. 순서가 기능적 의존성과 직결되므로 중요함. 예시로 AuthenticationMiddleware는 세션을 읽기 때문에 SessionMiddleware 이후 배치 필요 커스텀 미들웨어 만들기 미들웨어는 함수 기반 또는 클래스 기반 중 하나로 작성. get_response를 호출하면 다음 미들웨어 혹은 최종 view로 제어가 넘어가며, 반환 이후 구간이 응답 후 처리 지점이 됨 ...

March 2, 2026