본문 바로가기

전체 글

C# Lazy 지연 초기화 사용법: 스레드 안전 모드와 싱글톤 한 줄 요약: C# Lazy 지연 초기화는 Lazy로 비용이 큰 객체를 처음 Value를 읽을 때 한 번만 만드는 방법입니다. 기본 모드(ExecutionAndPublication)는 스레드에 안전하고, 단일 스레드라면 LazyThreadSafetyMode.None으로 잠금 비용을 줄일 수 있습니다.C# Lazy 지연 초기화란 무엇인가요?지연 초기화(lazy initialization)는 객체 생성을 실제로 필요한 시점까지 미루는 기법입니다. .NET에서는 System.Lazy가 이를 표준 방식으로 제공하며, 값을 읽는 Value 속성과 생성 여부를 알려주는 IsValueCreated 속성으로 구성됩니다. 앱 시작 속도를 높이거나, 쓰이지 않을 수도 있는 무거운 객체(DB 클라이언트, 큰 캐시, 설정 파.. 더보기
React useSyncExternalStore 사용법: 외부 스토어 구독하기 한 줄 요약: React useSyncExternalStore는 React 바깥에 있는 값(브라우저 API, 외부 스토어)을 안전하게 구독해 컴포넌트에 반영하는 Hook입니다. subscribe와 getSnapshot 두 함수만 넘기면 되고, 서버 렌더링에는 getServerSnapshot을 추가합니다. 직접 쓰기보다 useOnlineStatus 같은 커스텀 Hook으로 감싸 쓰는 방식이 일반적입니다.useSyncExternalStore란 무엇인가요?useSyncExternalStore는 React 컴포넌트가 외부 스토어(external store)를 구독하게 해 주는 React Hook입니다. 외부 스토어란 Redux, Zustand 같은 서드파티 상태 관리 라이브러리나, navigator.onLine.. 더보기
C# 13 params 컬렉션: ReadOnlySpan으로 할당 줄이기 한 줄 요약: C# 13의 params 컬렉션은 params 키워드를 배열뿐 아니라 Span, ReadOnlySpan, IEnumerable, List 같은 컬렉션 타입에도 쓸 수 있게 해 줍니다. 특히 params ReadOnlySpan를 쓰면 호출할 때마다 힙에 배열을 만들던 비용을 피할 수 있어서, 자주 호출되는 가변 인자 메서드의 GC 부담을 줄일 수 있습니다.C# 13 params 컬렉션이란 무엇인가요?params 컬렉션은 가변 인자(params) 매개변수의 타입을 배열(T[])로만 제한하던 C# 12 이전 규칙을 확장한 C# 13 기능입니다. Microsoft Learn 문서에 따르면 C# 13부터 params 매개변수는 1차원 배열, Span, ReadOnlySpan, 컬렉션 빌더가 있는 타.. 더보기
React useDeferredValue 사용법: 입력 지연과 초기값 설정 한 줄 요약: React의 useDeferredValue는 값의 업데이트를 뒤로 미뤄 입력창은 바로 반응하게 하고, 무거운 목록이나 차트는 백그라운드에서 천천히 따라오게 만드는 Hook입니다. React 19부터는 두 번째 인자 initialValue로 첫 렌더링의 값도 지정할 수 있습니다. 효과를 보려면 지연된 값을 받는 컴포넌트를 memo로 감싸야 합니다.useDeferredValue란 무엇인가요?useDeferredValue는 UI의 일부 업데이트를 지연시키는 React Hook입니다. 공식 문서 기준 시그니처는 useDeferredValue(value, initialValue?)이며, 반환값은 이전 렌더링의 값을 잠시 유지하다가 백그라운드 렌더링이 끝나면 최신 값으로 바뀝니다.동작은 두 단계입니다.. 더보기
C# ArrayPool 사용법: Rent와 Return으로 GC 부담 줄이기 C# ArrayPool는 배열을 매번 new로 만들지 않고 풀에서 빌려 쓰고 반납(Rent/Return)해 GC 할당과 메모리 압박을 줄이는 클래스입니다. 크기가 큰 버퍼를 반복해서 만드는 코드(파일/네트워크 I/O, 문자열 파싱, 직렬화)에서 효과가 크고, 사용법은 Rent 후 try/finally로 Return하는 것이 기본입니다. 단, Rent가 요청보다 큰 배열을 돌려줄 수 있고 내용이 비워져 있지 않다는 점을 반드시 알아야 합니다.ArrayPool란 무엇인가요?ArrayPool는 System.Buffers 네임스페이스에 있는 추상 클래스로, T[] 배열의 풀(pool)을 제공합니다. 대부분은 정적 인스턴스인 ArrayPool.Shared를 사용합니다. 풀에서 배열을 빌릴 때는 Rent, 돌려줄 .. 더보기
React Compiler 사용법: 자동 메모이제이션 설정 가이드 한 줄 요약: React Compiler는 빌드 시점에 컴포넌트와 훅을 분석해 useMemo, useCallback, React.memo와 같은 메모이제이션을 자동으로 넣어 주는 도구입니다. 설치는 babel-plugin-react-compiler 하나면 되고, React 19에서 가장 잘 동작하며 React 17, 18도 지원합니다. 기존 코드는 그대로 두고 점진적으로 켜 보는 것이 안전합니다.React Compiler란 무엇인가요?React Compiler는 React 앱을 빌드 시점에 자동으로 최적화하는 도구입니다. React 공식 문서는 이를 "Rules of React를 이해하고 일반 JavaScript 코드에 적용되는 빌드 타임 도구"로 설명합니다. 개발자가 직접 useMemo나 useCall.. 더보기
C# Lock 클래스 사용법: .NET 9 lock 성능과 안전성 높이기 한 줄 요약: C# 13과 .NET 9부터는 object 대신 System.Threading.Lock 타입으로 lock 객체를 만드는 것이 권장됩니다. lock 문 문법은 그대로 두고 필드 타입만 Lock으로 바꾸면 컴파일러가 Lock.EnterScope() 기반 코드를 생성해 의도가 분명하고 더 효율적인 잠금이 됩니다.System.Threading.Lock이란 무엇인가요?System.Threading.Lock은 .NET 9에서 추가된 스레드 동기화 전용 클래스입니다. 지금까지는 private readonly object _gate = new();처럼 아무 object나 만들어 lock의 대상으로 썼고, 내부적으로는 Monitor가 사용됐습니다. 이제는 "이 필드는 잠금 용도"라는 사실이 타입에 드러나며.. 더보기
React useFormStatus 사용법: 폼 제출 pending 처리 한 줄 요약: React useFormStatus는 부모 이 제출 중인지(pending)를 자식 컴포넌트에서 바로 읽게 해 주는 React 19의 훅입니다. 제출 버튼 비활성화나 로딩 문구를 props 전달 없이 구현할 수 있고, 반드시 form 안쪽에 렌더링되는 별도 컴포넌트에서 호출해야 합니다.React useFormStatus란 무엇인가요?useFormStatus는 react-dom 패키지가 제공하는 훅으로, 자신을 감싸고 있는 부모 form의 마지막 제출 상태(pending, data, method, action)를 반환합니다. React 19에서 form의 action 속성에 함수를 넘기는 방식이 정식 지원되면서 함께 쓰이는 기본 도구가 됐습니다. 예전에는 isSubmitting 같은 state.. 더보기