[Java] String 메서드 정리 (공백 제거, 대소문자, 자주 쓰는 메서드)
·
Java 코딩테스트/자주 쓰는 클래스 정리
코딩테스트에서 문자열 문제는 거의 매번 나온다. 자주 쓰는 String 메서드를 기능별로 정리한다.String은 불변(immutable)이다. replace, toUpperCase 같은 메서드는 원본을 바꾸지 않고 새 문자열을 반환한다. 그래서 반드시 반환값을 받아서 써야 한다.String s = "hello";s.toUpperCase(); // 결과 버려짐 — 원본 그대로s = s.toUpperCase(); // 이렇게 받아야 반영됨1. 길이 / 문자 접근 — length(), charAt()String s = "algorithm";System.out.println(s.length()); // 9System.out.println(s.charAt(0)); // 'a'length..
[Java] StringBuilder 사용법 총정리 (append, insert, reverse 등)
·
Java 코딩테스트/자주 쓰는 클래스 정리
문자열을 반복해서 이어 붙일 때 String + String을 쓰면 매번 새로운 객체가 만들어져 비효율적이다. 이럴 때 사용하는 것이 StringBuilder다. 내부적으로 하나의 버퍼를 재사용하기 때문에 반복문 안에서 문자열을 조립할 때 특히 유용하다.String은 불변(immutable), StringBuilder는 가변(mutable). 이 차이가 성능 차이의 핵심이다.1. 생성StringBuilder sb1 = new StringBuilder(); // 빈 문자열 (기본 용량 16)StringBuilder sb2 = new StringBuilder("coding"); // 초기 문자열 지정StringBuilder sb3 = new StringBuilder(32); // 초기..
[Spring] ThreadLocal로 DB 라우팅하기 - Repository 하나로 PROD/TEST 두 DB를 오가는 법
·
Spring
들어가며최근 회사에서 Express로 되어 있던 백오피스 기능 하나를 Spring 배치 프로그램으로 옮기는 작업을 하고 있다. 그 과정에서 ServerEnvContext라는 클래스를 만나게 됐는데, 처음 봤을 때는 "이게 뭐지? 왜 static 메서드에 람다를 넘기지?" 싶었다. 뜯어보니 ThreadLocal 기반 동적 DataSource 라우팅이라는, 알고 나면 꽤 우아한 패턴이었다.배치 특성상 하나의 프로그램이 PROD와 TEST 두 DB를 번갈아 다뤄야 하는 상황이었고, 이 요구사항이 바로 이 패턴이 필요해진 배경이다.이 글에서는 그 코드를 일반화한 예제로, 다음 흐름을 따라가 본다.왜 이런 장치가 필요한가 (문제 상황)ThreadLocal이 뭔가핵심 메서드 call() 뜯어보기RoutingData..
[DevOps] Docker Compose 제대로 이해하기
·
DevOps
들어가며로컬에서 NestJS 프로젝트를 개발하다 보면 앱 하나만 띄워서 되는 경우가 거의 없습니다. DB도 필요하고, 캐시용 Redis가 붙기도 하고, 경우에 따라 메시지 큐까지 필요할 때도 있습니다.처음에는 저도 docker run으로 하나씩 띄웠습니다.docker run -d --name my-db \ -e SA_PASSWORD=MyP@ssw0rd! \ -e ACCEPT_EULA=Y \ -p 1433:1433 \ -v sqldata:/var/opt/mssql \ mcr.microsoft.com/mssql/server:2022-latest이걸 컨테이너 개수만큼 반복하고, 옵션 하나 틀리면 지우고 다시 띄우고... 게다가 이 긴 명령어는 제 머릿속과 셸 히스토리에만 존재해서, 팀원에게 환경을 공..
[Node.js] npm과 pnpm? 패키지 매니저 차이 제대로 이해하기
·
Node.js
들어가며회사에서 NestJS 프로젝트를 하다 보면 npm install은 거의 숨 쉬듯이 치게 됩니다. 저도 1년 넘게 npm만 썼고, 솔직히 패키지 매니저에 대해 깊게 생각해본 적이 없었습니다. "설치되면 그만 아닌가?" 싶었거든요.그런데 사이드 프로젝트를 여러 개 만들다 보니 디스크 용량이 이상하게 빨리 차고, node_modules 폴더 하나가 수백 MB씩 되는 걸 보면서 의문이 생겼습니다. 그러다 pnpm을 알게 됐고, 동작 원리를 파보니 단순히 "빠른 npm"이 아니라 설계 철학 자체가 다른 도구라는 걸 알게 됐습니다.이번 글에서는 npm과 pnpm이 구조적으로 어떻게 다른지, 그리고 실제로 갈아탈 때 뭘 조심해야 하는지 정리해보겠습니다.1. npm의 node_modules는 왜 그렇게 무거울까..
[Node.js] Node.js 이벤트 루프(Event Loop) & 비동기 실행 순서 완벽 정리
·
Node.js
Node.js를 공부하다 보면 가장 많이 듣는 말이 있습니다."Node.js는 싱글 스레드 기반이다."그런데 실제로는 수천 개의 요청을 동시에 처리합니다.싱글 스레드인데 어떻게 동시 처리가 가능할까요?이번 글에서는 Node.js의 핵심인 이벤트 루프(Event Loop) 와 비동기 실행 순서를 이해하기 쉽게 정리해보겠습니다.Node.js는 정말 싱글 스레드일까?정확히 말하면,JavaScript를 실행하는 스레드가 하나다.라는 의미입니다.많은 사람들이"Node.js = 스레드 1개"라고 생각하지만 사실은 조금 다릅니다.Node.js 내부에는 libuv라는 라이브러리가 존재합니다.시간이 오래 걸리는 작업들은 libuv가 대신 처리합니다.예를 들면파일 읽기/쓰기네트워크 통신데이터베이스 조회DNS 조회같은 작업..
[Test] NestJS 프로젝트에 Jest 도입하기 — 변환 방식 3가지부터 실전 트러블슈팅까지
·
Test
들어가며테스트가 0개인 NestJS(TypeScript) 프로젝트에 Jest를 처음부터 도입하면서 정리한 글이다. "ts-jest를 쓴다"는 건 알겠는데 왜 써야 하는지, NestJS에서는 무엇이 더 필요한지, 그리고 실제로 깔다 보면 만나는 함정들까지 한 번에 정리한다.1. Jest란? 그리고 왜 TypeScript는 "변환"이 필요한가Jest는 메타(페이스북)가 관리하는 자바스크립트 테스팅 프레임워크다. watch 모드, 비동기 테스트, 모킹(mocking), 스파이(spying), 커버리지 측정까지 한 패키지에서 다 제공한다.여기서 반드시 기억할 한 문장:Jest는 기본적으로 Node.js 환경에서 실행되는 "자바스크립트" 테스트 도구다.Node.js는 TypeScript 문법을 해석하지 못한다. ..
[Test] Jest vs Vitest 비교: 2026년에는 무엇을 선택해야 할까?
·
Test
JavaScript와 TypeScript 생태계에서 테스트 라이브러리를 이야기하면 가장 먼저 떠오르는 이름은 Jest입니다.하지만 최근 Vite의 성장과 함께 Vitest가 빠르게 점유율을 높여가고 있습니다.실제로 신규 프로젝트에서는 Vitest를 선택하는 사례가 늘어나고 있으며, 기존 Jest 사용자들 또한 마이그레이션을 검토하고 있습니다.이번 글에서는 Jest와 Vitest를 다양한 관점에서 비교하고 어떤 상황에서 어떤 도구를 선택하는 것이 적합한지 알아보겠습니다.Jest란?Jest는 Facebook(Meta)에서 개발한 JavaScript 테스트 프레임워크입니다.특징은 다음과 같습니다.설정이 거의 필요 없음Mock 기능 내장Snapshot Testing 지원풍부한 플러그인 생태계React 생태계와 ..