전체 글 54

스크롤 기반 싱글 페이지 라우팅 구현하기

포트폴리오 페이지를 만들려는데, 스크롤 기반으로 동작되도록 하고 싶었다.일단 필요한 기능은1. 스크롤 시 경로 변경2. 메뉴 클릭 시 해당 섹션으로 이동3. 특정 페이지(메인, 마지막)에선 메뉴 숨김const mainRef = useRef(null); // 타입 명시const aboutMeRef = useRef(null);const projectRef = useRef(null);const experienceRef = useRef(null);const contactRef = useRef(null);useRef로 각 세션의 DOM을 저장한다.이걸 이용해서 scrollntoView()로 해당 섹션으로 스크롤 하거나, IntersectionObserver로 감시할 수 있다.useRef리액트 컴포넌트에서 DOM ..

개발/프로젝트 2025.04.04

[프로그래머스] 수열과 구간 쿼리 2, 3, 4

수열과 구간 쿼리 2- 정수 배열 arr와 2차원 정수 배열 queries가 주어짐.- queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴- 각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]을 찾음- 각 쿼리의 순서에 맞게 답을 저장한 배열 반환 (단, 특정 쿼리의 답이 존재하지 않으면 -1 저장)우선 arr 배열을 s ≤ i ≤ e과 i > k로 필터링을 한다.그 후 필터링 된 배열에서 가장 작은 수를 Math.min() 메소드로 찾으면 됨. (없으면 -1)function solution(arr, queries) { const answer = []; for (const [s, e, k] of queries) { //..

개발/알고리즘 2025.04.03

멋쟁이사자처럼 13기 최종 합격 후기

1년의 휴학 후 복학과 함께 멋쟁이사자처럼 13기에 지원했다.사실 면접 일정 때 여행이 예정되어 있어서 거의 포기하고 있었는데, 면접 스케줄을 조정해주신다고 하셔서 냉큼 지원!!서류1. 다양한 IT동아리 중에서 멋쟁이사자처럼 대학 13기를 선택하고 지원하시게 된 이유를 작성해주세요. (500자 이내)저학년 때부터 이미 멋사를 알고 있었기 때문에, 비전공자를 위한 동아리라는 점과 해커톤 말고도 아이디어톤이 있어서 사용자를 위한 서비스를 직접 기획까지 할 수 있는 동아리라는 점에서 멋쟁이사자처럼에 지원하게 됐다고 썼다.2-2. 위의 파트를 선택한 이유와 관련 경험을 해본 적이 있는지, 그리고 이 파트에 지원하기 위해 과거 또는 현재에 노력하고 있는 것이 있는지 작성해주세요. (500자 이내)프론트엔드 파트로..

대외활동 2025.03.23

[리팩토링] 새로고침 해도 검색 결과가 남아있도록 하기

// 검색 버튼 클릭 시 실행const searchHandler = () => { if (!selectedProvider) globalSearch("전체", selectedTag, selectedTerm); else globalSearch(selectedProvider, selectedTag, selectedTerm); // 통합 검색의 경우 통합 검색 페이지로 이동 if (type === "header") { router.push(`/global-search`); }};기존에는 배급사와 입력한 태그, 입력한 검색어를 바탕으로 globalSearch를 호출해서 검색 API를 호출했었다.이렇게 호출해서 스토어에 검색어들도 저장해놓고, 이걸 다시 불러와서 검색창에 적용해놨..

개발/프로젝트 2025.02.28

Zustand로 API 호출 및 상태 관리하기

Zustand를 사용해서 웹툰 관련 상태와 API 호출 함수들을 관리하는 스토어인 WebtoonStore.ts를 작성해 보았다.Zustand는 React 애플리케이션에서 전역 상태 관리를 쉽게 할 수 있도록 도와주는 경량 라이브러리이다. import { create } from "zustand"; interface WebtoonState { webtoons: WebtoonData[]; // 웹툰 목록 tagList: Tag[]; // 태그 목록 selectedProvider: string; // 배급사 selectedTag: string; // 검색 태그 selectedTerm: string; // 검색어 selectedTagIds: number[]; // 선택한 태그 selectedTags..

개발/프로젝트 2025.02.28

Tailwind CSS + SCSS로 반응형 구현하기

기존 Tailwind CSS를 사용하고 있었고, 모바일뷰, 태블릿뷰, 데스크탑뷰 이렇게 3개의 반응형을 구현해야 했다.멘토님께서 BP가 많아서 복잡해질 가능성이 있다고, 아예 뷰마다 컴포넌트를 분리하라고 하셨는데제대로 된 방법을 몰라서 그런지 코드 중복이 너무 많아졌고, 유지보수에도 문제가 있을 것 같았다.그래서 또 알려주신 방법이, Tailwind CSS와 SCSS를 함께 사용하는 것!return ( {/* 인기 웹툰 */} 인기 웹툰 {breakpoint === "mobile" ? ( {popularDa..

개발/프로젝트 2025.02.25

Material UI를 사용하여 페이지네이션 구현하기

이번에는 MUI의 Pagination 컴포넌트를 사용해서 페이지네이션을 구현해 보았다.ThemeProvider를 통해 스타일도 커스텀해 보았다.  React Pagination component - Material UIThe Pagination component enables the user to select a specific page from a range of pages.mui.com↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ 참고했던 것  // theme.tsimport { createTheme } from "@mui/material/styles";const theme = createTheme({ breakpoints: { values: { xs: 0, // 모바일 sm: 60..

개발/프로젝트 2025.02.13

Swiper.js 라이브러리를 사용해서 슬라이더 구현하기 (Next.js + React)

Swiper.js 라이브러리를 사용해서 반응형 슬라이더를 구현해 보았다.Swiper는 브라우저에서만 동작하는 라이브러리라서, 'use client'를 선언하여 클라이언트 컴포넌트로 지정해야 사용이 가능했다.// Swipers.tsx"use client";import React, { ReactNode } from "react";import { Swiper, SwiperSlide } from "swiper/react";import { Pagination, Navigation, Autoplay } from "swiper/modules";import "swiper/css";import "swiper/css/navigation";import "swiper/css/pagination";interface Swiper..

개발/프로젝트 2025.02.13

[트러블 슈팅] 자동 로그인 트러블 슈팅

자동 로그인 구현하기현재 로그인 시 액세스 토큰과 리프레시 토큰을 받아 쿠키에 저장 중이다.액세스 토큰은 유효기간이 1시간이며, 리프레시 토큰은 7일이다.그래서 자동 로그인 시, 액세스 토큰이 만료됐을 때 리xuwon.tistory.com분명 이때까지만 해도 자동 로그인 작동도 잘 됐고... 그런데... 문제가 여러 개 생겨버렸다.그래서 트러블 슈팅 블로그 작성 가능하게 됐으니 럭키비키라고 생각하며 기쁜 마음으로 블로그를 적어보려 한다. 첫 번째쿠키 관련 이슈액세스 토큰 만료 시 쿠키 실시간 업데이트 X 원래 페이지 이동 시에 토큰을 확인하고, 자동 로그인 활성화일 땐 액세스 토큰을 재발급 받아서 로그인을 유지하도록 했는데,페이지 이동 시에 다시 확인하고 발급받는 과정을 거치다 보니, 만료 후 로그인 전..

자동 로그인 구현하기

현재 로그인 시 액세스 토큰과 리프레시 토큰을 받아 쿠키에 저장 중이다.액세스 토큰은 유효기간이 1시간이며, 리프레시 토큰은 7일이다.그래서 자동 로그인 시, 액세스 토큰이 만료됐을 때 리프레시 토큰으로 재발급을 받아서 다시 쿠키에 넣어주어야 한다.우선 로그인 상태를 확인하는 함수를 만들어 주었다.import { destroyCookie, setCookie } from 'nookies';import { clearUser } from '@/store/userSlice';import { useDispatch } from 'react-redux';import { useAccessTokenRefreshMutation } from '@/api/userApi';// 로그인 상태 확인 함수export const us..

개발/프로젝트 2025.01.12