eunbi's blog

Next.js 성능 최적화

프론트엔드 성능 최적화는 웹 애플리케이션의 로딩 속도, 반응성, 사용자 경험(UX)을 개선하는 핵심 요소이다. 이번 글에서는 실제 프로젝트에서 적용한 프론트엔드 성능 최적화 기법을 정리한다. 1. 이미지 최적화 📌 웹사이트의 성능 저하 원인 중 하나는 크기가 큰 이미지 고해상도 이미지는 로드 속도를 늦추고 네트워크 비용을 증가 최적...

Zustand 상태 관리 라이브러리 활용법

Zustand는 가볍고 사용하기 쉬운 상태 관리 라이브러리이다. Redux와 같은 다른 상태 관리 라이브러리보다 보일러플레이트 코드가 적고, 직관적인 API를 제공하기 때문에 러닝커브가 낮아 빠르게 적용할 수 있다. 특히 React 애플리케이션에서 전역 상태를 효율적으로 관리할 수 있으며, 상태 변경이 필요한 컴포넌트만 리렌더링되도록 최적화되어 있다....

NextAuth5를 사용하여 Next.js15 인증시스템 구축하기

NextAuth를 활용한 인증 시스템 구현하기 NextAuth는 Next.js 애플리케이션에서 인증 기능을 쉽게 구현할 수 있게 해주는 강력한 라이브러리입니다. 이번 포스트에서는 NextAuth를 사용하여 이메일 기반의 인증 시스템을 구축하는 방법을 상세히 알아보겠습니다. 1. 필요한 패키지 설치하기 npm install next-auth @a...

Next.js에서 bfcache(Back-Forward Cache) 문제 해결하기

bfcache(Back-Forward Cache)는 사용자가 브라우저의 “뒤로 가기” 또는 “앞으로 가기” 버튼을 눌렀을 때, 페이지를 다시 로드하지 않고 이전 상태 그대로 복원하는 브라우저 기능이다. 하지만 Next.js의 기본 캐싱 전략은 이 기능과 충돌하여, 페이지를 다시 불러오는 문제가 발생할 수 있다. 이번 글에서는 Next.js에서 bfc...

쿠키(Cookie), 세션(Session), 토큰(Token)의 정의와 차이점

쿠키(Cookie), 세션(Session), 토큰(Token)은 웹 애플리케이션에서 사용자 인증과 상태 관리를 위해 사용되는 기술로, 각각의 특징과 사용 방식에서 차이가 있다. 1. 쿠키 (Cookie) 정의: 쿠키는 웹 브라우저에 저장되는 작은 데이터 파일이다. 서버에서 클라이언트로 보내지고, 클라이언트는 이를 다시 서버에 보내면서 상태...

WebSocket - 실시간 통신을 위한 프로토콜

1. WebSocket이란? WebSocket은 클라이언트와 서버 간의 양방향, 지속적 연결을 지원하는 프로토콜이다. HTTP 요청-응답 방식과 달리 WebSocket은 연결이 한 번 성립되면 서버와 클라이언트가 실시간으로 데이터를 주고받을 수 있는 통신 채널을 유지한다. 주로 채팅, 실시간 알림, 스트리밍 서비스 등 실시간성이 중요한 애플리케이...

Jest - 테스트 프레임워크로 테스트 자동화를 쉽게 구현하기

1. Jest란? Jest는 JavaScript 애플리케이션을 테스트하기 위한 강력하고 사용하기 쉬운 테스트 프레임워크이다. Facebook에서 개발했으며, React와 같은 라이브러리뿐만 아니라 일반 JavaScript 프로젝트에서도 사용된다. Jest는 테스트 작성, 실행, 디버깅을 간소화하며 단위 테스트(Unit Testing), 통합 테스...

Docker - 컨테이너 기반 애플리케이션 배포 및 실행 플랫폼

