본문으로 건너뛰기

TechLog: 프론트엔드부터 서버·설계까지

Tech​

매일 새롭게 알게 된 지식이나 문제 해결 경험을 기록합니다.

가상화 및 클라우드(2)

개발 및 실험 샌드박스(2)

데이터 포맷(2)

  • SVG는 웹에서 어떻게 쓰고 관리할까요?
    약 8분

    SVG를 img·CSS 배경·인라인·스프라이트로 사용하는 방식을 비교합니다. SVGO로 최적화하고, SVGR로 React 컴포넌트를 만들며 자산을 관리하는 방법을 정리합니다.

  • HEIC 이미지를 JPEG로 변환하기
    약 5분

    Node.js의 heic-convert로 HEIC 이미지를 JPEG로 변환합니다. Express·Multer로 업로드를 받고, Vue 화면에 변환 결과를 표시하는 예제를 다룹니다.

데이터베이스(4)

  • 무중단 스키마 마이그레이션과 expand-contract
    약 9분

    MySQL INSTANT DDL과 데이터 백필의 차이를 살펴봅니다. 기본값이 기존 행에 미치는 영향과 expand-contract 방식으로 무중단 전환을 준비하는 과정을 설명합니다.

  • 데이터베이스 기본 개념과 용어, 한 번에 정리하기
    약 12분

    테이블과 키, SQL부터 정규화·트랜잭션·인덱스까지 데이터베이스의 기본 개념을 설명합니다. 간단한 쿼리 예제로 개념을 연결하고, NoSQL과 데이터 분산 방식도 살펴봅니다.

  • DB 스키마에도 Git이 필요할까요?
    약 4분

    Liquibase·Flyway로 스키마 변경 이력을 관리하고 기존 DB에 기준선을 잡는 방법을 설명합니다. 스키마 마이그레이션과 데이터 변경 이력을 남기는 audit 테이블의 역할도 구분합니다.

  • 컬럼일까요, JSON 컬럼일까요?
    약 4분

    개별 컬럼과 JSON 컬럼을 선택할 기준을 살펴봅니다. 쿼리와 제약조건, 데이터 노출 범위, 기존 데이터를 채우는 비용을 비교합니다.

라이브러리와 프레임워크(9)

  • 스프링(Spring)은 프론트엔드의 무엇과 닮았을까요?
    약 13분

    Spring Bean과 의존성 주입을 React·TypeScript의 개념과 비교합니다. 웹 요청 처리와 DB 조회, 트랜잭션이 스프링에서 어떻게 이어지는지 설명합니다.

  • 백엔드 도구들, FE로 치면 무엇일까요?
    약 6분

    Gradle·ktlint·detekt를 프론트엔드의 빌드 도구·포매터·린터와 비교합니다. 테스트, DB 마이그레이션, 코드 생성 도구의 역할과 FE 도구에 비유할 때의 차이도 짚습니다.

  • 쿼리 키는 어떻게 캐시 주소가 되나요?
    약 16분

    TanStack Query가 쿼리 키로 캐시를 찾는 과정을 소스 코드로 살펴봅니다. 키의 직렬화와 부분 매칭, 데이터 갱신과 하이드레이션에서 주의할 점을 정리합니다.

  • 무엇을 상태로 두지 말아야 할까요?
    약 7분

    React에서 별도로 저장할 필요가 없는 상태를 구분합니다. 최신 값 읽기, 파생 값 계산, Effect의 연쇄 실행 예제로 상태를 줄이는 기준을 살펴봅니다.

  • Tailwind CSS 4.0, 무엇이 달라졌나요?
    약 11분

    Tailwind CSS 4.0의 CSS 기반 설정, 자동 콘텐츠 감지, Vite 통합을 살펴봅니다. 테마 변수와 동적 유틸리티, 컨테이너 쿼리 등 새 기능을 코드 예제로 정리합니다.

  • npm의 --force와 --legacy-peer-deps는 어떻게 다를까요?
    약 7분

    npm의 peer dependency 충돌에서 --force와 --legacy-peer-deps가 각각 무엇을 허용하거나 무시하는지 비교합니다. 설치 성공이 실제 호환성을 보장하지 않는 이유도 설명합니다.

  • shadcn/ui 핵심 개념과 아키텍처 이해하기
    약 16분

    shadcn/ui가 컴포넌트 소스 코드를 프로젝트에 복사해 사용하는 방식을 살펴봅니다. 원문 예제를 바탕으로 컴포넌트 구조와 Tailwind CSS 스타일링을 설명합니다.

  • TypeScript는 JSX를 어떻게 변환할까요?
    약 5분

    tsconfig의 다섯 가지 jsx 옵션과 각각의 변환 결과를 비교합니다. React.createElement를 호출하는 방식과 React 17에서 도입된 자동 JSX 런타임의 차이를 설명합니다.

  • Vuex로 전역 상태와 스토어 모듈 관리하기
    약 8분

    Vuex로 전역 상태를 읽고 변경하는 방법을 예제로 설명합니다. 스토어를 모듈과 네임스페이스로 나누며, 기존 Vue 프로젝트의 상태 관리 구조를 살펴봅니다.

