전체 글(418)
-
[인증] Session-based와 Token-based
Session-based와 Token-based 인증의 차이는 주로 인증 데이터를 저장하고 관리하는 방식과 그에 따른 동작 차이에 있다. Session-based Authentication (세션 기반 인증) 동작 방식사용자가 로그인하면 서버는 사용자 정보를 기반으로 세션을 생성하고, 해당 세션 ID를 쿠키에 저장해 클라이언트에 전달이후 클라이언트는 요청마다 쿠키에 담긴 세션 ID를 서버에 전송서버는 세션 저장소에서 이 세션 ID를 확인해 사용자 정보를 인증특징세션 데이터는 서버에 저장되며, 클라이언트는 세션 ID만 보유서버가 상태(state)를 유지해야 함 (stateful)장점서버가 세션 데이터를 직접 관리하므로 보안이 상대적으로 강함세션 만료 등 세부 제어가 용이단점서버에 세션 저장소를 유지해야 하..
2024.11.27 -
react hooks의 등장으로 거의 대체된 render props 방식
Render Props는 리액트에서 컴포넌트 간에 코드 재사용을 쉽게 하기 위한 패턴이다. 주로 함수형 컴포넌트에서 사용되며, 컴포넌트의 props로 함수를 전달받아 렌더링 동작을 동적으로 정의할 수 있다. Render Props 기본 예제 function DataFetcher({ render }) { const data = { name: 'Alice', age: 25 }; // 가상의 데이터 return {render(data)};}function App() { return ( Name: {data.name}, Age: {data.age}} /> );}DataFetcher 컴포넌트는 render라는 prop으로 함수를 받는다.이 함수는 데이터를 렌더링할..
2024.11.26 -
iron-session과 next-auth
iron-session과 next-auth는 Next.js에서 사용자 인증을 구현하기 위해 사용할 수 있는 두 가지 라이브러리다. 하지만 각각의 목적과 사용 방식이 다르다. iron-session목적세션 기반 인증 및 데이터 저장주요 기능암호화된 세션 쿠키를 사용해 사용자 데이터를 안전하게 저장커스텀 인증 로직을 구현해야 함인증 플로우가 간단한 애플리케이션에 적합next-auth목적OAuth와 같은 다양한 인증 방법을 쉽게 통합주요 기능Google, Facebook, GitHub, Twitter 등의 소셜 로그인 지원데이터베이스 연동을 통한 사용자 정보 저장 및 관리서버 및 클라이언트에서 인증 상태를 쉽게 관리 가능복잡한 인증 요구사항이 있는 애플리케이션에 적합
2024.11.25 -
pseudo class와 pseudo element
pseudo class (:pseudo-class) 특정 상태의 요소를 선택할 때 사용한다. 요소 자체는 변하지 않지만, 조건에 따라 스타일을 적용한다. 사용 예:hover사용자가 마우스를 올렸을 때:nth-child(n)특정 위치의 자식을 선택:focus요소가 포커스를 받을 때 a:hover { color: red;}링크에 마우스를 올렸을 때 텍스트 색이 빨간색으로 바뀐다. pseudo element (::pseudo-element) HTML 요소의 특정 부분을 선택하거나 가상의 요소를 만들어 스타일링할 때 사용한다. 실제 DOM 요소에 영향을 주지 않고 특정 부분만 스타일 적용한다. 사용 예::before요소의 시작 부분에 가상의 콘텐츠 추가::after요소의 끝부분에 가상의 콘텐츠 추가::fir..
2024.11.24 -
IntersectionObserver
IntersectionObserver는 자바스크립트 API로, DOM 요소가 뷰포트나 특정 부모 요소와 교차(intersect)하는 시점을 비동기적으로 관찰할 수 있게 해준다. 따라서 주로 lazy loading, 무한 스크롤, 요소 노출 감지 등에 활용된다. 주요 특징 성능 최적화 : 스크롤 이벤트를 직접 사용하는 방식보다 효율적이며, 브라우저 성능에 미치는 영향을 최소화한다.비동기적 처리 : 교차 상태를 감지하는 콜백이 비동기로 실행된다.다양한 관찰 옵션 : threshold, root, rootMargin 등 다양한 조건을 설정할 수 있다. 구성 1. IntersectionObserver 생성const observer = new IntersectionObserver(callback, options)..
2024.11.23 -
n+1 문제
n+1 문제는 데이터베이스 쿼리 최적화와 관련된 성능 문제로, 주로 ORM(Object Relational Mapping) 프레임워크에서 발생한다. 간단히 말하면, 한 번에 해결할 수 있는 작업을 불필요하게 여러 번 쿼리하는 문제다. 기본 개념 n+1 쿼리는 특정 객체를 가져오고 관련된 객체를 로드할 때, 1개의 메인 쿼리로 상위 데이터를 가져온 후,n개의 추가 쿼리로 관련 데이터를 각각 개별적으로 가져오는 경우를 말한다.이로 인해 필요 이상으로 많은 데이터베이스 호출이 발생하게 되고, 성능 저하를 초래한다. 예제 게시글과 댓글이 1:N 관계에 있다고 가정하자. 그리고 게시글 리스트를 조회하면서 각 게시글에 달린 댓글도 가져오려는 경우를 생각해보자. 이때 n+1 쿼리가 발생할 수 있다.-- 1개의 메인 ..
2024.11.22 -
Nextjs와 기본 인증 (accessToken, refreshToken)
1. 인증 API 관리 클래스 설계class ApiClient { constructor(baseURL) { this.baseURL = baseURL; } // 기본 API 요청 메서드 async request(endpoint, options = {}) { const url = `${this.baseURL}${endpoint}`; const response = await fetch(url, { ...options, credentials: 'include', // 쿠키 포함 }); if (response.status === 401) { // AccessToken 만료: RefreshToken으로 갱신 시도 const refreshed = ..
2024.11.21 -
타입스크립트 as와 satisfies 비교
특징as 단언 (assertion)satisfies 연산자초과 프로퍼티 검사무시함검사함타입 강제성강제로 타입을 변경하며, 이는 개발자가 책임짐애초에 타입에 엄격하게 부합해야 함런타임 영향없음주요 용도임시적으로 타입 단언이 필요할 때정밀한 타입 체크 및 코드 안정성 확보 예를 들어, 아래 코드는 validPerson이라는 객체가 Person 타입을 만족하는지 검사하는 용도로 쓰인다.type Person = { name: string; age: number };const validPerson = { name: "철수", age: 30, job: "Developer",} satisfies Person; // 에러 - 'job'은 타입에 정의되지 않은 속성 satisfies가 없었다면(4.9버전 미만), ..
2024.11.20 -
디자인 패턴의 필요성
소프트웨어 개발에서 디자인 패턴은 단순한 코딩 기법을 넘어, 문제 해결의 프레임워크를 제공한다. 즉 코드의 품질을 높이고 유지보수를 쉽게 하기 위해 사용되며, 선배 개발자들이 맞닥뜨렸던 반복적인 문제들을 해결하기 위한 모범 답안을 모아놓은 것이다. 디자인 패턴을 적용하면 다음과 같은 이점이 있다. 코드의 가독성 향상 코드 또한 하나의 문서이기 때문에, 다른 사람이 읽기 쉽도록 작성되어야 한다. 디자인 패턴은 널리 알려진 구조와 이름을 제공하여 코드의 의도를 더 쉽게 이해할 수 있게 한다. 예를 들면,싱글톤(Singleton) 패턴을 사용하면 "이 객체는 시스템 전체에서 하나만 존재해야 한다"는 의도를 바로 파악할 수 있다.옵저버(Observer) 패턴은 "이벤트 기반 시스템에서 데이터를 업데이트한다"는..
2024.11.19 -
React로 타이머 hooks 간단히 개발하기
import React, { useRef, useState } from 'react';export const useTimer = () => { const [time, setTime] = useState(0); const [isRunning, setIsRunning] = useState(false); const intervalRef = useRef(); const startTimer = () => { if (!isRunning) { setIsRunning(true); intervalRef.current = setInterval(() => { setTime(prevTime => prevTime + 1); }, 1000); } }; const..
2024.11.18 -
AWS CloudFront
AWS CloudFront는 CDN 서비스로, 전세계에 분산된 서버 네트워크를 통해 콘텐츠(웹페이지, 이미지, 동영상 등)를 사용자에게 빠르고 안전하게 전달한다. 주요 기능 1. 콘텐츠 캐싱 및 빠른 전송전 세계에 위치한 엣지 로케이션(Edge Location)을 통해 사용자와 가장 가까운 서버에서 콘텐츠를 제공하여 지연 시간을 줄이고 속도를 높인다. 2. 보안 강화AWS Shield와 통합되어 DDoS(분산 서비스 거부) 공격을 방어한다.HTTPS를 지원하여 데이터를 안전하게 전송한다.WAF(Web Application Firewall)와 통합 가능하여 애플리케이션 보안을 강화한다. 3. 탄력적인 스케일링트래픽이 갑자기 증가하더라도 탄력적으로 확장하여 안정적인 콘텐츠 제공이 가능하다. 4. 비용 효..
2024.11.17 -
placeholder-shown이 안먹는 경우
css에서는 placeholder-shown을 통해 자바스크립트 없이도 스타일을 분기처리 할 수 있다. 하지만 그게 안된다면 placeholder props가 input에 전달 안된 것은 아닌지 점검해보자
2024.11.16 -
Webpack 사용 이유
하나의 HTML 문서를 구성하는 콘텐츠는 다양합니다.단순한 마크업 텍스트 뿐만 아니라, css와 폰트 그리고 이미지가 가득합니다.그런데 현대 웹은 더이상 단순한 “페이지”가 아닙니다.콘텐츠가 많은 만큼 사용자 경험을 개선하기 위해 비동기 처리를 하고, 상태를 빠르게 업데이트를 해야 하기 때문입니다.코드가 점점 복잡해지는 문제를 해결하기 위해, 프론트엔드는 공통되는 로직을 추상화하고 분리하는 사고를 코드에 적용하게 되었습니다.즉 모듈화한 것이죠.이는 재사용성을 추구하는 개발자의 입장에서 매우 편리한 해결 방법입니다.하지만 이렇게 많아진 파일을 HTML의 나 를 작성해서 일일이 받아오기에는 문제가 많습니다.css나 js 파일 간 의존성(import)이 있다면 로드 순서를 보장하기 어렵습니다.브라우저는 각 파..
2024.11.15 -
디바운스와 쓰로틀링
디바운스(Debounce)와 쓰로틀링(Throttling)은 웹 개발에서 이벤트 처리를 최적화하기 위해 사용되는 두 가지 기법이다. 이들은 연속적으로 발생하는 이벤트를 효율적으로 관리하여 성능을 향상시키는 데 도움을 준다. 디바운스(Debounce) 디바운스는 연속적으로 발생하는 이벤트 중 마지막 이벤트만을 처리하는 기법이다. 즉, 일정 시간 동안 이벤트가 발생하지 않을 때까지 대기한 후, 마지막에 발생한 이벤트를 실행한다. 이는 사용자가 입력을 멈춘 후에만 처리를 수행하므로, 불필요한 연산을 줄일 수 있다. 사용 사례검색 자동완성 : 사용자가 입력을 멈춘 후에만 서버에 요청을 보내어 검색 결과를 가져온다.창 크기 조절 : 사용자가 창 크기 조절을 멈춘 후에 레이아웃을 재계산한다. 쓰로틀링(Throttl..
2024.11.14 -
pnpm 모노레포 구성하기
Next.js 15와 TypeScript를 사용하고, 패키지 매니저로 pnpm을 활용하여 모노레포를 구성해보자. 보통 이러한 설정은 여러 사이트를 포함하는 apps 폴더와 디자인 시스템 등을 담는 packages 폴더로 구성한다. 1. 프로젝트 초기화 및 pnpm 설치 먼저, 프로젝트 루트를 생성하고 pnpm을 설치한다.mkdir my-monorepocd my-monoreponpm install -g pnpmpnpm init 2. pnpm 워크스페이스 설정 루트에 pnpm-workspace.yaml 파일을 만들고, apps와 packages 폴더를 워크스페이스로 지정한다.packages: - 'apps/**' - 'packages/**' 3. 디렉토리 구조 설정 apps와 packages 폴더..
2024.11.13