1. Docker란? Docker는 애플리케이션을 실행하기 위한 컨테이너(Container)를 생성, 배포, 관리할 수 있는 오픈 소스 플랫폼이다. 컨테이너는 애플리케이션과 그에 필요한 모든 라이브러리, 종속성을 하나의 패키지로 묶어 제공하며, 개발 환경과 운영 환경 간의 차이를 최소화한다. Docker를 사용하면 소프트웨어가 어디에서나(로컬 개...

Prisma와 PostgreSQL을 활용한 ORM 환경 구축 - Docker와 Railway를 이용한 배포 가이드

1. Prisma와 PostgreSQL Prisma는 현대적인 ORM으로, 데이터베이스와 애플리케이션 간의 상호작용을 쉽게 만들어주는 도구이다. 일반적인 ORM과 달리 타입 안전성과 개발자 경험에 초점을 맞추어, 더 효율적이고 오류를 줄이는 코드를 작성할 수 있게 돕는다. ORM(Object-Relational Mapping): 객체 지향 프...

깊이 우선 탐색(DFS) (2) - 여행경로

여행 경로 주어진 항공권을 모두 사용하여 ICN에서 출발하는 여행 경로를 찾는 문제 알파벳 순서가 앞서는 경로를 우선적으로 선택하고, 모든 항공권이 사용되어야 하며 모든 도시를 방문할 수 없는 경우는 없다. 풀이 전략 그래프 생성 항공권 정보를 바탕으로 인접 리스트 형태의 그래프를 생성한다. 각 공항에서 갈 수 있는 ...

너비 우선 탐색(BFS) (2) - 아이템 줍기 / 퍼즐조각 채우기

아이템 줍기 캐릭터의 초기 위치와 아이템의 위치가 주어질 때, 다각형의 테두리를 따라 이동해야 하며 가장 짧은 거리를 구하는 문제 여러 직사각형으로 이루어진 다각형 테두리(둘레)를 따라 캐릭터가 아이템까지 이동한다. 풀이 전략 좌표 확장 및 테두리 정의좌표를 2배 또는 2배 이상 확장하여 정밀도를 높인다. 이렇게 하면 테두리와 내부를 ...

완전 탐색(Brute Force) - 최소직사각형 / 모의고사

최소직사각형 완전 탐색이나 최적화 로직을 통해 모든 명함을 수납할 수 있는 최소 크기의 지갑을 계산하는 문제 명함을 적절히 회전하여 모든 명함의 긴 변이 하나로 정렬되도록 하면 문제를 간단히 해결할 수 있다. 풀이 전략 명함 회전 처리 각 명함의 가로 길이(w)와 세로 길이(h)를 비교하여, 더 긴 변이 가로가 되도...

힙(Heap) - 더 맵게 / 디스크 컨트롤러 / 이중우선순위큐

더 맵게 모든 음식이 K 이상이 될 때까지 섞어야 하는 최소 횟수를 구하는 문제 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 두 개의 가장 낮은 스코빌 지수를 섞는 과정을 반복한다. 각 섞는 과정은 다음과 같다: 새로운 스코빌 지수 = (가장 낮은 스코빌 지수) + (두 번째로 낮은 스코빌 지수 * 2) 풀이 전략 우선...

해시(Hash) - 폰켓몬/마라톤/전화번호 목록/의상/베스트 앨범

1. 폰켓몬 최대 N/2 마리의 폰켓몬을 선택하면서, 폰켓몬 종류의 최대 개수를 구하는 문제 풀이 전략 중복을 제거한 폰켓몬 종류의 개수를 구한다. (set을 사용하여 중복 제거). 가능한 최대 폰켓몬 종류 수는 N/2입니다. 즉, nums에서 고를 수 있는 폰켓몬의 종류는 N/2마리입니다. 하지만 폰켓몬의 종류가 N/2보다 적으면 그 ...

탐욕법(Greedy Algorithm)에 대해 알아보기

★ 탐욕법(Greedy Algorithm) 최적의 선택을 위한 알고리즘 탐욕법(Greedy Algorithm)은 현재 상황에서 가장 좋아 보이는 선택을 반복적으로 수행하여 문제를 해결하는 알고리즘 설계 기법이다. 탐욕법은 최적해를 보장하기 위해 문제 자체가 특정 조건(탐욕적 선택 속성, 최적 부분 구조)을 만족해야 한다. 탐욕법의 핵심 개념...

Socket을 사용한 Read-Time 채팅 구현하기 - (3) 채팅 메시지 컴포넌트 구현하기

📢 Socket을 사용한 Real-Time 채팅 구현하기 - (3) 채팅 메시지 컴포넌트 구현하기 이전 글에서 했던 작업 (1) Socket IO 초기 세팅 (2) 채팅 입력창 및 메시지 전송 API 구현 이번 글에서는 실제로 채팅 메시지들을 렌더링하는 컴포넌트를 구현한다. 메시지를 불러올 때 페이징을 적용하여 성...

Socket을 사용한 Read-Time 채팅 구현하기 - (2) Socket으로 채팅 구현하기

2️⃣ Socket으로 채팅 구현하기 이번 글에서는 Socket.IO를 활용한 실시간 채팅에서 메시지를 입력하고 서버로 전송하는 과정을 다룬다. 이전 글에서 Socket.IO를 초기 설정했으므로, 이제 실제 채팅 기능을 구현해보자. 1️⃣ Chat Input 컴포넌트 구현 Socket을 활용한 채팅 애플리케이션의 메시지를 입력받는 컴포넌트를 구현...

Socket을 사용한 Read-Time 채팅 구현하기 - (1) Socket IO 초기 세팅

👩‍💻 Socket을 사용한 Real-Time 채팅 구현하기 실시간 채팅을 구현하기 위해서는 WebSocket을 활용해야 하며, 이를 보다 쉽게 다룰 수 있도록 해주는 라이브러리가 Socket.IO이다. 이번 글에서는 Next.js에서 Socket.IO를 활용하여 실시간 채팅을 구축하는 초기 설정 방법을 다룬다. 1️⃣ Socket.IO 초기 ...