문제 해결 사례(2)

배포 및 운영 전략(1)

서비스 개발 후기(6)

소프트웨어 설계 및 이론(9)

  • 테넌트와 테넌시란 무엇일까요?
    약 13분

    테넌트와 테넌시의 뜻부터 싱글테넌시·멀티테넌시의 차이까지 설명합니다. 문서 협업 서비스를 예로 자원 공유, 데이터 격리, 권한과 DB 분리 방식을 살펴봅니다.

  • 메시지 큐, 큐와 로그부터 순서 보장까지
    약 10분

    메시지를 처리한 뒤 삭제하는 큐와 기록을 보관하는 로그의 차이를 설명합니다. 중복 전달과 멱등성, 순서 보장, 처리 지연을 기준으로 메시지 큐를 비교합니다.

  • 이 응답은 누구 것인가요?
    약 12분

    SSE·WebSocket·postMessage에서 요청과 응답을 상관키로 연결하는 방법을 설명합니다. 요청을 하나씩 처리하는 큐의 한계와 타임아웃·지연 응답 문제를 실행 예제로 확인합니다.

  • 그 로직은 어디에 살아야 할까요?
    약 4분

    검증과 권한 로직을 모델·서비스·컨트롤러 중 어디에 둘지 살펴봅니다. rich·anemic 도메인 모델을 비교하고, 도메인 서비스와 애플리케이션 서비스의 책임을 구분합니다.

  • DB 조회는 왜 아웃바운드일까요?
    약 4분

    호출 방향을 기준으로 인바운드·아웃바운드 어댑터를 구분합니다. 이벤트 리스너와 fetch, props 콜백을 예로 호출 방향과 코드 의존성의 차이를 설명합니다.

  • 도메인 모델은 왜 DB를 몰라야 할까요?
    약 7분

    헥사고날 아키텍처에서 도메인 모델을 DB와 프레임워크로부터 분리하는 이유를 설명합니다. React에 비유해 포트·어댑터를 이해하고, 코드 의존성을 제한하는 방법을 살펴봅니다.

  • ETL이란 무엇인가요? 데이터를 옮기는 세 단계
    약 8분

    데이터 마이그레이션 경험에서 출발해 ETL의 추출·변환·적재 단계와 검증, 실패 후 재실행, ELT와의 차이를 정리합니다.

  • 타입스크립트로 잘못된 상태 막기
    약 14분

    TypeScript의 태그 유니온과 브랜디드 타입으로 잘못된 상태를 줄이는 방법을 설명합니다. 입력 검증 결과를 타입에 담는 설계와 적용 범위를 예제로 살펴봅니다.

  • 응집도와 결합도로 살펴보는 프론트엔드 코드 설계
    약 11분

    응집도와 결합도의 종류를 구분하고, 프론트엔드 컴포넌트와 모듈 설계에 적용해봅니다. 상태 관리·의존성 주입·이벤트 버스가 코드 간 의존 관계에 미치는 영향을 예제로 살펴봅니다.

업계 동향 및 신기술(1)

컴퓨팅 배경 지식(3)

  • '한'은 한 글자일까요?
    약 12분

    유니코드 정규화로 문자열을 비교하고, 길이를 세는 단위에 따라 결과가 달라지는 이유를 설명합니다. 한글과 이모지 예제, IME 조합 중 입력 처리도 다룹니다.

  • 브라우저는 뒤로가기를 어떻게 기억할까요?
    약 11분

    브라우저가 방문 기록을 추가·교체하고 이전 기록으로 이동하는 방식을 설명합니다. SPA 라우터가 그 기록을 화면으로 복원하는 과정도 살펴봅니다.

  • '오후 3시'는 언제인가요?
    약 13분

    절대시각과 지역 시각, 기간을 구분합니다. UTC와 오프셋, 타임존이 맡는 역할과 시간대 규칙을 담은 IANA tzdb를 살펴봅니다.

코딩테스트(2)

  • 행렬의 기본 연산과 곱셈 코딩 테스트
    약 7분

    행렬의 종류와 전치, 덧셈·뺄셈·곱셈의 규칙을 정리합니다. 행렬 곱셈이 가능한 조건을 확인하고, JavaScript로 코딩 테스트 문제를 풀어봅니다.

  • 로컬에서 LeetCode 테스트 환경 설정하기
    약 3분

    LeetCode의 JavaScript 풀이를 로컬에서 실행할 수 있도록 Node.js와 Jest를 설정합니다. 문제별 테스트 파일을 만들고, 코드가 바뀔 때 테스트를 다시 실행하는 방법을 다룹니다.

통신 및 네트워크 보안(4)

  • 내 도메인에서 보낸 이메일은 어떻게 진짜임을 증명할까
    약 11분

    블로그 구독 메일을 붙이며 살펴본 이메일 발신자 인증 구조입니다. SPF·DKIM과 From 주소를 연결하는 DMARC, 정책과 보고서, BIMI의 역할을 정리합니다.

  • 이 토큰은 누구를 위한 것인가요?
    약 26분

    세션과 OAuth·OIDC 기반의 웹 인증 구조를 살펴봅니다. 토큰을 누가 사용하고 어디에 보관하는지, PKCE와 BFF가 어떤 역할을 하는지 설명합니다.

  • 웹 보안, 신뢰 경계부터 CSP까지
    약 21분

    XSS가 발생하는 원인과 CSP로 스크립트 실행을 제한하는 방법을 설명합니다. nonce·hash와 Report-Only 설정, CORS·CSRF와의 차이를 정리합니다.

  • 왜 Authorization "Bearer"인가요?
    약 10분

    Authorization 헤더의 Bearer가 뜻하는 인증 방식과 JWT라는 토큰 형식의 차이를 설명합니다. Basic·Digest와 비교하고, Bearer 토큰 유출 시 생기는 위험을 짚습니다.

프로그래밍 언어(8)

API와 인터페이스(7)

  • 브라우저에서 실시간성을 어떻게 보장하나요?
    약 31분

    허용 지연과 통신 방향에 따라 폴링·SSE·WebSocket을 선택하고, 재연결과 상태 복구를 설계하는 방법을 설명합니다. 브라우저 백그라운드 실행의 한계도 다룹니다.

  • null은 비우기일까요, 건드리지 않기일까요?
    약 4분

    부분 수정 API에서 필드 생략과 null을 어떻게 해석할지 정리합니다. JSON Merge Patch와 JSON Patch를 비교하고, 수정할 필드를 지정하는 방식과 검증 예제를 다룹니다.

  • API 응답은 모델을 닮아야 할까요?
    약 4분

    API 응답과 도메인 모델을 분리할 때 얻는 이점과 매핑 비용을 비교합니다. 계층별 DTO 구성, 응답의 중첩 구조, 인터페이스로 필드 누락을 줄이는 방법을 다룹니다.

  • 이 API는 누가 부르나요?
    약 4분

    호출자에 따라 API를 퍼블릭·오퍼레이션·인터널로 구분하는 설계 사례를 살펴봅니다. 각 API의 권한 처리와 도메인 간 호출에서 책임을 나누는 기준을 설명합니다.

  • 이 필드는 UTC여야 할까요?
    약 12분

    API에서 절대시각, 날짜, 지역 기준의 미래 일정을 어떻게 구분할지 살펴봅니다. 각 값의 의미에 맞는 DB 타입과 Temporal 사용법을 정리합니다.

  • Web Worker와 Service Worker는 어떻게 다를까요?
    약 18분

    Web Worker로 무거운 연산을 옮기고 작업과 취소를 관리하는 방법을 설명합니다. 탭 간 통신, Service Worker의 생명 주기, 캐시와 업데이트 설계도 함께 다룹니다.

  • DocumentFragment는 언제 쓰면 좋을까요?
    약 5분

    DocumentFragment로 여러 DOM 노드를 조립하고 문서에 삽입하는 방법을 설명합니다. 일반 요소를 사용하는 방식과 비교하고, 성능 측정 결과를 해석할 때의 주의점도 짚습니다.

UX/UI(2)

  • WAI-ARIA란 무엇인가요?
    약 12분

    WAI-ARIA의 역할·상태·속성을 폼, 모달, 아코디언, 탭 예제로 설명합니다. 네이티브 HTML을 우선하고, ARIA 속성과 실제 키보드 동작을 함께 구현해야 하는 이유를 다룹니다.

  • 프론트엔드 개발자라면 반드시 알아두어야 할 32가지의 UI 요소
    약 12분

    버튼·체크박스·탭 등 UI 요소 32개의 이름과 용도를 예시로 살펴봅니다. Maria de la Riva의 글을 번역하고, 개발자와 디자이너가 나누는 UI 용어를 정리했습니다.